На этом шаге мы рассмотрим приложение, реализующее перемещение конопки в клиентской области окна.
Дмитрий Овчаренко, студент 4 курса факультета математики и информационных технологий Курганского государственного университета (декабрь 2005 г.) разработал приложение, реализующее перемещение объекта в клиентской области окна.
Смысл перемещения объекта по форме с точки зрения программы заключается в реализации удаления объекта с формы и создания этого же объкта в другом месте формы,определяемого положением указателя мыши во время его перемещения.
Рассмотрим реализацию перемещения объекта средствами библиотеки OWL.
Данный пример представляет собой текст программы, которая перемещает кнопку (объект класса TButton) в клиентской области окна.
#include <owl\applicat.h> #include <owl\framewin.h> #include <owl\button.h> #include "pr75_1.rc" class TApp : public TApplication { public : TApp() : TApplication() {}; void InitMainWindow(); }; class TypeWin : public TFrameWindow { public : TypeWin(TWindow *parent, const char far *title); protected : TButton *b1; BOOL flag; BOOL CanClose(); DECLARE_RESPONSE_TABLE(TypeWin); void SetupWindow(); void PushBut(); void EvMouseMove(UINT,TPoint &point); }; DEFINE_RESPONSE_TABLE1(TypeWin,TFrameWindow) EV_COMMAND(CM_PUSHB1,PushBut), EV_WM_MOUSEMOVE, END_RESPONSE_TABLE; TypeWin::TypeWin(TWindow *parent, const char far *title): TFrameWindow(parent, title) { Attr.X=50; Attr.Y=50; Attr.W=450; Attr.H=450; flag=FALSE; b1=new TButton(this,CM_PUSHB1,"Кнопка",250,200,60,30); } void TypeWin::EvMouseMove(UINT,TPoint &point) { if (flag==TRUE) { delete b1; b1=new TButton(this,CM_PUSHB1,"Кнопка",point.x,point.y,60,30); SetupWindow(); } } void TypeWin::PushBut() { switch (flag) { case FALSE : flag=TRUE; break; case TRUE : flag=FALSE; break; } } void TypeWin::SetupWindow() { TFrameWindow::SetupWindow(); } BOOL TypeWin::CanClose() { int result=MessageBox("Закрыть окно ?", "Сообщение",MB_YESNO | MB_ICONQUESTION); if (result==IDYES) return TRUE; else return FALSE; } void TApp::InitMainWindow() { TypeWin *window =new TypeWin(0,"Перещение объекта"); SetMainWindow(window); } int OwlMain(int, char* []) { return TApp().Run(); }
Файл ресурсов:
#ifndef WORKSHOP_INVOKED #include "windows.h" #endif #define CM_PUSHB1 101
Когда вы запустите эту программу, то увидите окно, изображенное на рисунке 1.
Рис.1. Результат работы приложения
После нажатия на кнопку и перещения указателя мыши по форме, она (кнопка) начинает перемещатся за указателем. Повторное нажатие кнопки разрывает связь между ней и указателем мыши.
Рассмотрим основные принципы работы программы.
Кнопка имеет идентификатор CM_PUSHB1, присвоенный ей после инициализации окна:
TypeWin::TypeWin(TWindow *parent, const char far *title): TFrameWindow(parent, title) { Attr.X=50; Attr.Y=50; Attr.W=450; Attr.H=450; flag=FALSE; b1=new TButton(this,CM_PUSHB1,"Кнопка",250,200,60,30); }
После нажатия на кнопку происходит событие EV_COMMAND(CM_PUSHB1,PushBut), которому сопоставленно выполнение процедуры PushBut():
void TypeWin::PushBut()
{
switch (flag)
{
case FALSE : flag=TRUE; break;
case TRUE : flag=FALSE; break;
}
}
устанавливающей соответствующее значение логической переменной flag.
С помощью данной переменной определяется поведение кнопки. Если значение flag истинно, кнопка будет перемещаятся за указателем, иначе кнопка останется на своем месте.
Эти действия производятся в результате реакции на событие перемещение указателя в окне:
void TypeWin::EvMouseMove(UINT,TPoint &point) { if (flag==TRUE) { delete b1; b1=new TButton(this,CM_PUSHB1,"Кнопка",point.x,point.y,60,30); SetupWindow(); } }
В данной процедуре реализовано, собственно, перемещение объекта. Если значение flag истинно, объект b1 класса TButton удаляется из окна. Затем происходит его повторное создание и размещение в том месте, где в данный момент находится указатель мыши:
b1=new TButton(this,CM_PUSHB1,"Кнопка",point.x,point.y,60,30);
Координаты указателя содержатся в параметре point типа TPoint, числа 60 и 30 - длина и ширина кнопки.
После этого нужно провести инициализацию управляющих элементов окна, путем выполнения функции SetupWindow().
В каждый момент времени, перемещения курсора по форме, кнопка будет удаляться и создаваться в новом месте. Что бы кнопка не перемещалась достаточно нажать на нее и тем самым изменить значение переменной flag.
На следующем шаге мы рассмотрим реализацию интерфейса Drag&Drop.