Главная страница
    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.01 c
15-1148668271
SergP
2006-05-26 22:31
2006.06.18
mp3 --> wav Чем сконвертировать?


2-1148888726
Ironman83
2006-05-29 11:45
2006.06.18
dxTreeList


3-1145546774
s_t_d
2006-04-20 19:26
2006.06.18
IBExpert. Экспорт данных в Excel


1-1147443885
parovoZZ
2006-05-12 18:24
2006.06.18
Результат функции по событию в dll


2-1149135720
Laymer
2006-06-01 08:22
2006.06.18
Классы





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