硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4827|回复: 0
收起左侧

[emWin教程入门篇] 【STemWin教程】第41章 CHECKBOX-复选框控件

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-2-28 10:21:30 | 显示全部楼层 |阅读模式
特别说明:完整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大家都可以试试。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 13:25 , Processed in 0.164870 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表