Конференция "WinAPI" » CreateMessageDialog
 
  • Decoding (05.04.10 21:50) [0]
    Hi мастера.

    Создаю диалог с помощью функции CreateMessageDialog. Хочу что-либо рисовать на этой форме, для чего меняю ей оконную процедуру и обрабатываю событие WM_ERASEBKGND. Но есть проблема, а именно - фон у надписи, которая передается первым параметром в функцию CreateMessageDialog непрозрачный, что очень портит вид. Подскажите, как "добраться" до этой надписи и сделать ее фон прозрачным?

    Краткий пример проблемы лежит тут - http://www.onlinedisk.ru/file/398668/
  • Игорь Шевченко © (05.04.10 23:52) [1]

    > Но есть проблема, а именно - фон у надписи, которая передается
    > первым параметром в функцию CreateMessageDialog непрозрачный,
    >  что очень портит вид


    внутри WM_ERASEBKGND

    SetBkMode(Canvas.Handle, TRANSPARENT) ?
  • Decoding (06.04.10 00:00) [2]

    > внутри WM_ERASEBKGND
    >
    > SetBkMode(Canvas.Handle, TRANSPARENT) ?


    Пробовал, не получилось… Может на примере покажете?
  • Игорь Шевченко © (06.04.10 00:23) [3]
    Примером:

    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;

    {$R *.dfm}

    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.

  • Decoding (06.04.10 16:10) [4]
    Спасибо!
 
Конференция "WinAPI" » CreateMessageDialog
Есть новые Нет новых   [134431   +16][b:0][p:0.002]