Форум: "WinAPI";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
ВнизПоясните пожалуйста работу 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c