Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
1-1147539751
Stalker.mg
2006-05-13 21:02
2006.06.18
полоса прокрутки на главной форме


15-1148270549
divinus
2006-05-22 08:02
2006.06.18
Евровидение


15-1148369229
Kolan
2006-05-23 11:27
2006.06.18
Помогите дать определение "Интерфейс"


15-1148282530
АлексейК
2006-05-22 11:22
2006.06.18
К жителям Новосибирска


2-1148980350
duncat
2006-05-30 13:12
2006.06.18
Распечатать текст из Memo