Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Вниз

WM_DISPLAYCHANGE   Найти похожие ветки 

 
homm ©   (2005-10-08 16:07) [0]

WM_DISPLAYCHANGE
The WM_DISPLAYCHANGE message is sent to all windows when the display resolution has changed.

WM_DISPLAYCHANGE  
cBitsPerPixel = wParam;
cxScreen = LOWORD(lParam);
cyScreen = HIWORD(lParam);

Написано что до всех окон доходит, а до моих не доходит 8(
А в VCL доходит 8(


 
Thaddy   (2005-10-08 19:57) [1]

Simply add onmessage handler and call defwindowproc


 
ECM ©   (2005-10-08 20:37) [2]

function TForm1.KOLForm1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
 Result := FALSE;
 if Msg.message = WM_DISPLAYCHANGE then asm int 3 end;
end;

breakpoint работает...


 
homm ©   (2005-10-08 22:54) [3]

2 ECM
Да действительно выш пример работет, но

function TForm1.Button1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
Result := FALSE;
if Msg.message = WM_DISPLAYCHANGE then asm int 3 end;
end;

уже нет.
Может жело в том, что сообщение достигает только "детей" "экрана"? Но мне нужно чтобы каждое нужное мне окно было оповещено (сори за тавталогию). Может кто знает как этого дабится (частные решения делающие изменения в KOLForm1Message не подходят, перехватывать сообщения в родителе тоже не верно, т.к. это нужно для компонентов и я не могу быть уверен, что родитель обязательно форма)


 
ECM ©   (2005-10-10 14:59) [4]

function WndProcDisplayChange(Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
var I: Integer;
   C: PControl;
   Cnt: Integer;
begin
 Result := False;
 if Msg.message = WM_DISPLAYCHANGE then
 begin
   Cnt := Self_.ChildCount;
   for I:= 0 to Cnt - 1 do
   begin
     C := Self_.Children[ I ];
     C.Perform( WM_DISPLAYCHANGE, Msg.wParam, Msg.lParam );
   end;
 end;
end;

procedure TForm1.KOLForm1FormCreate(Sender: PObj);

 procedure AttachWithChildren(Control: PControl);
 var
   i: Integer;
   Cnt: Integer;
   C: PControl;
 begin
   Control.AttachProc(@WndProcDisplayChange);
   Cnt := Control.ChildCount;
   for i:= 0 to Cnt-1 do begin
     C := Control.Children[i];
     AttachWithChildren(C);
   end;
 end;

begin
 AttachWithChildren(Form);
end;


Теперь это сообщение будет попадать во ВСЕ компоненты формы, независимо от их расположения (родителя)


 
ECM ©   (2005-10-10 15:30) [5]

З.Ы.
ИМХО: если обработка сообщения необходима в компоненте (контроле)собственной разработки я бы сделал так:

1) В модуле реализации контрола (не МСК) объявил статическую переменную - список всех созданных контролов данного типа:
var
 SomeCompList: PList = nil;
(Инициализацию этой переменной (SomeCompList := NewList)можно сделать в секции Initialization модуля или при первом обращении к ней)

2) Создал обработчик сообщения WM_DISPLAYCHANGE такого вида:

function WndProcDisplayChange(Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
var I: Integer;
  C: PControl;
  Cnt: Integer;
begin
Result := False;
if (Msg.message = WM_DISPLAYCHANGE) then
begin
  Cnt := SomeCompList.Count;
  for I:= 0 to Cnt - 1 do
  begin
    C := SomeCompList.Items[i];
    C.Perform( WM_DISPLAYCHANGE, Msg.wParam, Msg.lParam );
  end;
end;
end;

3) В функции NewSomeComp(AParent: PControl,...)  добавил вновь созданный контрол в список - SomeCompList.Add(Result) и присоединил к его родительской форме обработчик -
Result.ParentForm.Attach(@WndProcDisplayChange);

(Я здесь специально не вводил всевозможные проверки на nil и очистку при удалении контрола - для простоты понимания принципа)



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

Форум: "KOL";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.012 c
2-1149071154
ksenia
2006-05-31 14:25
2006.06.18
простая замена


2-1149154398
.ruslan
2006-06-01 13:33
2006.06.18
MonthCalendar1


15-1148455238
alles
2006-05-24 11:20
2006.06.18
Знатокам asp


15-1148622507
worldmen
2006-05-26 09:48
2006.06.18
WinXp Pro. Доступ к принтерам по сети.


6-1135885674
ZeFiR
2005-12-29 22:47
2006.06.18
WAP-браузер





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский