Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.09;
Скачать: CL | DM;

Вниз

Поясните пожалуйста работу WM_EXITSIZEMOVE   Найти похожие ветки 

 
Nil   (2008-06-19 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 ©   (2008-06-19 15:05) [1]

Главное окно перерисовывается при каждом WM_Paint. А ты затеняешь, как я понял, только один раз.


 
Nil   (2008-06-20 01:41) [2]

поставил в OmPaint вызов graywcontrol, но результат остался тот же...


 
tesseract ©   (2008-06-20 12:11) [3]


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


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


 
Nil   (2008-06-20 23:47) [4]


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


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


 
tesseract ©   (2008-06-21 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   (2008-06-23 01:03) [6]

Спасибо, буду пробовать!



Страницы: 1 вся ветка

Текущий архив: 2009.08.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
4-1213710169
JetuS
2008-06-17 17:42
2009.08.09
Получение ID главного потока приложения


15-1244798237
Артур Пирожков
2009-06-12 13:17
2009.08.09
Почему в Explore грузится, а в Опере или Лисе нет?


2-1245049095
DDR2
2009-06-15 10:58
2009.08.09
Найти все ссылки


15-1244183113
Dennis I. Komarov
2009-06-05 10:25
2009.08.09
MS VC++ 2008 EE (или УЮ :) )


11-1204664342
=BuckLr=
2008-03-04 23:59
2009.08.09
Вопрос по KOLMediaPlayer