• MFC入门基础(十一)控件编程示例


    参考博客:VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)-软件开发-鸡啄米

    以下内容主要来自于上述大神博客,稍作修改

    1、首先还是新建一个mfc的应用程序(基于对话框的)

     

    2、删除掉对话框中原有的一些默认控件,然后再拖动两个 Group Box上来,更改Caption分别网站类型、网站,同时在类型中加入三个Radio Button,分别更改Caption为门户、论坛、博客,如下:ID分别设为IDC_PORTAL_RADIO、IDC_FORUM_RADIO和IDC_BLOG_RADIO。

     3、再拖动6个Check Box,Caption分别为:littlehero_121、“新浪”、“天涯论坛”、“韩寒博客”、“网易”和“凤凰网论坛”,然后为每个复选框添加CButton类型的变量m_check1、m_check2、m_check3、m_check4、m_check5和m_check6

     6、在拖动静态文本框和一个编辑框,静态文本框的Caption设为“选择的网页:编辑框的ID设为IDC_WEBSITE_SEL_EDIT,属性Read Only改为True,使此编辑框为只读状态,不允许用户编辑

    (吐槽一下,可能是我还不知道怎么用,这个界面怎么对齐,qt里面的对齐还是挺好用的)

    7、为“门户”、“论坛”和“博客”三个单选按钮分别添加点击消息的消息处理函数CExample23Dlg::OnBnClickedPortalRadio()、CExample23Dlg::OnBnClickedForumRadio()和CExample23Dlg::OnBnClickedBlogRadio()。  在某个单选按钮被点击之后,我们可以先将复选框都禁用且置为非选中状态,而后将选择的类型对应的复选框激活。为了代码复用,我们将置所有复选框为禁用且非选中状态的操作写到一个函数里,此函数为CExample23Dlg::InitAllCheckBoxStatus(),然后就可以在三个单选按钮的消息处理函数中调用InitAllCheckBoxStatus(),实现复选框状态的初始化

     具体实现函数如下:

    1. void Ctest04Dlg::OnBnClickedPortalRadio()
    2. {
    3. // TODO: 在此添加控件通知处理程序代码
    4. // 如果选择了“门户”单选按钮,则激活复选框“新浪”和“网易”,其他复选框禁用并非选中
    5. InitAllCheckBoxStatus();
    6. m_check2.EnableWindow(TRUE);
    7. m_check5.EnableWindow(TRUE);
    8. }
    9. void Ctest04Dlg::OnBnClickedForumRadio()
    10. {
    11. // TODO: 在此添加控件通知处理程序代码
    12. // 如果选择了“论坛”单选按钮,则激活复选框“天涯论坛”和“凤凰网论坛”,其他复选框禁用并非选中
    13. InitAllCheckBoxStatus();
    14. m_check3.EnableWindow(TRUE);
    15. m_check6.EnableWindow(TRUE);
    16. }
    17. void Ctest04Dlg::OnBnClickedBlogRadio()
    18. {
    19. // TODO: 在此添加控件通知处理程序代码
    20. // 如果选择了“博客”单选按钮,则激活复选框“littlehero_121”和“韩寒博客”,其他复选框禁用并非选中
    21. InitAllCheckBoxStatus();
    22. m_check1.EnableWindow(TRUE);
    23. m_check4.EnableWindow(TRUE);
    24. }
    25. void Ctest04Dlg::InitAllCheckBoxStatus()
    26. {
    27. // 全部禁用
    28. m_check1.EnableWindow(FALSE);
    29. m_check2.EnableWindow(FALSE);
    30. m_check3.EnableWindow(FALSE);
    31. m_check4.EnableWindow(FALSE);
    32. m_check5.EnableWindow(FALSE);
    33. m_check6.EnableWindow(FALSE);
    34. // 全部非选中
    35. m_check1.SetCheck(0);
    36. m_check2.SetCheck(0);
    37. m_check3.SetCheck(0);
    38. m_check4.SetCheck(0);
    39. m_check5.SetCheck(0);
    40. m_check6.SetCheck(0);
    41. }

     8. 程序运行后,我们希望网站类型默认选择为“门户”,则修改对话框初始化函数CExample23Dlg::OnInitDialog()为:

    1. BOOL Ctest04Dlg::OnInitDialog()
    2. {
    3. CDialogEx::OnInitDialog();
    4. // 将“关于...”菜单项添加到系统菜单中。
    5. // IDM_ABOUTBOX 必须在系统命令范围内。
    6. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    7. ASSERT(IDM_ABOUTBOX < 0xF000);
    8. CMenu* pSysMenu = GetSystemMenu(FALSE);
    9. if (pSysMenu != NULL)
    10. {
    11. BOOL bNameValid;
    12. CString strAboutMenu;
    13. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    14. ASSERT(bNameValid);
    15. if (!strAboutMenu.IsEmpty())
    16. {
    17. pSysMenu->AppendMenu(MF_SEPARATOR);
    18. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    19. }
    20. }
    21. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    22. // 执行此操作
    23. SetIcon(m_hIcon, TRUE); // 设置大图标
    24. SetIcon(m_hIcon, FALSE); // 设置小图标
    25. // TODO: 在此添加额外的初始化代码
    26. // 默认选中“门户”单选按钮
    27. CheckDlgButton(IDC_PORTAL_RADIO, 1);
    28. OnBnClickedPortalRadio();
    29. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
    30. }

    9、为确定和退出按钮添加事件,实现如下:

    1. //确定
    2. void Ctest04Dlg::OnBnClickedButton1()
    3. {
    4. // TODO: 在此添加控件通知处理程序代码
    5. CString strWebsiteSel; // 选择的网站
    6. // 若选中“littlehero_121”则将其加入结果字符串
    7. if (1 == m_check1.GetCheck())
    8. {
    9. strWebsiteSel += _T("littlehero_121 ");
    10. }
    11. // 若选中“新浪”则将其加入结果字符串
    12. if (1 == m_check2.GetCheck())
    13. {
    14. strWebsiteSel += _T("新浪 ");
    15. }
    16. // 若选中“天涯论坛”则将其加入结果字符串
    17. if (1 == m_check3.GetCheck())
    18. {
    19. strWebsiteSel += _T("天涯论坛 ");
    20. }
    21. // 若选中“韩寒博客”则将其加入结果字符串
    22. if (1 == m_check4.GetCheck())
    23. {
    24. strWebsiteSel += _T("韩寒博客 ");
    25. }
    26. // 若选中“网易”则将其加入结果字符串
    27. if (1 == m_check5.GetCheck())
    28. {
    29. strWebsiteSel += _T("网易 ");
    30. }
    31. // 若选中“凤凰网论坛”则将其加入结果字符串
    32. if (1 == m_check6.GetCheck())
    33. {
    34. strWebsiteSel += _T("凤凰网论坛 ");
    35. }
    36. // 将结果字符串显示于“选择的网站”后的编辑框中
    37. SetDlgItemText(IDC_WEBSITE_SEL_EDIT, strWebsiteSel);
    38. }
    1. //退出
    2. void Ctest04Dlg::OnBnClickedButton2()
    3. {
    4. // TODO: 在此添加控件通知处理程序代码
    5. exit(0);
    6. }

    10、最终实现效果,如下:

     

  • 相关阅读:
    30道高频Vue面试题快问快答
    如何使用Java反射机制获取一个类中全部方法呢?
    点成动态 | 点成生物参加第五届微流控技术应用创新论坛
    Android init.rc语言全解析
    【ES6.0】- 扩展运算符(...)
    嵌入式学习之Linux驱动(第九期_设备模型_教程更新了)_基于RK3568
    vs2010 webapi开发http请求以及website中如何实现http请求
    Vue组件间通信
    推荐一个AI人工智能技术网站(一键收藏,应有尽有)
    你用 Excel 做的最酷的事情是什么?
  • 原文地址:https://blog.csdn.net/Littlehero_121/article/details/127744629