2011-10-13 6 views

risposta

16

È possibile creare finestre di dialogo personalizzate utilizzando la funzione CreateMessageDialog di delphi.

Esempio di seguito:

var 
    Dlg: TForm; 
begin 
    Dlg := CreateMessageDialog('message', mtInformation, [mbOk], mbOK); 
    // Treat Dlg like any other form 

    Dlg.Caption := 'Hello World'; 

    try 
    // The message label is named 'message' 
    with TLabel(Dlg.FindComponent('message')) do 
    begin 
     Font.Style := [fsUnderline]; 

     // extraordinary code goes here 
    end; 

    // The icon is named... icon 
    with TPicture(Dlg.FindComponent('icon')) do 
    begin 
     // more amazing code regarding the icon 
    end; 

    Dlg.ShowModal; 
    finally 
    Dlg.Free; 
    end; 

e, naturalmente, è possibile inserire altri componenti aswell in quella forma in modo dinamico.

+1

+1 Questo sembra corrispondere meglio a quello che Shirish sta cercando –

+0

@aldo grazie per l'idea – Shirish11

+0

Non ho mai saputo dell'esistenza di 'FindComponent'. +1! –

5

La finestra di dialogo utilizzerà il contenuto di Application.Title come didascalia. Quindi puoi impostarlo prima di chiamare ShowMessage.

Tuttavia, se si desidera visualizzare più finestre di dialogo con didascalie diverse, sarebbe più conveniente chiamare la funzione Windows MessageBox. Certamente, se hai una versione precedente di Delphi, questo risulterà in un aspetto più nativo del tuo dialogo.

procedure MyShowMessage(const Msg, Caption: string); 
begin 
    MessageBox(GetParentWindowHandleForDialog, PChar(Msg), PChar(Caption), MB_OK); 
end; 

function GetParentWindowHandleForDialog: HWND; 
begin 
    //we must be careful that the handle we use here doesn't get closed while the dialog is showing 
    if Assigned(Screen.ActiveCustomForm) then begin 
    Result := Screen.ActiveCustomForm.Handle; 
    end else if Assigned(Application.MainForm) then begin 
    Result := Application.MainFormHandle; 
    end else begin 
    Result := Application.Handle; 
    end; 
end; 

Se si desidera controllare colore e dimensione quindi l'opzione più ovvia è quella di creare il proprio dialogo come un TForm discendente.

+0

non riesco a trovare 'MianWindowHandle' in BDS 2006 con un modulo personalizzato come una finestra di dialogo sembra essere un'opzione – Shirish11

+0

ho erroneamente ricordato. È MainFormHandle in Delfi. Sto rispondendo a troppe domande su WinForms !!! –

+0

ma viola la proprietà 'Showmodal' di' Showmessages' – Shirish11

0

Ecco un po 'di codice che ho scritto, si potrebbe desiderare di usarlo nota per nota.

function SetHook(Code : Integer; wparam : Integer; LParam : Integer) : Longint; stdcall; 
function HookWndProc(wnd : HWND ;uMsg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall; 
var 
    CaptHook : HHOOK; 
    GHookProc : TFNWndProc; 
    GOldHookProc : TFNWndProc; 
implementation 

uses Messages, Types, Graphics; 

    function SetHook(Code : Integer; wparam : Integer; LParam : Integer) : Longint; stdcall; 
var 
    pwp : CWPSTRUCT; 
begin 
if Code = HC_ACTION then 
begin 
    pwp := CWPStruct(Pointer(LParam)^); 
    if pwp.message = WM_INITDIALOG then 
    begin 
    GOldHookProc := TFnWndProc(SetWindowLong(pwp.hwnd, GWL_WNDPROC, LongInt(GHookProc))); 
    end; 
    end; 

result := CallNextHookEx(CaptHook, Code, wparam, lparam); 

end; 

function HookWndProc(wnd : HWND ;uMsg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT; 
var 
    DC : HDC; 
    WndRect : Trect; 
    BR: HBRUSH; 
    WndText : array[1..20] of char; 
begin 

result := CallWindowProc(GOldHookProc, wnd, uMsg, wParam, lParam); 
if uMsg = WM_ERASEBKGND then 
begin 
    GetWindowText(wnd, @wndText, 20); 

    //do stuff here (I colored the button red) 
    DC := GetDC(wnd); 
    WndRect := Rect(0, 0, 200,200); 
    BR := CreateSolidBrush(clRed); 
    FillRect(dc, WndRect, BR); 
    DeleteObject(BR); 
    ReleaseDC(wnd, dc); 
end; 
end; 

...

mettere questo nel vostro modulo Crea in cui si desidera effettuare le finestre di messaggio funky

uses windows; 

...

CaptHook := SetWindowsHookEx(WH_CALLWNDPROC, @SetHook, 0, GetCurrentThreadId); 
GHookProc := @HookWndProc; 

Quindi, ciò che questo fa agganciare le funzioni di finestra di dialogo di Windows e puoi ottenere il contesto per la finestra di dialogo e disegnare su di esso.

+0

Cosa diavolo fa? –

+0

@David Ho dovuto scrivere questo per un'applicazione interna perché alcuni dei tecnici qui volevano avere pulsanti rossi su importanti messaggi di avviso. È essenzialmente un amo che può disegnare sulla "tela" della finestra di dialogo che si apre. È possibile disegnare nel punto in cui si trovano i commenti. –

Problemi correlati