Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Двигаем форму

2.1K
28 марта 2003 года
domovoi
27 / / 27.03.2003
Проблема вот какая: создал окно необычной формы (многоугольник) и сделал BorderStyle bsNone. И вот пропала возможность перетаскивать окно. Как это лечиться.
317
28 марта 2003 года
Relax
573 / / 20.09.2000
перехватываешь мышевые события и обрабатываешь - при клике фиксируешь смещение левого верхнег угла относительно положения курсора, а при муве изменяешь на эту величину координаты этого угла... если надо могу экзампл скинуть...
443
28 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by Relax
перехватываешь мышевые события и обрабатываешь - при клике фиксируешь смещение левого верхнег угла относительно положения курсора, а при муве изменяешь на эту величину координаты этого угла... если надо могу экзампл скинуть...


Это даже проще сделать, обрабатывая сообщение WM_NCHITTEST. Просто надо ввести bool переменную, которая будет равна true при обработке WM_LBUTTONDOWN и false при WM_LBUTTONUP для обозначения состояния кнопки. Еще два интегера для хранения предыдущих координат. Относительно них и высчитывать смещение.

bool ButtonState;
int X, Y;
int XOff, YOff;

case WM_LBUTTONDOWN:
ButtonState = true;
X = LOWORD(lParam);
Y = HIWORD(lParam);

case WM_LBUTTONUP:
ButtonState = false;

case WM_NCHITTEST:
XOff = (LOWORD(lParam) - X) * ButtonState;
YOff = (HIWORD(lParam) - Y) * ButtonState;
X = LOWORD(lParam);
Y = LOWORD(lParam);

Все. В XOff и YOff будут смещения. Просто остается их прибавить к текущим координатам окна.

443
28 марта 2003 года
REmindER
292 / / 23.03.2003
Ой. Пардон. В конце не надо присвоения:
X = LOWORD(lParam);
Y = LOWORD(lParam);
2.1K
29 марта 2003 года
domovoi
27 / / 27.03.2003
Цитата:
Originally posted by Relax
перехватываешь мышевые события и обрабатываешь - при клике фиксируешь смещение левого верхнег угла относительно положения курсора, а при муве изменяешь на эту величину координаты этого угла... если надо могу экзампл скинуть...


Да я в общем-то делал все это Обрабатывал события MouseDown MouseUp MouseMove, но она все равно не двигается. В одном примере я увидел функции GetDC ReleaseDC нафиг они нужны.

443
29 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by domovoi

Да я в общем-то делал все это Обрабатывал события MouseDown MouseUp MouseMove, но она все равно не двигается. В одном примере я увидел функции GetDC ReleaseDC нафиг они нужны.



API-функции GetDC и ReleaseDC позволяют захватить и освободить контекст устройства какого-либо окна. К перемещению окон они не имеют отношения.

2.1K
30 марта 2003 года
domovoi
27 / / 27.03.2003
Цитата:
Originally posted by REmindER

Это даже проще сделать, обрабатывая сообщение WM_NCHITTEST. Просто надо ввести bool переменную, которая будет равна true при обработке WM_LBUTTONDOWN и false при WM_LBUTTONUP для обозначения состояния кнопки. Еще два интегера для хранения предыдущих координат. Относительно них и высчитывать смещение.

bool ButtonState;
int X, Y;
int XOff, YOff;

case WM_LBUTTONDOWN:
ButtonState = true;
X = LOWORD(lParam);
Y = HIWORD(lParam);

case WM_LBUTTONUP:
ButtonState = false;

case WM_NCHITTEST:
XOff = (LOWORD(lParam) - X) * ButtonState;
YOff = (HIWORD(lParam) - Y) * ButtonState;
X = LOWORD(lParam);
Y = LOWORD(lParam);

Все. В XOff и YOff будут смещения. Просто остается их прибавить к текущим координатам окна.


Окей. А куда вставлять данный код. Где его обрабатывать?

443
30 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by domovoi

Окей. А куда вставлять данный код. Где его обрабатывать?


Это смотря как ты написал прогу. Если окно создано с использованием функций API, вызванных напрямую, то просто вставляешь это в WndProc главного окна. Кроме этого, нужно будет получить текущие координаты окна, но это несложно. А если создал, как обычно, то остается переопределить обработчики указанных сообщений с помощью BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. Лучше даже ьудет, наверное, заменить WM_NCHITTEST на обычное MW_MOUSEMOVE.

1.9K
31 марта 2003 года
XilefNori
34 / / 28.02.2003
Цитата:
Originally posted by REmindER

