Windows单选按钮、复选框、分组框控件

来源:互联网 发布:2018中国人工智能大会 编辑:程序博客网 时间:2024/05/25 16:38
单选按钮(Radio Button)和复选框(Check Box)是常见的Windows控件,用于从给出的选项中选择一项或多项,如下图所示:


单选按钮是互斥的,只能选择其中一项;而复选框没有限制,可以选择一项或多项。

单选按钮和复选框都是一种特殊的按钮,窗口类名称都是button,只不过增加了一些特殊的窗口样式罢了。单选按钮的样式为BS_AUTORADIOBUTTON,复选框的样式为BS_AUTOCHECKBOX。例如:
  1. //创建一个单选按钮
  2. CreateWindow(
  3. TEXT("button"), TEXT("单选按钮"),
  4. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON/*单选按钮*/,
  5. 235, 40, 100, 26,
  6. hWnd, (HMENU)7, hInst, NULL
  7. );
  8. //创建一个复选框
  9. CreateWindow(
  10. TEXT("button"), TEXT("复选框"),
  11. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX/*复选框*/,
  12. 95, 70, 50, 26,
  13. hWnd, (HMENU)9, hInst, NULL
  14. );

如上图所示,单选按钮一般是分组的,一组单选按钮之间是互斥的,只能选择其中一个。一个窗口可以包含多组单选按钮。

要想为单选按钮分组,可以增加WS_GROUP样式。设置了 WS_GROUP 样式的单选框为一组中的首元素,随后的所有单选按钮都和它在同一组,直到下一个设置了 WS_GROUP 样式的单选按钮。

