Изменить заголовок и атрибуты диалога ShowMessage - PullRequest
5 голосов
/ 13 октября 2011

В Delphi вы можете изменить заголовок диалога ShowMessage, потому что по умолчанию он принимает мое имя exe.

А можно ли изменить цвет фона, размер такой же?

Ответы [ 3 ]

17 голосов
/ 13 октября 2011

Вы можете создавать свои собственные диалоговые окна, используя функцию CreateMessageDialog delphi.

Пример ниже:

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;

и, конечно, вы можете динамически вставлять в эту форму и другие компоненты.

5 голосов
/ 13 октября 2011

В диалоге будет использоваться содержимое Application.Title в качестве заголовка. Таким образом, вы можете установить это до вызова ShowMessage.

Однако, если вы хотите отобразить несколько диалогов с разными заголовками, было бы удобнее вызвать функцию Windows MessageBox. Конечно, если у вас более старая версия Delphi, это приведет к более естественному восприятию вашего диалога.

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;

Если вы хотите контролировать цвет и размер, то наиболее очевидный вариант - создать свой собственный диалог как потомок TForm.

0 голосов
/ 13 октября 2011

Вот немного кода, который я написал, вы можете использовать его для заметки.

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;

...

Поместите это в свою форму. Создайте там, где вы хотите создать шуточные сообщения

uses windows;

...

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

Итак, это подключается к всплывающим функциям диалогового окна Windows, и вы можете получить контекст для диалога и нарисовать его.

...