有人问我,怎么才能使对话框上的控件可以通过鼠标来拖动. 他的方法是:
1) 从标准控件类派生新的类.
2) 处理控件的鼠标消息来实现拖动效果.
这样做当然可以实现,但似乎不太符合常规, 且需要对需要可拖动的所有控件进行子类化以便能响
应控件的鼠标消息. 在这里, 我写了一个类,专门用来处理对控件的拖动, 使用该类只需要少许修
改包含需要拖动的控件的对话框,而不需要对控件再做任何其它处理.
原理是这样的: 通过预处理发往对话框及其上控件的鼠标消息, 如果发现单击落在某个需要拖动的
控件上, 则启动拖动过程, 跟踪鼠标的运动, 并同时对控件做相应的位置调整. 当鼠标松开后,整
个拖动过程结束.
类 CMoveCtrlHandler 用来控制整个拖动的过程, 源代码如下:
// MoveCtrlHandler.h: interface for the CMoveCtrlHandler class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MOVECTRLHANDLER_H__D2C119F0_5B9B_4759_A8EB_8B71F45402B6__INCLUDED_)
#define AFX_MOVECTRLHANDLER_H__D2C119F0_5B9B_4759_A8EB_8B71F45402B6__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxtempl.h>
typedef CArray<HWND, HWND>
// for support move controls in the window
class CMoveCtrlHandler
{
public:
private:
private:
};
#endif //
!defined(AFX_MOVECTRLHANDLER_H__D2C119F0_5B9B_4759_A8EB_8B71F45402B6__INCLUDED_)
// MoveCtrlHandler.cpp: implementation of the CMoveCtrlHandler class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MoveCtrlHandler.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// find the index of the element from a array
template<class T>
int FindArray(CArray<T, T>& arr, T t)
{
}
// get the mouse point form a message structure.
static POINT
{
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMoveCtrlHandler::CMoveCtrlHandler()
{
}
CMoveCtrlHandler::~CMoveCtrlHandler()
{
}
void CMoveCtrlHandler::Initialize(HWND
{
}
void CMoveCtrlHandler::AddCtrl(HWND
{
}
BOOL CMoveCtrlHandler::HookMessage(MSG* pMsg)
{
}
BOOL CMoveCtrlHandler::HookLoop(HWND hCtrl, POINT pt)
{
}
void CMoveCtrlHandler::DoMoveCtrl(HWND hCtrl, POINT ptOrig, POINT ptNew)
{
TRUE);
}
按如下步骤为你的对话框添加控件可拖动的功能:
1) 在对话框类声明一个CMoveCtrlHandler 成员对象.
class CMoveCtrlDlg : public CDialog
{
};
2) 对话框初始化消息内添加初始化拖动控件代码并将需要拖动的控件添加到控制列表:
BOOL CMoveCtrlDlg::OnInitDialog()
{
IDC_STATIC.
}
3) 添加虚函数PreTranslateMessage 的超越:
BOOL CMoveCtrlDlg::PreTranslateMessage(MSG* pMsg)
{
}