Главная страница
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.012 c
14-15832
Дружина им. Ленина
2003-01-22 15:19
2003.02.06
Подскажите где скачать Turbo Bascalъ 7


4-15979
valerchik
2002-12-20 08:04
2003.02.06
Текстовый редактор на WinAPI


4-15982
drake
2002-12-22 23:40
2003.02.06
Приоритет приложения


9-15385
Zahar
2002-06-09 18:59
2003.02.06
Создание игр на Delphi


3-15484
Наташа
2003-01-20 18:01
2003.02.06
Sql запрос