你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第41章 CHECKBOX-复选框控件

[复制链接]
baiyongbin2009 发布时间:2015-2-28 11:08
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第41章 CHECKBOX-复选框控件

    本期教程讲解STemWin支持的复选框。
    41. 1 复选框控件介绍
    41. 2 官方WIDGET_CheckBox实例
    41. 3 总结
41.1 复选框控件介绍
    复选框是选择各种不同选项的最常用控件之一。用户可选中或取消选中复选框,并且可一次选中任意个框。使用键盘界面时,被聚焦的复选框的状态可使用<SPACE>键切换。禁用的框显示为灰色,如下图所示,其中描述了每种可能的复选框的外观:
41.1.png
开启皮肤色后显示效果如下:
41.2.png
41.1.1 复选框支持的通知代码
    以下事件是复选框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
消息
描述
WM_NOTIFICATION_CLICKED
复选框已被点击。
WM_NOTIFICATION_RELEASED
复选框已被释放。
WM_NOTIFICATION_MOVED_OUT
复选框已被点击,且指针已移出复选框并且没有释放。
WM_NOTIFICATION_VALUE_CHANGED
复选框的状态已改变。
41.1.2 按钮支持键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反应:
按键
反应
GUI_KEY_SPACE
切换小工具的选中状态
41.2 官方WIDGET_CheckBox实例
    官方的这个例子做的很好,充分的演示了复选框的各个状态。这个例子在模拟器中的位置:
41.3.png
源代码如下(主要看WIDGET_Checkbox中的代码):
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"
  4. #include "Main.h"

  5. /*********************************************************************
  6. *
  7. *       Static data
  8. *
  9. **********************************************************************
  10. */

  11. //
  12. // Dialog resource
  13. //
  14. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {(1)
  15.   { FRAMEWIN_CreateIndirect, "Check box sample",   0,   10,  10, 300, 220, FRAMEWIN_CF_MOVEABLE},
  16.   { TEXT_CreateIndirect,     "Enabled:",           0,    5,  10, 120,   0 },
  17.   { CHECKBOX_CreateIndirect, 0,        GUI_ID_CHECK0,    5,  30, 120,   0 },
  18.   { CHECKBOX_CreateIndirect, 0,        GUI_ID_CHECK1,    5,  60, 120,   0 },
  19.   { CHECKBOX_CreateIndirect, 0,        GUI_ID_CHECK2,    5,  90, 120,   20 },
  20.   { CHECKBOX_CreateIndirect, 0,        GUI_ID_CHECK3,    5, 125, 120,   26 },
  21.   { TEXT_CreateIndirect,     "Disabled:",          0,  150,  10, 120,   0 },
  22.   { CHECKBOX_CreateIndirect, 0,        GUI_ID_CHECK4,  150,  30, 120,   0 },
  23.   { CHECKBOX_CreateIndirect, 0,        GUI_ID_CHECK5,  150,  60, 120,   0 },
  24.   { CHECKBOX_CreateIndirect, 0,        GUI_ID_CHECK6,  150,  90, 120,   26 },
  25.   { CHECKBOX_CreateIndirect, 0,        GUI_ID_CHECK7,  150, 125, 120,   26 },
  26.   { BUTTON_CreateIndirect,   "OK",         GUI_ID_OK,   10, 170,  60,  20 },
  27.   { BUTTON_CreateIndirect,   "Cancel", GUI_ID_CANCEL,  225, 170,  60,  20 },
  28. };

  29. //
  30. // Check box text
  31. //
  32. static const char * _apLabel[] = {(2)
  33. "Default",
  34. "3 States",
  35. "Box XL",
  36. "Box XXL"
  37. };

  38. /*********************************************************************
  39. *
  40. *       Static code
  41. *
  42. **********************************************************************
  43. */
  44. /*********************************************************************
  45. *
  46. *       _cbCallback
  47. */
  48. static void _cbCallback(WM_MESSAGE * pMsg) {
  49.   WM_HWIN hDlg;
  50.   WM_HWIN hItem;
  51.   int     i;
  52.   int     NCode;
  53.   int     Id;

  54.   hDlg = pMsg->hWin;
  55.   switch (pMsg->MsgId) {
  56.     case WM_INIT_DIALOG:
  57.       WM_GetDialogItem(hDlg, GUI_ID_CHECK0);
  58.       for (i = 0; i < 8; i++) {(3)
  59.         int Index = i % 4;
  60.         hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK0 + i); // Get the handle of the desired checkbox
  61.         CHECKBOX_SetText(hItem, _apLabel[Index]);          // Set the check box text(4)

  62.         switch (Index) {
  63.         case 1:(5)
  64.           //
  65.           // Set the number of possible states to 3
  66.           //
  67.           CHECKBOX_SetNumStates(hItem, 3);(6)
  68.           //
  69.           // Use user defined bitmaps for the third state
  70.           //(7)
  71.           CHECKBOX_SetImage(hItem, &_abmBar[0], CHECKBOX_BI_INACTIV_3STATE);  // Used if widget is disabled
  72.           CHECKBOX_SetImage(hItem, &_abmBar[1], CHECKBOX_BI_ACTIV_3STATE);    // Used if widget is enabled
  73.           CHECKBOX_SetState(hItem, 2);(8)
  74.           break;
  75.         case 2:(9)
  76.           CHECKBOX_SetState(hItem, 1);
  77.           //
  78.           // Use user defined bitmaps for the 'checked' state
  79.           //
  80.           CHECKBOX_SetImage(hItem, &_abmXL[0], CHECKBOX_BI_INACTIV_CHECKED);  // Used if widget is disabled
  81.           CHECKBOX_SetImage(hItem, &_abmXL[1], CHECKBOX_BI_ACTIV_CHECKED);    // Used if widget is enabled
  82.           CHECKBOX_SetFont(hItem, &GUI_FontComic18B_ASCII);
  83.           break;
  84.         case 3:(10)
  85.           CHECKBOX_SetState(hItem, 1);
  86.           //
  87.           // Use user defined bitmaps for the 'checked' state
  88.           //
  89.           CHECKBOX_SetImage(hItem, &_abmXXL[0], CHECKBOX_BI_INACTIV_CHECKED); // Used if widget is disabled
  90.           CHECKBOX_SetImage(hItem, &_abmXXL[1], CHECKBOX_BI_ACTIV_CHECKED);   // Used if widget is enabled
  91.           CHECKBOX_SetFont(hItem, &GUI_FontComic24B_ASCII);
  92.           break;
  93.         }
  94.         //
  95.         // Disable all check boxes shown on the right side of the dialog
  96.         //
  97.         if (i >= 4) {(11)
  98.           WM_DisableWindow(hItem);
  99.         }
  100.       }
  101.       break;
  102.     case WM_NOTIFY_PARENT:
  103.       Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget
  104.       NCode = pMsg->Data.v;                 // Notification code
  105.       switch (NCode) {
  106.         case WM_NOTIFICATION_RELEASED:      // React only if released
  107.           if (Id == GUI_ID_OK) {            // OK Button
  108.             GUI_EndDialog(hDlg, 0);
  109.           }
  110.           if (Id == GUI_ID_CANCEL) {        // Cancel Button
  111.             GUI_EndDialog(hDlg, 1);
  112.           }
  113.           break;
  114.       }
  115.       break;
  116.     default:
  117.       WM_DefaultProc(pMsg);
  118.   }
  119. }

  120. /*********************************************************************
  121. *
  122. *       Public code
  123. *
  124. **********************************************************************
  125. */
  126. /*********************************************************************
  127. *
  128. *       MainTask
  129. */
  130. void MainTask(void) {
  131.   #if GUI_SUPPORT_MEMDEV
  132.     WM_SetCreateFlags(WM_CF_MEMDEV);
  133.   #endif
  134.   GUI_Init();
  135.   WM_SetDesktopColor(GUI_BLACK);
  136.   while (1) {
  137.     GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
  138.     GUI_Delay(500);
  139.   }
  140. }