остается переопределить обработчики указанных сообщений с помощью BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. Лучше даже ьудет, наверное, заменить WM_NCHITTEST на обычное MW_MOUSEMOVE.



А можно маленький, кратенький и работающий пример?

443
31 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by XilefNori


А можно маленький, кратенький и работающий пример?


Это ты намекаешь на демагогию, которую я тут развел? :D

1.9K
31 марта 2003 года
XilefNori
34 / / 28.02.2003
Цитата:
Originally posted by REmindER

Это ты намекаешь на демагогию, которую я тут развел? :D



Ничего личного. Просто я ни разу не работал с BEGIN_MESSAGE_MAP и END_MESSAGE_MAP интересно на примере увидеть как это работает вот и все.

443
31 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by XilefNori


Ничего личного. Просто я ни разу не работал с BEGIN_MESSAGE_MAP и END_MESSAGE_MAP интересно на примере увидеть как это работает вот и все.


Как обычно:

class TForm1 : public TForm
{
private:
...
public:
...

MESSAGE void MyMouseMove(TMessage &Message);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MOUSEMOVE, TMessage, MyMouseMove);
END_MESSAGE_MAP(TForm);
}

Теперь все сообщения о движении мыши у тебя будут лететь прямо в TForm1::MyMouseMove.

2.5K
28 апреля 2003 года
VladСD
24 / / 20.04.2003
Цитата:
Originally posted by domovoi
Проблема вот какая: создал окно необычной формы (многоугольник) и сделал BorderStyle bsNone. И вот пропала возможность перетаскивать окно. Как это лечиться.


Вот маленький работающий пример:
//------------------------------------------------

#ifndef Unit1H
#define Unit1H
//------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TEdit *Edit1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
void __fastcall AllMove(TMessage &Msg);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCHITTEST,TMessage,AllMove)
END_MESSAGE_MAP(TForm)
};
//------------------------------------------------
extern PACKAGE TForm1 *Form1;
//------------------------------------------------
#endif
//------------------------------------------------
//------------------------------------------------
//------------------------------------------------
//------------------------------------------------
//------------------------------------------------
//Unit1.cpp---------------------------------------
#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::AllMove(TMessage &msg)
{TForm::Dispatch(&msg);
if(msg.Result==1)msg.Result=2;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage("Эту форму\n можно двигать\n за любое место");
}
//------------------------------------------------

2.4K
29 апреля 2003 года
Aiswer
15 / / 25.04.2003
Цитата:
Originally posted by VladСD

Вот маленький работающий пример:
//------------------------------------------------

#ifndef Unit1H
#define Unit1H
//------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TEdit *Edit1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
void __fastcall AllMove(TMessage &Msg);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCHITTEST,TMessage,AllMove)
END_MESSAGE_MAP(TForm)
};
//------------------------------------------------
extern PACKAGE TForm1 *Form1;
//------------------------------------------------
#endif
//------------------------------------------------
//------------------------------------------------
//------------------------------------------------
//------------------------------------------------
//------------------------------------------------
//Unit1.cpp---------------------------------------
#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::AllMove(TMessage &msg)
{TForm::Dispatch(&msg);
if(msg.Result==1)msg.Result=2;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage("Эту форму\n можно двигать\n за любое место");
}
//------------------------------------------------

крутая штучка.

647
30 апреля 2003 года
vital
73 / / 22.03.2003
Цитата:
Originally posted by domovoi
Проблема вот какая: создал окно необычной формы (многоугольник) и сделал BorderStyle bsNone. И вот пропала возможность перетаскивать окно. Как это лечиться.




А не мог бы ты если не трудно привести пример создания такого окна различных форм...

2.1K
05 мая 2003 года
domovoi
27 / / 27.03.2003
Цитата:
Originally posted by vital



А не мог бы ты если не трудно привести пример создания такого окна различных форм...



Это просто есть раличные API функции, such as CreateRectRgn, там еще многоугольники эллипсы и т.д. возращают они переменную типа HRGN. Когда ее получишь, подставляешь в функцию SetWindowRgn, по справке посмотришь. В принципе все, а там уж дело вкуса

2.1K
05 мая 2003 года
domovoi
27 / / 27.03.2003
Цитата:
Originally posted by vital



А не мог бы ты если не трудно привести пример создания такого окна различных форм...



Это просто есть раличные API функции, such as CreateRectRgn, там еще многоугольники эллипсы и т.д. возращают они переменную типа HRGN. Когда ее получишь, подставляешь в функцию SetWindowRgn, по справке посмотришь. В принципе все, а там уж дело вкуса

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог