• CRegionButton -一个多向按钮


    介绍 本文简要讨论了如何创建充当多向按钮的button类。大多数按钮在单击时执行任务。无论你在哪里点击这个按钮,任务都是一样的。如果任务碰巧是像在视窗的某个方向移动一个对象(例如,左),你需要每个方向一个按钮。可行,但有点笨拙。 稍微的改进可能是使用两个旋转按钮控件,一个是UDS_HORZ样式,另一个是UDS_VERT样式。这两个控件可以放在一起,产生类似: 虽然不是不正确,但这种方法有几个缺点。第一个是控件没有干净地重叠。很明显,一个控件实际上遮蔽了另一个控件。这可能被认为是一个小烦恼。 其次,每个控件都需要自己的CSpinButtonCtrl变量,这也意味着需要两个UDN_DELTAPOS处理程序。这些处理程序可能看起来像:复制Code

    void CRegionButtonTestDlg::OnDeltaposHorz(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        NM_UPDOWN *pNMUpDown = (NM_UPDOWN *) pNMHDR;
    
        if (0 < pNMUpDown->iDelta)
            ; // left
        else
            ; // right
     
        *pResult = 0;
    }
    
    void CRegionButtonTestDlg::OnDeltaposVert(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        NM_UPDOWN *pNMUpDown = (NM_UPDOWN *) pNMHDR;
    
        if (0 < pNMUpDown->iDelta)
            ; // down
        else
            ; // up
    
        *pResult = 0;
    }

    如果您需要在一个处理程序中进行更改,那么您可能也需要在另一个处理程序中进行更改。复制代码很少有乐趣。 更好的解决方案是使用一个根据单击位置而表现不同的控件。一个按钮很好地满足了这一需求。 我创建的类CRegionButton派生自CBitmapButton,非常容易使用。它有两个私有成员变量和一个公共方法。这两个成员变量用于跟踪按钮上的不同区域。它目前适用于4或9个区域,但其他数字只要是完全平方的就可以使用(例如,16,25)。 公共方法CalculateRegions()实际上是所有“魔法”发生的地方。它应该在LoadBitmaps()之后调用。这个方法将创建一个代表位图不同区域的CRect对象数组。 在4区域按钮的情况下,该按钮将被平均划分为4个区域,编号从0到3。 因此,如果用于按钮的位图是80x80像素,按钮的区域0将是l=0, t=0, r=39,和b=39。 一旦计算了区域,现在只需使用BN_CLICKED处理程序检测鼠标点击即可。其代码如下:Hide  收缩,复制Code

    void CRegionButton::OnClicked() 
    {
        CPoint  pt;
        DWORD   dwPos;
        
        // where was the mouse clicked
        dwPos = GetMessagePos();
    
        // get the X/Y screen coordinates
        pt.x = LOWORD(dwPos);
        pt.y = HIWORD(dwPos);
    
        // convert them to client coordinates
        ScreenToClient(&pt);
    
        // see if the mouse click is within any of the regions
        for (UINT x = 0; x < m_uRegionCount; x++)
        {
            // if so, send a message to the parent
            // including the region that was clicked
            if (m_pRegion[x].PtInRect(pt) != FALSE)
            {
                GetParent()->SendMessage(UDM_REGION_CLICKED, x);
                break;
            }
        }
    }

    发送到父节点的消息是通过调用RegisterWindowMessage()创建的注册消息。您可以在类的.h文件中看到此消息的实现。请注意,所单击的区域是作为WPARAM参数发送的。 此时,剩下要做的惟一事情就是响应消息。需要将ON_REGISTERED_MESSAGE()条目添加到对话框的消息映射中。其代码如下:Hide  复制Code

    LRESULT CRegionButtonTestDlg::OnRegionClicked( WPARAM wParam, LPARAM lParam )
    {
        CString     str;
    
        str.Format("You clicked in region %u", wParam);
    
        return (0);
    }

    现在,我们只有一个方法,不管我们点击按钮在哪里都会被调用,而且还会告诉我们点击了按钮的哪里。当使用时,这个按钮可能看起来像: 享受吧! 本文转载于:http://www.diyabc.com/frontweb/news526.html

  • 相关阅读:
    BigDecimal中的8中舍入模式详解
    使用二倍均值法完成红包算法
    使用Calendar类和它的子类GregorianCalendar类实现构建动态日历
    『MelodyHub』书写是对思维的缓存
    本站已接入音乐播放器API
    【LeetCode】35. 搜索插入位置
    配置NodeJs环境变量
    利用GitHub博客连接多仓库
    hexo 大型车祸现场
    随机图片API
  • 原文地址:https://www.cnblogs.com/Dincat/p/13451492.html
Copyright © 2020-2023  润新知