-
При показе модального окна нужно затемнить главную форму которая находится под ней. Для затемнения использую такой код: procedure TMainForm.GrayWControl(WCtrl: TWinControl);
procedure GrayCtrl;
const
Color1 = clWhite;
Color2 = clBlack;
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);
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;
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 ещё не знает о том что окно переместилось и область где раньше находилось окно не затемняется. подскажите пожалуйста, как обойти грабли?
-
Главное окно перерисовывается при каждом WM_Paint. А ты затеняешь, как я понял, только один раз.
-
поставил в OmPaint вызов graywcontrol, но результат остался тот же...
-
> поставил в OmPaint вызов graywcontrol,
А почему окно решит перериcоваться ? Следующий вызов Paint у mainform сотрёт твои изменения, надо paint, как раз у MainForm перекрывать. И триггер поставить - если так, то так рисуем, иначе отсеряем.
-
> А почему окно решит перериcоваться ? Следующий вызов Paint > у mainform сотрёт твои изменения, надо paint, как раз у > MainForm перекрывать. И триггер поставить - если так, то > так рисуем, иначе отсеряем.
не совсем понял.. я же вроде каждый раз когда перерисовывается главная форма рисую совоё затемнение. как оно может его стереть? а если выключу OnPaint, и буду рисовать только затемнение, тогда контролов поидее вообще на форме не будет а только мой серый фон. или я что то не так понимаю?
-
> я же вроде каждый раз когда перерисовывается главная форма > рисую совоё затемнение.
Когда форма 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.
-
Спасибо, буду пробовать!
|