下面的代码,将实现上图中所示的单选按钮和复选框:
  1. //窗口过程
  2. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
  3. PAINTSTRUCT ps;
  4. HDC hdc;
  5. static HFONT hFont; //逻辑字体
  6. //一组单选按钮
  7. static HWND labSex; //静态文本框--性别
  8. static HWND radioMale; //单选按钮--男
  9. static HWND radioFemale; //单选按钮--女
  10. //一组单选按钮
  11. static HWND labMarriage; //静态文本框--婚姻状况
  12. static HWND radioMarried; //单选按钮--已婚
  13. static HWND radioSingle; //单选按钮--未婚
  14. static HWND radioSecrecy; //单选按钮--保密
  15. //一组复选框
  16. static HWND labPet; //静态文本框--你的宠物
  17. static HWND checkboxDog; //复选框--狗
  18. static HWND checkboxCat; //复选框--猫
  19. static HWND checkboxFish; //复选框--鱼
  20. static HWND checkboxOther; //复选框--其他
  21. switch (message){
  22. case WM_CREATE:
  23. hFont = CreateFont(
  24. -14, -7, 0, 0, 400,
  25. FALSE, FALSE, FALSE,DEFAULT_CHARSET,
  26. OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
  27. FF_DONTCARE, TEXT("微软雅黑")
  28. );
  29. //选择性别
  30. labSex = CreateWindow(
  31. TEXT("static"), TEXT("你的性别:"),
  32. WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_RIGHT/*文字居右*/,
  33. 10, 10, 80, 26,
  34. hWnd, (HMENU)1, hInst, NULL
  35. );
  36. radioMale = CreateWindow(
  37. TEXT("button"), TEXT("男"),
  38. WS_CHILD | WS_VISIBLE | BS_LEFT/*文字居左*/ | BS_AUTORADIOBUTTON /*单选按钮*/ | WS_GROUP,
  39. 95, 10, 50, 26,
  40. hWnd, (HMENU)2, hInst, NULL
  41. );
  42. radioFemale = CreateWindow(
  43. TEXT("button"), TEXT("女"),
  44. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
  45. 150, 10, 50, 26,
  46. hWnd, (HMENU)2, hInst, NULL
  47. );
  48. //选择婚姻状况
  49. labMarriage = CreateWindow(
  50. TEXT("static"), TEXT("婚姻状况:"),
  51. WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_RIGHT,
  52. 10, 40, 80, 26,
  53. hWnd, (HMENU)4, hInst, NULL
  54. );
  55. radioMarried = CreateWindow(
  56. TEXT("button"), TEXT("已婚"),
  57. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON | WS_GROUP,
  58. 95, 40, 65, 26,
  59. hWnd, (HMENU)5, hInst, NULL
  60. );
  61. radioSingle = CreateWindow(
  62. TEXT("button"), TEXT("未婚"),
  63. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
  64. 165, 40, 65, 26,
  65. hWnd, (HMENU)6, hInst, NULL
  66. );
  67. radioSecrecy = CreateWindow(
  68. TEXT("button"), TEXT("保密"),
  69. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
  70. 235, 40, 100, 26,
  71. hWnd, (HMENU)7, hInst, NULL
  72. );
  73. //你的宠物
  74. labPet = CreateWindow(
  75. TEXT("static"), TEXT("你的宠物:"),
  76. WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_RIGHT,
  77. 10, 70, 80, 26,
  78. hWnd, (HMENU)8, hInst, NULL
  79. );
  80. checkboxDog = CreateWindow(
  81. TEXT("button"), TEXT("狗"),
  82. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX/*复选框*/,
  83. 95, 70, 50, 26,
  84. hWnd, (HMENU)9, hInst, NULL
  85. );
  86. checkboxCat = CreateWindow(
  87. TEXT("button"), TEXT("猫"),
  88. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
  89. 150, 70, 50, 26,
  90. hWnd, (HMENU)10, hInst, NULL
  91. );
  92. checkboxFish = CreateWindow(
  93. TEXT("button"), TEXT("鱼"),
  94. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
  95. 205, 70, 50, 26,
  96. hWnd, (HMENU)11, hInst, NULL
  97. );
  98. checkboxOther = CreateWindow(
  99. TEXT("button"), TEXT("其他"),
  100. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTOCHECKBOX,
  101. 260, 70, 65, 26,
  102. hWnd, (HMENU)11, hInst, NULL
  103. );
  104. SendMessage(labSex, WM_SETFONT, (WPARAM)hFont, NULL);
  105. SendMessage(radioMale, WM_SETFONT, (WPARAM)hFont, NULL);
  106. SendMessage(radioFemale, WM_SETFONT, (WPARAM)hFont, NULL);
  107. SendMessage(labMarriage, WM_SETFONT, (WPARAM)hFont, NULL);
  108. SendMessage(radioMarried, WM_SETFONT, (WPARAM)hFont, NULL);
  109. SendMessage(radioSingle, WM_SETFONT, (WPARAM)hFont, NULL);
  110. SendMessage(radioSecrecy, WM_SETFONT, (WPARAM)hFont, NULL);
  111. SendMessage(labPet, WM_SETFONT, (WPARAM)hFont, NULL);
  112. SendMessage(checkboxDog, WM_SETFONT, (WPARAM)hFont, NULL);
  113. SendMessage(checkboxCat, WM_SETFONT, (WPARAM)hFont, NULL);
  114. SendMessage(checkboxFish, WM_SETFONT, (WPARAM)hFont, NULL);
  115. SendMessage(checkboxOther, WM_SETFONT, (WPARAM)hFont, NULL);
  116. break;
  117. case WM_PAINT:
  118. hdc = BeginPaint(hWnd, &ps);
  119. // TODO: 在此添加任意绘图代码...
  120. EndPaint(hWnd, &ps);
  121. break;
  122. case WM_DESTROY:
  123. PostQuitMessage(0);
  124. break;
  125. default:
  126. return DefWindowProc(hWnd, message, wParam, lParam);
  127. }
  128. return 0;
  129. }

分组框控件

使用分组框控件(GroupBox)可以对单选按钮、复选框进行更好的分组,如下图所示:


分组框控件也是一种特殊的按钮,它的样式为BS_GROUPBOX,例如:
  1. //创建分组框控件
  2. hGroupSex = CreateWindow(
  3. TEXT("button"), TEXT("你的性别"),
  4. WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
  5. 20, 20, 300, 70,
  6. hWnd, (HMENU)1, hInst, NULL
  7. );
  8. //接下来添加单选按钮
  9. hRadioMale = CreateWindow(
  10. TEXT("button"), TEXT("男"),
  11. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON /*单选按钮*/,
  12. 15, 30, 50, 26,
  13. hGroupSex /*父窗口为 GroupBox 控件*/, (HMENU)2, hInst, NULL
  14. );
  15. hRadioFemale = CreateWindow(
  16. TEXT("button"), TEXT("女"),
  17. WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
  18. 80, 30, 50, 26,
  19. hGroupSex, (HMENU)3, hInst, NULL
  20. );
该代码将会创建上图中的第一组按钮。

需要注意的是:单选按钮的父窗口为分组框控件 hGroupSex,而不是顶级窗口 hWnd。

完整的示例代码较长,就不在这里展示了,请大家下载本节完整代码。

本节代码完整版下载地址:http://pan.baidu.com/s/1jGImzSa  提取密码:ve1d
0 0
原创粉丝点击