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

  • 相关阅读:
    数组和切片
    if else,for循环,switch语句
    数据库介绍以及MySQL数据库的使用
    Django Rest Framwork的认证组件 权限组件以及频率组件
    Django Rest Frawwork框架的CBV FBV分析
    事务介绍
    celery介绍
    多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型
    win10安装mysql8.0版本
    安装VMware Tools的注意事项
  • 原文地址:https://www.cnblogs.com/Dincat/p/13473328.html
Copyright © 2011-2022 走看看