2011-10-13 9 views

Odpowiedz

16

Można tworzyć własne niestandardowe okna dialogowe za pomocą funkcji delphi o nazwie CreateMessageDialog.

Przykład poniżej:

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; 

i oczywiście można dodać inne składniki aswell w tej formie dynamicznie.

+1

+1 Wydaje się pasować najlepiej do tego, czego szuka Shirish –

+0

@Ale dziękuję za pomysł – Shirish11

+0

Nigdy nie wiedziałem, że istnieje 'FindComponent'. +1! –

5

W oknie dialogowym zostanie użyta treść Application.Title jako podpis. Możesz ustawić to przed wywołaniem ShowMessage.

Jeśli jednak chcesz wyświetlać wiele okien dialogowych z różnymi podpisami, wygodniej jest wywołać funkcję Windows MessageBox. Z pewnością, jeśli masz starszą wersję Delphi, spowoduje to bardziej natywną atmosferę w twoim oknie dialogowym.

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; 

Jeśli chcesz kontrolować kolor i rozmiar wtedy najbardziej oczywistym rozwiązaniem jest stworzenie własnego okna jako TForm potomka.

+0

Nie mogę znaleźć 'MianWindowHandle' w BDS 2006 o niestandardowym formularzu jako okienka dialogowym wydaje mi się być opcją – Shirish11

+0

Niepoprawnie zapamiętałem. To jest MainFormHandle w Delphi. Odpowiadam na zbyt wiele pytań WinForms !!! –

+0

, ale narusza to właściwość 'Showmodal'' Showmessages' – Shirish11

0

Oto trochę kodu, który napisałem, możesz go użyć do notatki.

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; 

...

umieścić to w formularzu Tworzenie gdzie chcesz zrobić funky okna komunikatów

uses windows; 

...

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

Więc, co to robi hook w oknach dialogowych Windowsa i możesz uzyskać kontekst dla okna dialogowego i narysować na nim.

+0

Co u licha to robi? –

+0

@ David Musiałem napisać to dla wewnętrznej aplikacji, ponieważ niektórzy z techników tutaj chcieli mieć czerwone przyciski na ważnych komunikatach ostrzegawczych. Zasadniczo jest to hak, który może rysować na "kanwie" okna, które wyskoczysz. Możesz narysować w miejscu, w którym znajdują się komentarze. –

Powiązane problemy