Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1211807607
Jungle
2008-05-26 17:13
2009.08.09
"Правильно" преобразовать тип Variant


2-1244709711
a.a.j.
2009-06-11 12:41
2009.08.09
Место позиции курсора в поле html страницы


15-1244237635
Галинка
2009-06-06 01:33
2009.08.09
серверы для командных онлайн-игр


15-1244734543
12
2009-06-11 19:35
2009.08.09
Кодировка в неком мобильном устройстве + ADOquery


15-1244291308
@!!ex_
2009-06-06 16:28
2009.08.09
Помогите с настройкой Linux а





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский