如何使用 CSpinButtonCtrl 类在 MFC 中动态创建微调按钮控件?

Posted

技术标签:

【中文标题】如何使用 CSpinButtonCtrl 类在 MFC 中动态创建微调按钮控件?【英文标题】:How can I create a Spin Button Control dynamically in MFC using CSpinButtonCtrl class? 【发布时间】:2017-09-26 15:35:25 【问题描述】:

我意识到这是一个微不足道的问题,我什至看了一本 MFC 书(Prosise 的使用 MFC 编程 Windows)。但是,我真的找不到解决方案。

我正在尝试动态创建一个旋转按钮控件,这是一个简化的代码:

    CEdit* m_editControl = new CEdit();
    m_EditControl->Create(WS_VISIBLE | WS_CHILD , rectEdit, this, EditID);

    CSpinButtonCtrl* m_spinControlCtrl = new CSpinButtonCtrl;
    m_spinControlCtrl->Create(WS_VISIBLE | WS_CHILD, rectSpinButton, this, SpinID);

    m_spinControlCtrl->SetBase(10);
    m_spinControlCtrl->SetBuddy(m_editControl );
    m_spinControlCtrl->SetRange(-55, 55);

我的问题是旋转按钮不会改变 CEdit 的值。我错过了什么吗?如何动态创建微调按钮控件?

【问题讨论】:

【参考方案1】:

您的旋转控件缺少样式UDS_SETBUDDYINT

UDS_SETBUDDYINT 使上下控件设置 位置改变时的伙伴窗口(使用 WM_SETTEXT 消息)。 文本包含格式为小数的位置或 十六进制字符串。

我还建议设置UDS_ARROWKEYS,以便在焦点位于编辑控件上时可以使用箭头键来增加或减少值。

对于编辑控件,我将添加WS_TABSTOP,以便用户可以使用TAB 键和WS_EX_CLIENTEDGE 进行导航,以便编辑控件显示常规主题边框。

我还注意到您对控件使用动态内存分配,这不是必需的。只需创建像 CEdit m_EditControl; 这样的非指针成员变量,这样您就不必担心释放问题。

固定代码:

m_EditControl.CreateEx(WS_EX_CLIENTEDGE, L"Edit", L"0", WS_VISIBLE|WS_CHILD|WS_TABSTOP, 
                       rectEdit, this, EditID);

m_spinControlCtrl.Create(WS_VISIBLE|WS_CHILD|UDS_SETBUDDYINT|UDS_ARROWKEYS, 
                         rectSpinButton, this, SpinID);

m_spinControlCtrl.SetBase(10);
m_spinControlCtrl.SetBuddy(&m_EditControl);
m_spinControlCtrl.SetRange(-55, 55);

我也强烈建议学习使用 Spy++。这就是我实际得出这个答案的方式。使用资源编辑器,我只是将一个编辑控件和一个上下控件放到一个对话框中,并使用 Spy++ 观察默认窗口样式。

【讨论】:

以上是关于如何使用 CSpinButtonCtrl 类在 MFC 中动态创建微调按钮控件?的主要内容,如果未能解决你的问题,请参考以下文章

更改 CSpinButtonCtrl 的样式

猎豹MFC--数值调节按钮CSpinButtonCtrl

旋转按钮进度条滑块控件的使用

如何使用类在Java中对PriorityQueue进行排序[重复]

如何使用jsp中的bean类在数据库中插入值?

如何使用 CSS 类在 td 元素内对齐 div