复制代码
1. 对话框中控件的资源表,具体每个控件的参数,看前面38.6.1的介绍。
2. 复选框要显示的文本。
3. 循环8次,为8个复选框进行设置。
4. 函数CHECKBOX_SetText用于设置复选框旁边的可选文本。
5. 确切的说这里的case 1应该算是显示的第二种情况,为了方便起见,我们讲起称之为第一种情况,因为前面已经显示了一种情况。也就是i%4 = 0的情况。
6. 函数CHECKBOX_SetNumStates用于设置复选框可能的状态个数,默认情况下,复选框支持2种状态:选中(1)和未选中(0)。如果复选框要支持第三种状态,可将可能状态增加到3种。
7. 函数CHECKBOX_SetImage用于设置复选框被选中后显示的图像。图像必须填充复选框的整个内部区域。使用此函数时,要确保用于创建小工具的复选框的尺寸足以显示位图和 (可选的)文本。
8. 函数CHECKBOX_SetState用于设置复选框的状态,支持三种状态的显示,可以是选中,取消选中和第三种状态。
9. 情况二,显示一种稍大点的复选框。
10. 情况三,显示一种再大点的复选框。
11. 通过这个函数来禁止右侧复选框的状态。
实际的显示效果如下:
41.4.png
41.3 总结
    本期教程主要是跟大家讲解了复选框控件的使用,希望大家可以把本期教程中讲的这个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的复选框API,其它的API大家都可以试试。

收藏 评论7 发布时间:2015-2-28 11:08

举报

7个回答
feel-376797 回答时间:2015-2-28 11:33:29
谢谢分享
wamcncn 回答时间:2015-2-28 14:18:40
教程真多啊,学的比教的忙
MouseCat 回答时间:2015-2-28 14:36:03
收藏了,谢谢
wyxy163@126.com 回答时间:2015-2-28 16:21:18
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-2-28 16:21:37
提示: 作者被禁止或删除 内容自动屏蔽
lkl0305 回答时间:2015-2-28 20:40:35
多谢分享
埃斯提爱慕 回答时间:2015-3-1 16:03:57
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版