Двигаем форму
перехватываешь мышевые события и обрабатываешь - при клике фиксируешь смещение левого верхнег угла относительно положения курсора, а при муве изменяешь на эту величину координаты этого угла... если надо могу экзампл скинуть...
Это даже проще сделать, обрабатывая сообщение 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 будут смещения. Просто остается их прибавить к текущим координатам окна.
X = LOWORD(lParam);
Y = LOWORD(lParam);
перехватываешь мышевые события и обрабатываешь - при клике фиксируешь смещение левого верхнег угла относительно положения курсора, а при муве изменяешь на эту величину координаты этого угла... если надо могу экзампл скинуть...
Да я в общем-то делал все это Обрабатывал события MouseDown MouseUp MouseMove, но она все равно не двигается. В одном примере я увидел функции GetDC ReleaseDC нафиг они нужны.
Да я в общем-то делал все это Обрабатывал события MouseDown MouseUp MouseMove, но она все равно не двигается. В одном примере я увидел функции GetDC ReleaseDC нафиг они нужны.
API-функции GetDC и ReleaseDC позволяют захватить и освободить контекст устройства какого-либо окна. К перемещению окон они не имеют отношения.
Это даже проще сделать, обрабатывая сообщение 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 будут смещения. Просто остается их прибавить к текущим координатам окна.
Окей. А куда вставлять данный код. Где его обрабатывать?
Окей. А куда вставлять данный код. Где его обрабатывать?
Это смотря как ты написал прогу. Если окно создано с использованием функций API, вызванных напрямую, то просто вставляешь это в WndProc главного окна. Кроме этого, нужно будет получить текущие координаты окна, но это несложно. А если создал, как обычно, то остается переопределить обработчики указанных сообщений с помощью BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. Лучше даже ьудет, наверное, заменить WM_NCHITTEST на обычное MW_MOUSEMOVE.
остается переопределить обработчики указанных сообщений с помощью BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. Лучше даже ьудет, наверное, заменить WM_NCHITTEST на обычное MW_MOUSEMOVE.
А можно маленький, кратенький и работающий пример?
А можно маленький, кратенький и работающий пример?
Это ты намекаешь на демагогию, которую я тут развел? :D
Это ты намекаешь на демагогию, которую я тут развел? :D
Ничего личного. Просто я ни разу не работал с BEGIN_MESSAGE_MAP и END_MESSAGE_MAP интересно на примере увидеть как это работает вот и все.
Ничего личного. Просто я ни разу не работал с 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.
Проблема вот какая: создал окно необычной формы (многоугольник) и сделал 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 за любое место");
}
//------------------------------------------------
Вот маленький работающий пример:
//------------------------------------------------
#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 за любое место");
}
//------------------------------------------------
крутая штучка.
Проблема вот какая: создал окно необычной формы (многоугольник) и сделал BorderStyle bsNone. И вот пропала возможность перетаскивать окно. Как это лечиться.
А не мог бы ты если не трудно привести пример создания такого окна различных форм...
А не мог бы ты если не трудно привести пример создания такого окна различных форм...
Это просто есть раличные API функции, such as CreateRectRgn, там еще многоугольники эллипсы и т.д. возращают они переменную типа HRGN. Когда ее получишь, подставляешь в функцию SetWindowRgn, по справке посмотришь. В принципе все, а там уж дело вкуса
А не мог бы ты если не трудно привести пример создания такого окна различных форм...
Это просто есть раличные API функции, such as CreateRectRgn, там еще многоугольники эллипсы и т.д. возращают они переменную типа HRGN. Когда ее получишь, подставляешь в функцию SetWindowRgn, по справке посмотришь. В принципе все, а там уж дело вкуса