宏定义中的选择判断句

144 篇文章 0 订阅
1 篇文章 0 订阅
#define kViewWidth (isLowIPhone6?(375.0f): iWidthScreen)

#define kViewWidth isLowIPhone6?(375.0f): iWidthScreen

这两个宏定义使用中的结果一样吗?

float edge = kViewWidth - iWidthScreen;

1、当设备是iPhone6或以上时
前者的结果是 375.0f - iWidthScreen;// edge = (1?(375.0f): iWidthScreen) - iWidthScreen;
后者的结果是 375.0f; // edge = 1?(375.0f): iWidthScreen - iWidthScreen;

2、当设备低于iPhone6时
前者的结果是 0;// edge = (0?(375.0f): iWidthScreen) - iWidthScreen;
后者的结果是0;// edge = 0?(375.0f): iWidthScreen - iWidthScreen;

因为选择判断符比运算符的优先级低,所以会产生不是所要的结果,所以要写包含判断语句的宏定义时,一定要记住在选择判断句结束位置加上括号。

以下是一个简单的实现,仅供参考。 首先,在Visual Studio创建一个MFC应用程序,选择对话框模板。 然后,在资源视图打开对话框,添加一个静态文本框、36个复选框和一个按钮。在属性视图设置它们的属性。 在对话框类的头文件添加以下代码: ```cpp // 定义复选框数量和选的复选框数量 #define CHECKBOX_NUM 36 #define SELECTED_NUM 7 class CLotteryDlg : public CDialogEx { public: CLotteryDlg(CWnd* pParent = nullptr); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_LOTTERY_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() private: // 复选框数组 CButton m_checkBoxes[CHECKBOX_NUM]; // 选的复选框数量 int m_selectedNum; // 按钮 CButton m_button; }; ``` 在对话框类的源文件添加以下代码: ```cpp BOOL CLotteryDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化复选框数组 for (int i = 0; i < CHECKBOX_NUM; i++) { CString str; str.Format(_T("%d"), i + 1); m_checkBoxes[i].Create(str, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, CRect(30 + (i % 6) * 50, 60 + (i / 6) * 30, 70 + (i % 6) * 50, 90 + (i / 6) * 30), this, i + 1000); } // 初始化按钮 m_button.Create(_T("摇号"), WS_CHILD | WS_VISIBLE, CRect(130, 250, 230, 280), this, IDC_BUTTON); // 初始化选的复选框数量 m_selectedNum = 0; return TRUE; } void CLotteryDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CLotteryDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON, &CLotteryDlg::OnBnClickedButton) END_MESSAGE_MAP() void CLotteryDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 将图标居 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } HCURSOR CLotteryDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CLotteryDlg::OnBnClickedButton() { // 统计选的复选框数量 m_selectedNum = 0; for (int i = 0; i < CHECKBOX_NUM; i++) { if (m_checkBoxes[i].GetCheck() == BST_CHECKED) { m_selectedNum++; } } // 判断的复选框数量是否为7 if (m_selectedNum != SELECTED_NUM) { AfxMessageBox(_T("请选择7个号码")); } else { // 打开奖结果对话框 CResultDlg dlg; dlg.DoModal(); } } ``` 接下来,创建一个新的对话框类,用于显示奖结果。在资源视图添加一个静态文本框和一个按钮。在属性视图设置它们的属性。 在对话框类的头文件添加以下代码: ```cpp class CResultDlg : public CDialogEx { public: CResultDlg(CWnd* pParent = nullptr); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_RESULT_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 生成的消息映射函数 virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() private: // 随机数数组 int m_numbers[SELECTED_NUM]; // 复选框数组 CButton m_checkBoxes[CHECKBOX_NUM]; // 按钮 CButton m_button; }; ``` 在对话框类的源文件添加以下代码: ```cpp BOOL CResultDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化复选框数组 for (int i = 0; i < CHECKBOX_NUM; i++) { CString str; str.Format(_T("%d"), i + 1); m_checkBoxes[i].Create(str, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, CRect(30 + (i % 6) * 50, 60 + (i / 6) * 30, 70 + (i % 6) * 50, 90 + (i / 6) * 30), this, i + 1000); m_checkBoxes[i].EnableWindow(FALSE); } // 初始化按钮 m_button.Create(_T("重试"), WS_CHILD | WS_VISIBLE, CRect(130, 250, 230, 280), this, IDC_BUTTON); // 生成随机数 srand((unsigned)time(NULL)); for (int i = 0; i < SELECTED_NUM; i++) { m_numbers[i] = rand() % 36 + 1; } // 显示随机数 CString strNumbers; for (int i = 0; i < SELECTED_NUM; i++) { strNumbers.AppendFormat(_T("%d "), m_numbers[i]); } SetDlgItemText(IDC_STATIC_NUMBERS, strNumbers); return TRUE; } void CResultDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); // DDX函数不需要处理随机数数组和按钮 for (int i = 0; i < CHECKBOX_NUM; i++) { DDX_Control(pDX, i + 1000, m_checkBoxes[i]); } } BEGIN_MESSAGE_MAP(CResultDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON, &CResultDlg::OnBnClickedButton) END_MESSAGE_MAP() void CResultDlg::OnBnClickedButton() { // 关闭当前对话框 EndDialog(IDOK); } ``` 最后,在对话框类的头文件添加以下宏定义: ```cpp #define IDC_BUTTON 1000 #define SELECTED_NUM 7 ``` 现在,整个程序就完成了。您可以编译并运行它,测试它是否符合您的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值