AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Paint-Messages abfangen

Ein Thema von n0b0dy · begonnen am 25. Sep 2005 · letzter Beitrag vom 27. Sep 2005
Antwort Antwort
Seite 1 von 3  1 23      
n0b0dy

Registriert seit: 12. Sep 2005
Ort: Hessen
268 Beiträge
 
#1

Paint-Messages abfangen

  Alt 25. Sep 2005, 23:08
hi ihr alle ,

hab mal ne frage:
undzwar wie kann ich die paint-messages von dialogen abfangen? (weiß nicht ob ich das so richtig ausgedrück habe^^)
also ich will eigentlich das design von zB einem OpenDialog verändern....

deshalb müsste ich irgendwie an diese "drankommen". müsste irgendwie auf die form der dialoge zugreifen können. hat jemand ne idee wie ich das anstellen kann?


MfG
Gruß Fabi
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: Paint-Messages abfangen

  Alt 25. Sep 2005, 23:55
Ja man kann diese Nachrichten abfangen aber die GDI ist nicht multithreadfähig.

Man kann aber mit einem MSDN-Library durchsuchenOFNHookProc, anzugeben in der MSDN-Library durchsuchenOPENFILENAME-Struktur, die gewünschte Funktionalität erreichen!
  Mit Zitat antworten Zitat
n0b0dy

Registriert seit: 12. Sep 2005
Ort: Hessen
268 Beiträge
 
#3

Re: Paint-Messages abfangen

  Alt 26. Sep 2005, 00:11
hm,
hört sich sehr kompliziert an

irgendwie finde ich nicht so recht nen ansatz. kann mir jemand dabei helfen?
also sagen wir einfach mal ich möchte die farbe von einem OpenDialog ändern. Wie mache ich das dann?


MfG
Gruß Fabi
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Paint-Messages abfangen

  Alt 26. Sep 2005, 08:27
Du nimmst das Handle vom Dialog und schickst an dieses eine entsprechende Nachricht. Welche das ist weiß ich jetzt aus dem Kopf nicht, aber das sollte sich ja innerhalb von 10 Minuten in der OH finden lassen.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: Paint-Messages abfangen

  Alt 26. Sep 2005, 08:45
Gut gemeint, aber leider Quatsch. Man schickt dem Dialog zu diesem Behufe keine Nachricht, sondern man verarbeitet eine bestimmte Nachricht. Ich versuche nachher schnell was hinzuhacken.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#6

Re: Paint-Messages abfangen

  Alt 26. Sep 2005, 10:37
Delphi-Quellcode:
function OFNHookProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
var
  col: COLORREF;
  brush: HBRUSH;
begin
  Writeln('OFNHookProc');
  brush := GetProp(Wnd, 'brush');
  case Msg of
  WM_CTLCOLORDLG:
  begin
    Writeln('WM_CTLCOLORDLG');
    col := RGB($ff, 0, 0);
    SetBkColor(wParam, col);
    SetBkMode(wParam, TRANSPARENT);
    if(brush <> 0)then
      DeleteObject(brush);
    brush := CreateSolidBrush(col);
    SetProp(Wnd, 'brush', brush);
    Result := brush;
  end;
  WM_CLOSE:
  begin
    if(brush <> 0) then
      DeleteObject(brush);
  end;
  else
    Result := ord(False);
  end;
end;

var
  ofn: tagOFNA;
  Buffer: array[0..MAX_PATH] of Char;
begin
  AllocConsole();
  ZeroMemory(@ofn, sizeof(ofn));
  ofn.lStructSize := sizeof(ofn);
  ofn.hWndOwner := GetDesktopWindow();
  ofn.hInstance := hInstance;
  ofn.lpstrFilter := 'Textfiles'#0'*.txt'#0'Rich Text Documents'#0'*.rtf'#0#0;
  ofn.lpstrFile := @Buffer;
  ofn.nMaxFile := sizeof(Buffer) div sizeof(Char);
  ofn.Flags := OFN_ENABLEHOOK or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
  ofn.lpfnHook := @OFNHookProc;
  GetOpenFileName(ofn);
end.
  Mit Zitat antworten Zitat
n0b0dy

Registriert seit: 12. Sep 2005
Ort: Hessen
268 Beiträge
 
#7

Re: Paint-Messages abfangen

  Alt 26. Sep 2005, 10:57
hui, also danke erstmal, aber kann damit leider nichts anfangen

was ist denn "tagOFNA;"? kann mit der OH die zugehörige unit nicht finden
Gruß Fabi
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#8

Re: Paint-Messages abfangen

  Alt 26. Sep 2005, 11:05
