Конференция "WinAPI" » Поясните пожалуйста работу WM_EXITSIZEMOVE [WinXP]
 
  • Nil (19.06.08 13:35) [0]
    При показе модального окна нужно затемнить главную форму которая находится под ней. Для затемнения использую такой код:
    procedure TMainForm.GrayWControl(WCtrl: TWinControl);
    procedure GrayCtrl;
    const
    Color1 = clWhite;
    Color2 = clBlack;{}
    {Color1 = $00AAAAAA;
    Color2 = $00555555;{}

    var
    DesktopDC, MemDC: HDC;
    NewBitmap, OldBitmap: HBITMAP;
    I, J: Integer;
    begin
    DesktopDC := GetDC(WCtrl.Handle);
    try
      MemDC := CreateCompatibleDC(DesktopDC);
      if MemDC <>0 then
      begin
        NewBitmap := CreateCompatibleBitmap(DesktopDC, 32, 32);
        if NewBitmap <>0 then
        begin
          OldBitmap := SelectObject(MemDC, NewBitmap);
          for I := 0 to 31 do
            for J := 0 to 31 do
              if (I + J) and 1 = 0 then
                SetPixel(MemDC, I, J, Color1)
              else
                SetPixel(MemDC, I, J, Color2);
          { Paint }
          J := 0;
          while J <Screen.Height do
          begin
            I := 0;
            while I <Screen.Width do
            begin
              BitBlt(DesktopDC, I, J, 32, 32, MemDC, 0, 0, SRCAND);
              Inc(I, 32);
            end;
            Inc(J, 32);
          end;
          { Delete objects }
          DeleteObject(NewBitmap);
          SelectObject(MemDC, OldBitmap);
        end;
        DeleteDC(MemDC);
      end;
    finally
      ReleaseDC(Handle, DesktopDC);
    end;
    end;
    var N: Integer;
    begin
    for N:=0 to WCtrl.ControlCount-1 do
     if WCtrl.Controls[N] is TWinControl then begin
      GrayWControl(TWinControl(WCtrl.Controls[N]));
      GrayCtrl;
     end;
    GrayCtrl;
    end;



    потом в модальном окне отлавливаю WM_EXITSIZEMOVE и вызываю GrayWControl

    procedure TAboutForm.WMEXITSIZEMOVE(var Message: TMessage);
    begin
     inherited;
     MainForm.GrayWControl(MainForm);
    end;



    но есть одна проблема. затемнение на главной форме не делается для той области над которой находилось модальное окно до перемещения. т.е. как понимаю, когда рисуется затемнение, функция GrayWControl ещё не знает о том что окно переместилось и область где раньше находилось окно не затемняется. подскажите пожалуйста, как обойти грабли?
  • Dmitry S © (19.06.08 15:05) [1]
    Главное окно перерисовывается при каждом WM_Paint. А ты затеняешь, как я понял, только один раз.
  • Nil (20.06.08 01:41) [2]
    поставил в OmPaint вызов graywcontrol, но результат остался тот же...
  • tesseract © (20.06.08 12:11) [3]

    > поставил в OmPaint вызов graywcontrol,


    А почему окно решит перериcоваться ? Следующий вызов Paint у mainform сотрёт твои изменения, надо paint, как раз у MainForm перекрывать. И триггер поставить - если так, то так рисуем, иначе отсеряем.
  • Nil (20.06.08 23:47) [4]

    > А почему окно решит перериcоваться ? Следующий вызов Paint
    > у mainform сотрёт твои изменения, надо paint, как раз у
    > MainForm перекрывать. И триггер поставить - если так, то
    > так рисуем, иначе отсеряем.


    не совсем понял..  я же вроде каждый раз когда перерисовывается главная форма рисую совоё затемнение. как оно может его стереть? а если выключу OnPaint, и буду рисовать только затемнение, тогда контролов поидее вообще на форме не будет а только мой серый фон. или я что то не так понимаю?
  • tesseract © (21.06.08 09:46) [5]

    > я же вроде каждый раз когда перерисовывается главная форма
    > рисую совоё затемнение.


    Когда форма TAboutForm перерисовываеться, перерисовку главного окна ты не выполняешь. При перемещении кстати оно может вообще просто хапать себя из памяти, и не вызывать перерисовки. Оптимизация вроде как. К тому же существуют ещё invaidateRect и тд.

    А по твоему сообщению
    : The window enters the moving or sizing modal loop when the user clicks the window's title bar or sizing border, or when the window passes


    Т.Е WM_PAINT обработан не будет!!!  А вызываеться он чаще.


    > тогда контролов поидее вообще на форме не будет а только
    > мой серый фон. или я что то не так понимаю?


    Правильно понимаешь. Говорю, тебе надо создать потомок формы, где у неё будет свой Paint.
  • Nil (23.06.08 01:03) [6]
    Спасибо, буду пробовать!
 
Конференция "WinAPI" » Поясните пожалуйста работу WM_EXITSIZEMOVE [WinXP]
Есть новые Нет новых   [134434   +27][b:0][p:0.002]