如何通过宏设置CSpinButtonCtrl范围(无需创建控件变量)
我的对话框上有四个CSpinButtonCtrl控件,均配置为Auto Buddy和Buddy Integer;对应的CEdit控件映射到int变量,取值范围设为0-20,需同步设置数值调节钮的范围。已知可通过映射CSpinButtonCtrl变量调用SetRange实现,但希望避免创建变量,是否可编写接收HWND的宏来统一设置范围为0-20?
完全可以实现,直接利用MFC的CWnd::FromHandle将HWND转换为临时CSpinButtonCtrl对象,无需手动创建成员变量。
宏定义
在项目头文件中添加如下宏:
#define SET_SPIN_RANGE_0_TO_20(hwndSpin) \ do { \ CSpinButtonCtrl* pSpin = static_cast<CSpinButtonCtrl*>(CWnd::FromHandle(hwndSpin)); \ if (pSpin != nullptr) { \ pSpin->SetRange(0, 20); \ } \ } while(0)
do-while(0)包裹是为了避免宏在条件语句中出现语法错误CWnd::FromHandle会返回与HWND绑定的临时CWnd派生类对象指针,无需额外定义变量
使用示例
在对话框的OnInitDialog函数中,通过控件ID获取HWND后调用宏:
BOOL CYourDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 替换为你实际的四个数值调节钮ID SET_SPIN_RANGE_0_TO_20(GetDlgItem(IDC_SPIN1)->m_hWnd); SET_SPIN_RANGE_0_TO_20(GetDlgItem(IDC_SPIN2)->m_hWnd); SET_SPIN_RANGE_0_TO_20(GetDlgItem(IDC_SPIN3)->m_hWnd); SET_SPIN_RANGE_0_TO_20(GetDlgItem(IDC_SPIN4)->m_hWnd); return TRUE; }
额外说明
- 由于控件已配置Auto Buddy和Buddy Integer,设置范围后会自动同步关联CEdit的输入限制,无需额外处理
- 这种方式完全省去了为每个CSpinButtonCtrl添加成员变量的步骤,满足你的需求
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

