powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / передвижение формы не только за заголовок
8 сообщений из 8, страница 1 из 1
передвижение формы не только за заголовок
    #34328020
Фотография sashka304
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пишу в с++Билдере, делаю так:
в h-файле прописываю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
private:	// User declarations
........
   void __fastcall WMNCHitTest(TMessage &Msg);
.........
public:		// User declarations

.........
  BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_NCHITTEST, TMessage, WMNCHitTest)
  END_MESSAGE_MAP(TSettingForm)
..........
в cpp:
Код: plaintext
1.
2.
3.
4.
5.
6.
void __fastcall TSettingForm::WMNCHitTest(TMessage &Msg)
{
    TSettingForm::Dispatch(&Msg);
    if (Msg.Result == HTCAPTION)
      Msg.Result = HTCLIENT;
}
в итоге при компиляции - stack overflow
показываеть на эту строку:
Код: plaintext
BEGIN_MESSAGE_MAP
...
Рейтинг: 0 / 0
передвижение формы не только за заголовок
    #34328312
Фотография sashka304
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообщем незнаю каким чудным образом но так заработало:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
private:	// User declarations
void __fastcall OnMove(TWMNCHitTest &Message);

public:		// User declarations
   BEGIN_MESSAGE_MAP
           MESSAGE_HANDLER (WM_NCHITTEST,TWMNCHitTest,OnMove)
        END_MESSAGE_MAP (TComponent)

Код: plaintext
1.
2.
3.
void __fastcall TSettingForm::OnMove(TWMNCHitTest &Message)
{
   Message.Result = HTCAPTION;
}
...
Рейтинг: 0 / 0
передвижение формы не только за заголовок
    #34328321
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написанный текст больше смахивает на текст из под VS.
А в билдере, наверное хватило бы обработчика onmousemove. (ну и наверное onmousedown чтобы снять координаты формы при начале движения)
...
Рейтинг: 0 / 0
передвижение формы не только за заголовок
    #34328355
Фотография sashka304
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я пробовал в он маусмув, но перерисовка была ужасной
...
Рейтинг: 0 / 0
передвижение формы не только за заголовок
    #34328363
Фотография Termi_uc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sashka304вообщем незнаю каким чудным образом но так заработало:
Код: plaintext
1.
2.
3.
   BEGIN_MESSAGE_MAP
           MESSAGE_HANDLER (WM_NCHITTEST,TWMNCHitTest,OnMove)
        END_MESSAGE_MAP (TComponent)


Зачем так усложнять?
Пиши
Код: plaintext
1.
2.
3.
 ReleaseCapture();  // Это метод формы
 ((TControl *)Sender)->Parent->Perform(WM_SYSCOMMAND,0xF012, 0 );

в событии OnMouseDown того компонента за который хочеш перемещять форму.

При этом этим способом можно перемять не только форму а любого наследника класса TControl.
...
Рейтинг: 0 / 0
передвижение формы не только за заголовок
    #34328567
Фотография sashka304
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо большое!
так заработало:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  ReleaseCapture();  
  this->Perform(WM_SYSCOMMAND,0xF012, 0 );

}
а с этой вещью не хотело
Код: plaintext
((TControl *)Sender)
...
Рейтинг: 0 / 0
передвижение формы не только за заголовок
    #34331083
Фотография Termi_uc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sashka304спасибо большое!
...
а с этой вещью не хотело
Код: plaintext
((TControl *)Sender)


Там вся фишка в ((TControl *)Sender)->Parent . В конкретном случае радителем компонента является форма!

А если так
Код: plaintext
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF012, 0 );
то двигатся будет компонент
...
Рейтинг: 0 / 0
передвижение формы не только за заголовок
    #34331129
Фотография Termi_uc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если менять значение 0xF012 в
Код: plaintext
Perform(WM_SYSCOMMAND,0xF012, 0 );
в большую или меньшую сторону, (0xF010, 0xF013...) то можно изменять размеры объекта. КАК В ДИЗАЙНЕРЕ.

А если напишиш след. функции, то компоненты можно превратить в окна и перемещять, изменять их размеры; а потом назад - в обычные компоненты.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
void MakeMovable(HWND Handle)
{
  lonf int style;
  UINTflags;

  style := GetWindowLong(Handle, GWL_STYLE);
  style := style | WS_OVERLAPPED | WS_THICKFRAME | WS_CAPTION;
  SetWindowLong(Handle, GWL_STYLE, style);

  style := GetWindowLong(Handle, GWL_EXSTYLE);
  style := style | WS_EX_TOOLWINDOW;
  SetWindowLong(Handle, GWL_EXSTYLE, style);

  flags := SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME | SWP_NOZORDER;
  SetWindowPos(Handle, 0 ,  0 ,  0 ,  0 ,  0 , flags);
}

void MakeUnmovable(HWND Handle)
{
  long int style;
  UINT flags;

  style := GetWindowLong(Handle, GWL_STYLE);
  style := style & ~ WS_OVERLAPPED & ~ WS_THICKFRAME & ~ WS_CAPTION;
  SetWindowLong(Handle, GWL_STYLE, style);

  style := GetWindowLong(Handle, GWL_EXSTYLE);
  style := style and not WS_EX_TOOLWINDOW;
  SetWindowLong(Handle, GWL_EXSTYLE, style);

  flags := SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME | SWP_NOZORDER;
  SetWindowPos(Handle, 0  ,  0 ,  0 ,  0 ,  0 , flags);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MakeMovable(Memo1->Handle);
//MakeUnmovable(Memo1->Handle);
}
   

Пример из книги по Delphi
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / передвижение формы не только за заголовок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]