创建活动子窗口控件

介绍 我遇到过许多关于“如何使对话框上的控件可移动”和“如何使一组控件在运行时可移动”的查询。这里有一个同样的尝试,以最简单的形式;然而,这可以根据需求进行建模。 背景 根据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

posted @ 2020-08-11 04:22  Dincat  阅读(204)  评论(0编辑  收藏  举报