48.4 官方WIDGET_CheckBox.c实例讲解
这个例子在模拟器中的位置:
主要功能介绍:
这个例子主要演示了如何实现复选框三种状态的设置(默认情况下是两种状态),以及通过函数CHECKBOX_SetImage设置复选框被选中状态下显示的图标(就是那个对号)。实际上这个例子比较老了,当前的emWin5.32版本已经可以使用GUIBuilder任意放缩复选框方框的显示大小,被选中时显示的对号也自动跟复选框的大小匹配。
程序代码如下:
- #include <stddef.h>
- #include "GUI.h"
- #include "DIALOG.h"
- #include "Main.h"
-
- //
- // Recommended memory to run the sample with adequate performance
- //
- #define RECOMMENDED_MEMORY (1024L * 10)
-
- /*********************************************************************
- *
- * Static data
- *
- **********************************************************************
- */
-
- //
- // Dialog resource
- //
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { //--------------(1)
- { FRAMEWIN_CreateIndirect, "Check box sample", 0, 10, 10, 300, 220, FRAMEWIN_CF_MOVEABLE},
- { TEXT_CreateIndirect, "Enabled:", 0, 5, 10, 120, 0 },
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK0, 5, 30, 120, 0 },
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK1, 5, 60, 120, 0 },
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK2, 5, 90, 120, 20 },
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK3, 5, 125, 120, 26 },
- { TEXT_CreateIndirect, "Disabled:", 0, 150, 10, 120, 0 },
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK4, 150, 30, 120, 0 },
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK5, 150, 60, 120, 0 },
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK6, 150, 90, 120, 26 },
- { CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK7, 150, 125, 120, 26 },
- { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 10, 170, 60, 20 },
- { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 225, 170, 60, 20 },
- };
-
- //
- // Check box text
- //
- static const char * _apLabel[] = { //--------------(2)
- "Default",
- "3 States",
- "Box XL",
- "Box XXL"
- };
-
- /*********************************************************************
- *
- * Static code
- *
- **********************************************************************
- */
- /*********************************************************************
- *
- * _cbCallback
- */
- static void _cbCallback(WM_MESSAGE * pMsg) {
- WM_HWIN hDlg;
- WM_HWIN hItem;
- int i;
- int NCode;
- int Id;
-
- hDlg = pMsg->hWin;
- switch (pMsg->MsgId) {
- case WM_INIT_DIALOG:
- WM_GetDialogItem(hDlg, GUI_ID_CHECK0);
- for (i = 0; i < 8; i++) { //--------------(3)
- int Index = i % 4;
- hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK0 + i); // Get the handle of the desired checkbox
- CHECKBOX_SetText(hItem, _apLabel[Index]); // Set the check box text //--------------(4)
- switch (Index) {
- case 1: //--------------(5)
- //
- // Set the number of possible states to 3
- //
- CHECKBOX_SetNumStates(hItem, 3); //--------------(6)
- //
- // Use user defined bitmaps for the third state
- // //--------------(7)
- CHECKBOX_SetImage(hItem, &_abmBar[0], CHECKBOX_BI_INACTIV_3STATE); // Used if widget is disabled
- CHECKBOX_SetImage(hItem, &_abmBar[1], CHECKBOX_BI_ACTIV_3STATE); // Used if widget is enabled
- CHECKBOX_SetState(hItem, 2); //--------------(8)
- break;
- case 2: //--------------(9)
- CHECKBOX_SetState(hItem, 1);
- //
- // Use user defined bitmaps for the 'checked' state
- //
- CHECKBOX_SetImage(hItem, &_abmXL[0], CHECKBOX_BI_INACTIV_CHECKED); // Used if widget is disabled
- CHECKBOX_SetImage(hItem, &_abmXL[1], CHECKBOX_BI_ACTIV_CHECKED); // Used if widget is enabled
- CHECKBOX_SetFont(hItem, &GUI_FontComic18B_ASCII);
- break;
- case 3: //--------------(10)
- CHECKBOX_SetState(hItem, 1);
- //
- // Use user defined bitmaps for the 'checked' state
- //
- CHECKBOX_SetImage(hItem, &_abmXXL[0], CHECKBOX_BI_INACTIV_CHECKED); // Used if widget is disabled
- CHECKBOX_SetImage(hItem, &_abmXXL[1], CHECKBOX_BI_ACTIV_CHECKED); // Used if widget is enabled
- CHECKBOX_SetFont(hItem, &GUI_FontComic24B_ASCII);
- break;
- }
- //
- // Disable all check boxes shown on the right side of the dialog
- //
- if (i >= 4) { //--------------(11)
- WM_DisableWindow(hItem);
- }
- }
- break;
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc); // Id of widget
- NCode = pMsg->Data.v; // Notification code
- switch (NCode) {
- case WM_NOTIFICATION_RELEASED: // React only if released
- if (Id == GUI_ID_OK) { // OK Button
- GUI_EndDialog(hDlg, 0);
- }
- if (Id == GUI_ID_CANCEL) { // Cancel Button
- GUI_EndDialog(hDlg, 1);
- }
- break;
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*********************************************************************
- *
- * Public code
- *
- **********************************************************************
- */
- /*********************************************************************
- *
- * MainTask
- */
- void MainTask(void) {
- #if GUI_SUPPORT_MEMDEV
- WM_SetCreateFlags(WM_CF_MEMDEV);
- #endif
- GUI_Init();
- //
- // Check if recommended memory for the sample is available
- //
- if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
- GUI_ErrorOut("Not enough memory available.");
- return;
- }
- WM_SetDesktopColor(GUI_BLACK);
- while (1) {
- GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
- GUI_Delay(500);
- }
- }
复制代码1. 对话框资源表,共创建了8个复选框控件。 2. 供复选框显示文本使用。 3. 循环8次,为8个复选框分别进行设置。 4. 通过函数CHECKBOX_SetText设置复选框显示的文本。 5. 确切的说这里的case 1应该算是显示的第二种情况,因为i%4 =0的情况未做处理,也就是使用的系统默认设置。 6. 通过函数CHECKBOX_SetNumStates设置复选框的状态个数(当前仅支持设置为2种或者3种),默认情况下,复选框支持2种状态:选中状态和未选中。如果复选框要支持第三种状态,可通过此函数设置为3种即可,这里就是复将选框状态设置为3种。 7. 通过函数CHECKBOX_SetImage设置复选框被选中后显示的图像。使用此函数时,要确保复选框的显示区足以显示位图和文本,并且用户设置的显示图像最好可以填满整个复选框的方框区域,这样看起来更美观些。这里是设置复选框在第三种状态禁止和使能的情况下显示的图像。 8. 通过函数CHECKBOX_SetState设置复选框当前的状态,由于第6条中将复选框的显示状态设置为了3种,所以显示状态可以是选中,取消选中和第三种状态,这里是配置为第三种显示状态。 9. 第三种复选框显示效果的设置,显示一种稍大点的复选框。 10. 第四种复选框显示效果的设置,显示一种再大点的复选框。 11. 通过这个函数来禁止右侧四个复选框,而左侧的四个是使能的。 实际的显示效果如下: |