Шаг 75.
Библиотека OWL.
Перемещение объектов средствами 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.




Предыдущий шаг Содержание Следующий шаг