W Delphi możesz zmienić podpis okna dialogowego ShowMessage
, ponieważ domyślnie przyjmuje on moją nazwę exe.Zmień podpis i atrybuty okna dialogowego ShowMessage.
Czy mogę zmienić kolor tła, rozmiar tego samego?
W Delphi możesz zmienić podpis okna dialogowego ShowMessage
, ponieważ domyślnie przyjmuje on moją nazwę exe.Zmień podpis i atrybuty okna dialogowego ShowMessage.
Czy mogę zmienić kolor tła, rozmiar tego samego?
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.
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.
Nie mogę znaleźć 'MianWindowHandle' w BDS 2006 o niestandardowym formularzu jako okienka dialogowym wydaje mi się być opcją – Shirish11
Niepoprawnie zapamiętałem. To jest MainFormHandle w Delphi. Odpowiadam na zbyt wiele pytań WinForms !!! –
, ale narusza to właściwość 'Showmodal'' Showmessages' – Shirish11
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.
Co u licha to robi? –
@ 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. –
+1 Wydaje się pasować najlepiej do tego, czego szuka Shirish –
@Ale dziękuję za pomysł – Shirish11
Nigdy nie wiedziałem, że istnieje 'FindComponent'. +1! –