zoukankan      html  css  js  c++  java
  • 创建活动子窗口控件

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

  • 相关阅读:
    【Python】 命名空间与LEGB规则
    【Python&数据结构】 抽象数据类型 Python类机制和异常
    【算法】 算法和数据结构绪论
    【网络】 数据链路层&物理层笔记
    svn -- svn图标解析
    svn -- svn数据仓库
    svn -- svn安装与配置
    svn -- svn简介
    mysql -- 远程访问mysql的解决方案
    css3 -- 自动生成序号(不使用JS,可任意排序)
  • 原文地址:https://www.cnblogs.com/Dincat/p/13473328.html
Copyright © 2011-2022 走看看