介绍 我遇到过许多关于“如何使对话框上的控件可移动”和“如何使一组控件在运行时可移动”的查询。这里有一个同样的尝试,以最简单的形式;然而,这可以根据需求进行建模。 背景 根据Windows预定义的行为,我们可以在运行时使用它们的标题/标题栏移动对话框/框架窗口。在某些情况下,您可能想要移动没有标题/标题栏的控件/一组控件。这里的示例代码解决了这个问题。 使用的代码 代码是使用Microsoft Visual Studio 6.0编写和编译的。 使用窗口的对话框布局编辑器将控件放置在对话框上。 您可以关联成员变量,根据您的要求,与这些控制: 隐藏,复制Code
// MovableTrialDlg.h CStatic m_staticMovable; CEdit m_editMovable;
在类CMovableTrialDlg中定义其他成员变量。 隐藏,复制Code
// MovableTrialDlg.h bool m_bMoving;
请在代码中包含PreTranslateMessage()。 隐藏,复制Code
// MovableTrialDlg.h virtual BOOL PreTranslateMessage(MSG* pMsg);
PreTranslateMessage()为需要移动的控件执行所需的操作。 隐藏,复制Code
BOOL CMovableTrialDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->hwnd == m_editMovable.m_hWnd) { if(pMsg->message == WM_LBUTTONUP) { OnMovableStaticLButtonUp(pMsg); } if(pMsg->message == WM_LBUTTONDOWN) { OnMovableStaticLButtonDown(pMsg); } if(pMsg->message == WM_MOUSEMOVE) { OnMovableStaticMouseMove(pMsg); } } return CDialog::PreTranslateMessage(pMsg); }
当鼠标移动和移动窗口的状态m_bMoving为真时,通过改变控件的窗口位置来执行移动。 隐藏,收缩,复制Code
void CMovableTrialDlg::OnMovableStaticMouseMove(MSG* pMsg) { if(m_bMoving == false) return; WINDOWPLACEMENT wp; ::GetWindowPlacement(m_editMovable.m_hWnd, &wp); int nXDiff = wp.rcNormalPosition.right - wp.rcNormalPosition.left; int nYDiff = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top; POINT pt = pMsg->pt; ScreenToClient(&pt); wp.rcNormalPosition.left = pt.x - 5; wp.rcNormalPosition.top = pt.y - 5; wp.rcNormalPosition.right = wp.rcNormalPosition.left + nXDiff; wp.rcNormalPosition.bottom= wp.rcNormalPosition.top + nYDiff; ::SetWindowPlacement(m_editMovable.m_hWnd, &wp); ::GetWindowPlacement(m_staticMovable.m_hWnd, &wp); nXDiff = wp.rcNormalPosition.right - wp.rcNormalPosition.left; nYDiff = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top; pt = pMsg->pt; ScreenToClient(&pt); wp.rcNormalPosition.left = pt.x - 5; wp.rcNormalPosition.top = pt.y - nYDiff - 5; wp.rcNormalPosition.right = wp.rcNormalPosition.left + nXDiff; wp.rcNormalPosition.bottom= wp.rcNormalPosition.top + nYDiff; ::SetWindowPlacement(m_staticMovable.m_hWnd, &wp); m_editMovable.Invalidate(); m_staticMovable.Invalidate(); }
一旦鼠标左键按下事件发生在编辑控件上,设置移动状态,m_bMoving,为真。 隐藏,复制Code
void CMovableTrialDlg::OnMovableStaticLButtonDown(MSG* pMsg) { m_bMoving = true; }
类似地,当鼠标左键向上时,改变移动状态m_bMoving为false。 隐藏,复制Code
void CMovableTrialDlg::OnMovableStaticLButtonUp(MSG* pMsg) { m_bMoving = false; }
历史 我将提供代码,使这组控件看起来像一个带有非mdi框架/对话框的子容器,并且可以使用标题/标题栏移动。将模拟标题/标题栏。 本文转载于:http://www.diyabc.com/frontweb/news11253.html