Главная страница
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.024 c
14-15866
p77
2003-01-09 20:47
2003.02.06
Numega Driver Studio


1-15623
farhad
2003-01-29 12:38
2003.02.06
Простой вопрос...


7-15969
aleks1
2002-12-03 09:54
2003.02.06
Как вывести файл *.prn на принтер (USB) ?


1-15646
Brain
2003-01-29 10:43
2003.02.06
Иконка компонента на ToolBar - Delphi.


1-15664
Nichka
2003-01-29 14:02
2003.02.06
Свойство-контейнер в классах