Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / передвижение формы не только за заголовок / 8 сообщений из 8, страница 1 из 1
13.02.2007, 17:44
    #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
13.02.2007, 19:10
    #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
13.02.2007, 19:12
    #34328321
muk07
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передвижение формы не только за заголовок
Написанный текст больше смахивает на текст из под VS.
А в билдере, наверное хватило бы обработчика onmousemove. (ну и наверное onmousedown чтобы снять координаты формы при начале движения)
...
Рейтинг: 0 / 0
13.02.2007, 19:24
    #34328355
sashka304
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передвижение формы не только за заголовок
я пробовал в он маусмув, но перерисовка была ужасной
...
Рейтинг: 0 / 0
13.02.2007, 19:27
    #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
13.02.2007, 21:29
    #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
14.02.2007, 16:42
    #34331083
Termi_uc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
передвижение формы не только за заголовок
sashka304спасибо большое!
...
а с этой вещью не хотело
Код: plaintext
((TControl *)Sender)


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

А если так
Код: plaintext
((TControl *)Sender)->Perform(WM_SYSCOMMAND,0xF012, 0 );
то двигатся будет компонент
...
Рейтинг: 0 / 0
14.02.2007, 16:54
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / передвижение формы не только за заголовок / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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