C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Перехвать Maximize
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 () почему то входит в рекурсию и переполняет стек... а не деспатчить я нео могу у меня тогда все события перехватываются... и окно лежит мертвым грузом... sad.gif Сам думаю, но если есть соображения поделитесь...
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)
ЗЫ. Пожалуйста не надо "ВЫ"...

biggrin.gif biggrin.gif biggrin.gif
Что так сильно напрягает, не буду biggrin.gif .
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



Спасибо за помощь!

Вернуться в Вопросы программирования в C++Builder