Изменить заголовок и атрибуты диалогового окна ShowMessage

#delphi #delphi-2006

#delphi #delphi-2006

Вопрос:

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

И могу ли я изменить цвет фона, размер того же?

Ответ №1:

Вы можете создавать свои собственные пользовательские диалоги, используя 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;
  

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

Комментарии:

1. Я никогда не знал FindComponent о существовании. 1!

Ответ №2:

В диалоговом 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 потомка.

Комментарии:

1. я не могу найти MianWindowHandle в BDS 2006 возможность использования пользовательской формы в качестве диалогового окна

2. Я неправильно запомнил. Это MainFormHandle в Delphi. Я отвечаю на слишком много вопросов WinForms!!!

3. но это нарушает Showmodal свойство Showmessages

4. Извините, я не могу понять этот комментарий.

5. когда вы отображаете окно MessageDialog с помощью a Showmessage , управление приложением переходит в диалоговое окно Showmessage, но в этом случае управление все еще находится в приложении при MessageBox вызове

Ответ №3:

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

 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, и вы можете получить контекст для диалогового окна и использовать его.

Комментарии:

1. @David Мне пришлось написать это для внутреннего приложения, потому что некоторые технические специалисты хотели иметь красные кнопки на важных предупреждающих сообщениях. По сути, это хук, который можно рисовать на «холсте» открывшегося диалогового окна. Вы можете рисовать в том месте, где находятся комментарии.