full_lamer |
Отправлено: 08.05.2004, 21:31 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Доброго всем времени!
Не подскажите как коректно перехватить Maximize MDI-окна и задать ему нужный мне размер, уставив его в Normal? Пробовал делать так: перехватываю OnResize, OnCanResize, OnConstrainedResize и когда я там фиксирую Maximize окна, и присваиваю свойству WindowState Normal, он разворачивается во всю материнскую форму не желает принимать мои размеры...
|
|
full_lamer |
Отправлено: 11.05.2004, 08:09 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Так никто не знает, да? Как Maximize перехватить? Дико извиняюсь что напоминаю...
|
|
Gedeon |
Отправлено: 11.05.2004, 09:23 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Вот код формы с отловом этого события
h-файл
CODE |
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall WMSysCommand(TWMSysCommand &SC);
protected:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TWMSysCommand, WMSysCommand)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
|
cpp-файл
CODE |
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMSysCommand(TWMSysCommand &SC)
{
if(SC.CmdType == SC_ZOOM){
Beep(1000,100);
}
TForm::Dispatch(&SC);
} |
Однако, учтите — форму можно максимизировать совершив даблклик на ее заголовке, по хорошему надо перехватить и это сообщение, посмотрите какое с помощью WinSight32 из ВСВ или более удобной на мой взгляд утилиткой Spy++ из VisualStudio.
И еще если хотите, чтобы максимизация не происходила, то в обработчике сделайте так:
CODE |
void __fastcall TForm1::WMSysCommand(TWMSysCommand &SC)
{
if(SC.CmdType == SC_ZOOM){
Beep(1000,100);
}
else{
TForm::Dispatch(&SC);
}
} |
|
|
full_lamer |
Отправлено: 11.05.2004, 16:43 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
У меня StackOwerflow...
|
|
full_lamer |
Отправлено: 11.05.2004, 16:53 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Все нормально! Нашел ошибку....
|
|
full_lamer |
Отправлено: 11.05.2004, 21:32 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Нет не все нормально Dispatch () почему то входит в рекурсию и переполняет стек... а не деспатчить я нео могу у меня тогда все события перехватываются... и окно лежит мертвым грузом... Сам думаю, но если есть соображения поделитесь...
|
|
Gedeon |
Отправлено: 12.05.2004, 09:09 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE |
Нет не все нормально Dispatch () почему то входит в рекурсию |
Это как?
У меня никаких рекурсий и тем более переполнения стека не происходит. Создайте новый проект и поэкспериментируйте на нем.
|
|
full_lamer |
Отправлено: 12.05.2004, 12:55 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Я не знаю, но сейчас все работает... не понимаю ... наверное что-то в прошлый раз упустил...
Извиняюсь и спасибо за беспокойство!
ЗЫ. Пожалуйста не надо "ВЫ"...
|
|
Gedeon |
Отправлено: 12.05.2004, 13:09 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (full_lamer @ 12/05/2004, 13:57) | ЗЫ. Пожалуйста не надо "ВЫ"... |
Что так сильно напрягает, не буду .
|
|
full_lamer |
Отправлено: 12.05.2004, 13:50 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
раздражает очень сильно — "ВЫ" еще надо заслужить!
у меня походу вопрос, нашел я сообщение как его обработать?
Сообщение: SC_DBLCLKS — помоему это оно...
|
|
Gedeon |
Отправлено: 12.05.2004, 14:33 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Что за сообщение такое, я не могу найти.
|
|
Gedeon |
Отправлено: 12.05.2004, 15:08 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (MSDN @ 00/00/2004, 00:00) | The WM_NCLBUTTONDBLCLK message is posted when the user double-clicks the left mouse button while the cursor is within the nonclient area of a window. This message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
WM_NCLBUTTONDBLCLK
WPARAM wParam
LPARAM lParam;
|
Вот код его обработки:
h-файл
CODE |
public:
void __fastcall WMSysCommand(TWMSysCommand &SC);
void __fastcall WMNCLButtonDblClk(TWMNCHitTest &SC);
protected:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TWMSysCommand, WMSysCommand)
VCL_MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, TWMNCHitTest, WMNCLButtonDblClk)
END_MESSAGE_MAP(TForm)
|
cpp-файл
CODE |
//---------------------------------------------------------------------------
void __fastcall TForm1::WMSysCommand(TWMSysCommand &SC)
{
if(SC.CmdType == SC_ZOOM){
Beep(1000,100);
}
TForm::Dispatch(&SC);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMNCLButtonDblClk(TWMNCHitTest &SC)
{
if(this->WindowState != wsMaximized){ // т.к. таким макаром можно максимизированное
Beep(1000,100); // окно возвращать к нормальному размеру
}
TForm::Dispatch(&SC);
}
//--------------------------------------------------------------------------- |
|
|
full_lamer |
Отправлено: 12.05.2004, 16:54 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Спасибо за помощь!
|
|