Zitat von n0b0dy:
undzwar wie kann ich die paint-messages von dialogen abfangen? (weiß nicht ob ich das so richtig ausgedrück habe^^)
also ich will eigentlich das design von zB einem OpenDialog verändern....
Wenn du unbedingt mit der Klasse TOpenDialog weiter arbeiten willst, dann kannst du das per Subclassing machen.

Delphi-Quellcode:
var
  OldWndProc: TFNWndProc;
  NewWndProc: TFNWndProc;
  ParentHWnd: HWND;

// -------------------------------------------------------------------------------------------------

function ParentOpenDialogWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM)
  : LRESULT; stdcall;
begin

  if uMsg = WM_PAINT then
  begin
    // Hier dein Source Code
  end;

  CallWindowProc(OldWndProc, hWnd, uMsg, wParam, lParam);

end;

// -------------------------------------------------------------------------------------------------

procedure TForm1.OpenDialog1Show(Sender: TObject);
begin

  NewWndProc := @ParentOpenDialogWndProc;
  ParentHWnd := GetParent(OpenDialog1.Handle);
  OldWndProc := TFNWndProc(SetWindowLong(ParentHWnd, GWL_WNDPROC, Longint(NewWndProc)));

end;

// -------------------------------------------------------------------------------------------------

procedure TForm1.OpenDialog1Close(Sender: TObject);
begin

  SetWindowLong(ParentHWnd, GWL_WNDPROC, Longint(OldWndProc));

end;

// -------------------------------------------------------------------------------------------------
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: Paint-Messages abfangen

  Alt 26. Sep 2005, 11:35
Zitat von n0b0dy:
hui, also danke erstmal, aber kann damit leider nichts anfangen
CommDlg.pas eingebunden?

Das von mir gepostete Ding ist fast komplett. Da fehlt lediglich der Anfang (program Bla; uses Windows, Messages, CommDlg.
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#10

Re: Paint-Messages abfangen

  Alt 26. Sep 2005, 13:21
Das ganze ist ja schön und gut, hat aber einen kleinen Haken: Wenn man den Dialog im Explorer-Style haben möchte, kommt in der Hook-Procedure kein WM_CTLCOLORDLG an. Windows erzeugt dann nämlich den neuen Dialog als Child eines unsichtbaren Standard-Dialogs und die DialogProcedure des Standard-Dialogs bekommt die Nachricht. Man muss also irgendwie in die DialogProc des unsichtbaren Parents der neuen DialogBox gelangen, was nur auf sehr schmutzige Art geht:
Delphi-Quellcode:
// Hier merken wir uns die Adresse der alten DialogProc des Parents unseres Dialogs
Var oldDlgProc: Pointer;

// Diese DialogProc bearbeitet WM_CTLCOLORDLG
Function DialogProc(hdlg: HWND; uiMsg: UINT; wParam: WPARAM; lParam:LPARAM): UINT; stdcall;
Begin
 case uiMsg of
  WM_CTLCOLORDLG:
   Result := GetStockObject(WHITE_BRUSH); // zu Demozwecken
 else
  Result := CallWindowProc(oldDlgProc,hdlg,uiMsg,wParam,lParam);
 end;
End;

// Das ist unsere eigentliche Hook-DialogProcedure
Function OpenFileNameHook(hdlg: HWND; uiMsg: UINT; wParam: WPARAM; lParam:LPARAM): UINT; stdcall;
Var ofnParent: Integer;
Begin
 Result := 0;
 Case uiMsg of
  WM_NOTIFY: Begin
              Result := 0;
              If ((POFNOTIFY(lparam)^.hdr.code)=CDN_INITDONE) then Begin
               // wir merken uns den Parent
               ofnParent := GetParent(hdlg);
               // und holen uns die Adresse der ParentDialogProc
               oldDlgProc := Pointer(GetWindowLong(ofnparent,DWL_DLGPROC));
               // und setzen die ParentDialogProc auf die obere Proc
               SetWindowLong(ofnParent,DWL_DLGPROC,Integer(@DialogProc));
               Result := 1;
              End;
             End;
 End;
End;

procedure TForm1.Button1Click(Sender: TObject);
Var ofn: TOpenFileName;
begin
 // rudimentäres Befüllen der Struktur zu Demozwecken
 ZeroMemory(@ofn,sizeof(ofn));
 ofn.lStructSize := sizeof(ofn);
 ofn.lpstrInitialDir := 'C:\';
 ofn.Flags := OFN_ENABLEHOOK or OFN_EXPLORER; // wir wollen den Explorer-Style
 ofn.lpfnHook := @OpenFileNameHook;
 GetOpenFileName(ofn);
end;
Zugegeben, sieht schmutzig aus, aber geht...

Gruß, teebee
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz