2011-10-13 21 views

Trả lời

16

Bạn có thể tạo hộp thoại tùy chỉnh của riêng mình bằng cách sử dụng chức năng CreateMessageDialog của delphi.

Ví dụ dưới đây:

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; 

và tất nhiên bạn có thể chèn các thành phần khác là tốt vào hình thức mà năng động.

+1

+1 Điều này dường như phù hợp nhất với những gì Shirish đang tìm kiếm –

+0

@aldo cảm ơn ý tưởng – Shirish11

+0

Tôi chưa bao giờ biết 'FindComponent' tồn tại. +1! –

5

Hộp thoại sẽ sử dụng nội dung của Application.Title làm phụ đề. Vì vậy, bạn có thể thiết lập điều này trước khi gọi ShowMessage.

Tuy nhiên, nếu bạn muốn hiển thị nhiều hộp thoại với phụ đề khác nhau, sẽ thuận tiện hơn khi gọi hàm Windows MessageBox. Chắc chắn nếu bạn có một phiên bản cũ của Delphi, điều này sẽ dẫn đến cảm giác bản địa hơn cho hộp thoại của bạn.

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; 

Nếu bạn muốn kiểm soát màu sắc và kích thước thì tùy chọn hiển nhiên nhất là tạo hộp thoại của riêng bạn làm TForm hậu duệ.

+0

tôi không thể tìm thấy 'MianWindowHandle' trong BDS 2006 có biểu mẫu tùy chỉnh dưới dạng hộp thoại có vẻ là một tùy chọn – Shirish11

+0

Tôi đã xác định sai. Đó là MainFormHandle trong Delphi. Tôi đang trả lời quá nhiều câu hỏi WinForms !!! –

+0

nhưng nó vi phạm thuộc tính 'Showmodal' của' Showmessages' – Shirish11

0

Đây là một đoạn mã tôi đã viết, bạn có thể muốn sử dụng nó để ghi chú.

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; 

...

đặt này trong Form của bạn Tạo nơi bạn muốn làm cho hộp thư sôi nổi

uses windows; 

...

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

Vì vậy, điều này là móc vào các chức năng bật hộp thoại của Windows và bạn có thể lấy bối cảnh cho hộp thoại và vẽ lên đó.

+0

Điều này có tác dụng gì? –

+0

@ David Tôi đã phải viết điều này cho một ứng dụng nội bộ bởi vì một số người công nghệ ở đây muốn có các nút màu đỏ trên các thông điệp cảnh báo quan trọng. Về cơ bản nó là một cái móc có thể vẽ trên 'canvas' của hộp thoại bạn bật lên. Bạn có thể vẽ ở nơi có các bình luận. –

Các vấn đề liên quan