Текущий архив: 2003.02.06;
Скачать: CL | DM;
ВнизХотел было поймать WM_MDIMAXIMIZE, да не тут-то было :( Найти похожие ветки
← →
Fiend (2003-01-28 11:00) [0]В общем люди захотели плавающее меню а-ля офис. Сделал его с помощью TToolBar и всё окей, однако же присутствие MDI интерфейса заставляет обработать самостоятельно события максимизации/восстановления/создания/удаления дочерних окон, дабы нарисовать на панели плавающего меню системные кнопки управления окном. Создание/удаление ловится нараз, а вот максимизация/восствновление ни в какую. Помогите чем сможете. Вот кусочек кода:
procedure TMainForm.FormCreate(Sender: TObject);
begin
ClientProcInstance := MakeObjectInstance(ClientWndProc);
DefaultClientProc := Pointer(GetWindowLong(ClientHandle,
GWL_WNDPROC));
SetWindowLong(ClientHandle,
GWL_WNDPROC, LongInt(ClientProcInstance));
end;
procedure TMainForm.ClientWndProc(var Message: TMessage);
begin
with Message do
case Msg of
WM_MDIMAXIMIZE : begin
beep;
Result := CallWindowProc(DefaultClientProc,
ClientHandle,
Msg,
wParam,
lParam);
end;
WM_MDIRESTORE : begin
beep;
Result := CallWindowProc(DefaultClientProc,
ClientHandle,
Msg,
wParam,
lParam);
end;
else
Result := CallWindowProc(DefaultClientProc,
ClientHandle,
Msg,
wParam,
lParam);
end;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{..................}
if Action=caFree
then begin
SetWindowLong(ClientHandle,
GWL_WNDPROC, LongInt(DefaultClientProc));
FreeObjectInstance(ClientProcInstance);
end;
end;
СПАСИТИ!!!!! пожалуста!
← →
REA (2003-01-28 11:24) [1]Я извратился так:
Procedure TMDIForm.FormActivate(Sender: TObject);
Begin
PostMessage(Application.MainForm.Handle,WM_ACTCHILD,0,0);
End;
Procedure TMDIForm.FormClose(Sender: TObject; var Action: TCloseAction);
Begin
Action := caFree;
Application.MainForm.Perform(WM_DEACTCHILD,0,0);
End;
-------- MainForm ----------
Procedure TMainForm.WMActChild(var Message: TMessage);
Begin
tbWinControls.Visible := (Screen.ActiveForm.WindowState=wsMaximized);
End;
Procedure TMainForm.WMDeActChild(var Message: TMessage);
Begin
tbWinControls.Visible := False;
End;
Вроде все. Не особо стабильно работает, но делал давно и лень переделывать. Да в принципе OnIdle повесить и сойдет.
← →
Fiend (2003-01-28 11:50) [2]не, ну а потом если юзер стал окном "баловаться"
как поймать шо он максимизировал или восстановил
← →
REA (2003-01-28 12:04) [3]Ты попробуй (благо недолго) - оно должно работать. Если где чего не заработает - поправь и мне скажи :)
← →
Fiend (2003-01-28 12:28) [4]зашибись вы вариант предложили!
може мне еще таймер присобачить ко всему этому?!
подобного изврата никогда в моих софтах не будет!
хотя конечно спос за идею
← →
REA (2003-01-28 12:48) [5]Да не надо никакого таймера. Оно и так вроде работает, если я ничего не забыл.
Страницы: 1 вся ветка
Текущий архив: 2003.02.06;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.011 c