-
Hi мастера. Создаю диалог с помощью функции CreateMessageDialog. Хочу что-либо рисовать на этой форме, для чего меняю ей оконную процедуру и обрабатываю событие WM_ERASEBKGND. Но есть проблема, а именно - фон у надписи, которая передается первым параметром в функцию CreateMessageDialog непрозрачный, что очень портит вид. Подскажите, как "добраться" до этой надписи и сделать ее фон прозрачным? Краткий пример проблемы лежит тут - http://www.onlinedisk.ru/file/398668/
-
> Но есть проблема, а именно - фон у надписи, которая передается > первым параметром в функцию CreateMessageDialog непрозрачный, > что очень портит вид
внутри WM_ERASEBKGND
SetBkMode(Canvas.Handle, TRANSPARENT) ?
-
> внутри WM_ERASEBKGND > > SetBkMode(Canvas.Handle, TRANSPARENT) ?
Пробовал, не получилось… Может на примере покажете?
-
Примером: unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FOldDialogWindowProc: TWndMethod;
procedure DialogWindowProc (var Message: TMessage);
end;
var
Form1: TForm1;
implementation
uses
GraphUtil;
procedure TForm1.Button1Click(Sender: TObject);
var
AForm: TForm;
begin
AForm := CreateMessageDialog('Transparent dialog', mtInformation, [mbOk]);
with AForm.FindComponent('Message') as TLabel do
Transparent := true;
FOldDialogWindowProc := AForm.WindowProc;
AForm.WindowProc := DialogWindowProc;
AForm.ShowModal;
end;
procedure TForm1.DialogWindowProc(var Message: TMessage);
var
Wnd: HWND;
ARect: TRect;
Canvas: TCanvas;
begin
if Message.Msg = WM_ERASEBKGND then
with TWmEraseBkGnd(Message) do
begin
Canvas := TCanvas.Create;
try
Canvas.Handle := DC;
Wnd := WindowFromDC(DC);
Windows.GetClientRect(Wnd, ARect);
GradientFillCanvas(Canvas, clYellow, clRed, ARect, gdHorizontal);
finally
Canvas.Free;
end;
end
else
FOldDialogWindowProc(Message);
end;
end.
-
Спасибо!
|