Форум: "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