Перемещение объектов средствами OWL

   
На этом шаге мы рассмотрим приложение, реализующее перемещение конопки в клиентской области окна.

   
Дмитрий Овчаренко, студент 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.

   
Замечание.
Средствами библиотеки OWL можно перемещать не все компоненты,
являющиеся элементами управления окна. Перемещение возможно реализовать
только у тех объектов, в конcтрукторе которых указываются координаты расположения на форме.
Компоненты, реализующие строки состояния, панели управления,
приспособления-кнопки (компонент TButtonGadget), строки сообщения перемещать нельзя.
Положение этих компонентов задается в конструкторе окна и программно средствами OWL
не перемещается. В этом можно убедится, ознакомившись с методами классов вышеупомянутых компонентов.

   
На следующем шаге мы рассмотрим реализацию интерфейса Drag&Drop.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий