Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.028 c
3-15418
koks
2003-01-16 14:24
2003.02.06
IBExpert -> Validate ...


3-15409
skirdov
2003-01-21 19:27
2003.02.06
Этот загадочный DBGrid...


14-15897
Supreme
2003-01-20 19:59
2003.02.06
Вроде всё налаживается :)


14-15848
kostya2000
2003-01-13 18:35
2003.02.06
Кому в России жить хорошо?


3-15489
Alek_1
2003-01-17 21:13
2003.02.06
Работа с блоб полями