1. 程式人生 > >Stemwin軟鍵盤,小專案,控制元件,回撥函式

Stemwin軟鍵盤,小專案,控制元件,回撥函式

視窗回撥函式很重要

下面是我做的一個簡單的快遞收發系統框架,也可以算個計算器吧,有些功能不太全哦,再改進一下就可以了

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

下面是原始碼,圖片流太大了,沒有新增進來,自己可以用軟體做一個圖片

#include "GUI.h"
static void _cbMaster(WM_MESSAGE * pMsg);
static void _OKcbDialog(WM_MESSAGE * pMsg) ;
static void _cbDialog(WM_MESSAGE * pMsg);
#ifndef GUI_CONST_STORAGE
  #define GUI_CONST_STORAGE const
#endif extern GUI_CONST_STORAGE GUI_BITMAP bmtimg; GUI_CONST_STORAGE GUI_BITMAP bmtimg = { 320, // xSize 239, // ySize 640, // BytesPerLine 16, // BitsPerPixel (unsigned char *)_actimg, // Pointer to picture data NULL, // Pointer to palette GUI_DRAW_BMP444_12 }; #define ID_FRAMEWIN_0 (GUI_ID_USER + 0x14)
#define ID_BUTTON_0 (GUI_ID_USER + 0x00) #define ID_BUTTON_1 (GUI_ID_USER + 0x01) #define ID_BUTTON_2 (GUI_ID_USER + 0x02) #define ID_BUTTON_3 (GUI_ID_USER + 0x03) #define ID_BUTTON_4 (GUI_ID_USER + 0x04) #define ID_BUTTON_5 (GUI_ID_USER + 0x05) #define ID_BUTTON_6 (GUI_ID_USER + 0x06) #define
ID_BUTTON_7 (GUI_ID_USER + 0x07)
#define ID_BUTTON_8 (GUI_ID_USER + 0x08) #define ID_BUTTON_9 (GUI_ID_USER + 0x09) #define ID_EQL_10 (GUI_ID_USER + 0x0A) #define ID_ADD_11 (GUI_ID_USER + 0x0B) #define ID_SUB_12 (GUI_ID_USER + 0x0C) #define ID_MUL_13 (GUI_ID_USER + 0x0E) #define ID_DIV_14 (GUI_ID_USER + 0x0D) #define ID_POINT_15 (GUI_ID_USER + 0x0F) #define ID_OK_16 (GUI_ID_USER + 0x10) #define ID_CEL_17 (GUI_ID_USER + 0x11) #define ID_DEL_18 (GUI_ID_USER + 0x12) #define ID_EDIT_0 (GUI_ID_USER + 0x13) //關於結構體GUI_WIDGET_CREATE_INFO的解釋 //typedef struct { //GUI_WIDGET_CREATE_FUNC * pfCreateIndirect; // Create function //const char * pName; // Text (not used for all widgets) //I16 Id; // Window ID of the widget //I16 x0, y0, xSize, ySize; // Size and position of the widget //I16 Flags; // Widget-specific flags (or 0) //I32 Para; // Widget-specific parameter (or 0) //U32 NumExtraBytes; // Number of extra bytes usable //// with <WIDGET>_SetUserData & //// <WIDGET>_GetUserData //} GUI_WIDGET_CREATE_INFO; #define ID_MFRAMEWIN_01 (GUI_ID_USER + 0x15) #define ID_QUJIAN_0 (GUI_ID_USER + 0x16) //主介面排版 static const GUI_WIDGET_CREATE_INFO _MaDialogCreate[] = { { FRAMEWIN_CreateIndirect, "Framewin", ID_MFRAMEWIN_01, 0, 0, 320, 240, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "Pick", ID_QUJIAN_0, 83, 150, 137, 56, 0, 0x0, 0 }, }; // USER START (Optionally insert additional defines) // USER END #define ID_FRAMEWIN_02 (GUI_ID_USER + 0x17) #define ID_EDIT_OK (GUI_ID_USER + 0x18) #define ID_BUTTON_OK (GUI_ID_USER + 0x19) //提示資訊排版 static const GUI_WIDGET_CREATE_INFO _OKaDialogCreate[] = { { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_02, 0, 1, 210, 140, 0, 0x0, 0 }, { EDIT_CreateIndirect, 0, ID_EDIT_OK, 0, 0, 199, 35, 0, 0x64, 0 }, { BUTTON_CreateIndirect, "OK", ID_BUTTON_OK, 55, 65, 80, 28, 0, 0x0, 0 }, }; //密碼使用者名稱的排版 static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { { FRAMEWIN_CreateIndirect, 0, ID_FRAMEWIN_0, 79, 0, 148, 238, 0, 0x00, 0 }, { BUTTON_CreateIndirect, "0", ID_BUTTON_0, 35, 155, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "1", ID_BUTTON_1, 0, 120, 30, 30, 0, 0x0, 0 }, //位置是相對面板的位置 { BUTTON_CreateIndirect, "2", ID_BUTTON_2, 35, 120, 30, 30, 0, 0x0, 0}, { BUTTON_CreateIndirect, "3", ID_BUTTON_3, 70, 120, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "4", ID_BUTTON_4, 0, 85, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "5", ID_BUTTON_5, 35, 85, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "6", ID_BUTTON_6, 69, 85, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "7", ID_BUTTON_7, 0, 50, 30, 30, 0, 0x0, 0}, { BUTTON_CreateIndirect, "8", ID_BUTTON_8, 35, 50, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "9", ID_BUTTON_9, 70, 50, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "=", ID_EQL_10, 70, 155, 65, 30, 0, 0x0, 0}, { BUTTON_CreateIndirect, "+", ID_ADD_11, 105, 190, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "-", ID_SUB_12, 105, 120, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "*", ID_MUL_13, 105, 85, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "/", ID_DIV_14, 105, 50, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, ".", ID_POINT_15, 0, 155, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "ok", ID_OK_16, 0, 190, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "cel", ID_CEL_17, 35, 190, 30, 30, 0, 0x0, 0 }, { BUTTON_CreateIndirect, "dele", ID_DEL_18, 70, 190, 30, 30, 0, 0x0, 0 }, { EDIT_CreateIndirect, 0, ID_EDIT_0, 0, 0, 136, 45, 0, 0x64, 0 }, }; //提示視窗回撥函式 static void _OKcbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; int NCode; int Id; WM_HWIN hDlg; hDlg = pMsg->hWin; switch (pMsg->MsgId) { case WM_INIT_DIALOG: hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_OK); EDIT_SetText(hItem, "ERRO"); //提示錯誤 EDIT_SetFont(hItem, GUI_FONT_20_ASCII); EDIT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER); break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); NCode = pMsg->Data.v; switch(Id) { case ID_BUTTON_OK: // Notifications sent by 'OK' switch(NCode) { case WM_NOTIFICATION_CLICKED: //按下 break; case WM_NOTIFICATION_RELEASED: //釋放 GUI_EndDialog(hDlg, 1); //隱藏視窗 GUI_CreateDialogBox(_MaDialogCreate, GUI_COUNTOF(_MaDialogCreate), _cbMaster, WM_HBKWIN, 0, 0);//建立視窗 break; } break; } break; default: WM_DefaultProc(pMsg); break; } } //輸入使用者名稱密碼介面回撥函式 static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; WM_HWIN OKSTERWIN; int NCode; int Pressed=0; int Id; int i; WM_HWIN hDlg; hDlg = pMsg->hWin; switch (pMsg->MsgId) { case WM_PAINT: break; case WM_INIT_DIALOG: /*設定面板 這個設定要在WM_INIT_DIALOG:資訊後面*/ FRAMEWIN_SetSkin(pMsg->hWin, FRAMEWIN_SKIN_FLEX); hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0); WM_SetFocus(hItem); //聚焦 很重要,要不然編輯視窗接收不到按鍵發來的資訊 EDIT_SetText(hItem, "USER:"); EDIT_SetFont(hItem, GUI_FONT_20_ASCII); EDIT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);//對齊方式 for (i = 0; i < GUI_COUNTOF(_aDialogCreate)-1; i++) { hItem = WM_GetDialogItem(hDlg,GUI_ID_USER + i); /*一定要加,要不然資訊傳送不到編輯視窗,所以編輯視窗就不會有顯示*/ BUTTON_SetFocussable(hItem, 0); } break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ switch (NCode) { case WM_NOTIFICATION_CLICKED://點選視窗後通知訊息 Pressed=1; /* break;*/ //不能加break case WM_NOTIFICATION_RELEASED: /* 釋放的時候 */ if (Id == ID_OK_16) { GUI_EndDialog(hDlg, 0); //隱藏視窗 OKSTERWIN = GUI_CreateDialogBox(_OKaDialogCreate, GUI_COUNTOF(_OKaDialogCreate), _OKcbDialog, WM_HBKWIN, 0, 0); //重新建立陳視窗 //給程式傳送訊息驗證密碼和使用者名稱 } else if(Id ==ID_CEL_17) { GUI_EndDialog(hDlg, 1); //也是隱藏視窗 OKSTERWIN = GUI_CreateDialogBox(_OKaDialogCreate, GUI_COUNTOF(_OKaDialogCreate), _OKcbDialog, WM_HBKWIN, 0, 0); //建立視窗 } else if(Id<=ID_BUTTON_9) //按下了數字按鈕 { char acBuffer[10]; int Key; BUTTON_GetText(pMsg->hWinSrc, acBuffer, sizeof(acBuffer)); //得到’0’到‘9’的字元文字 Key = acBuffer[0]; /*給目標編輯視窗傳送資訊 前面必須加上BUTTON_SetFocussable(hItem, 0);*/ GUI_SendKeyMsg(Key, Pressed); } break; } break; default: WM_DefaultProc(pMsg); break; } } //主介面:中國郵政回撥函式 static void _cbMaster(WM_MESSAGE * pMsg) { int NCode; int Id; WM_HWIN hItem; WM_HWIN hDlg; hDlg = pMsg->hWin; switch (pMsg->MsgId) { case WM_INIT_DIALOG: hItem = WM_GetDialogItem(pMsg->hWin, ID_QUJIAN_0); BUTTON_SetFont(hItem,GUI_FONT_24_ASCII); //按鈕字型大小 BUTTON_SetTextColor(hItem,0,GUI_YELLOW); //設定文字顏色 BUTTON_SetBkColor (hItem, 1,GUI_BLUE); //按下時使用的顏色 BUTTON_SetBkColor (hItem, 0,GUI_GREEN); //沒有按下的顏色 FRAMEWIN_SetTitleVis(hDlg, 0); //隱藏標題欄 case WM_PAINT: //重繪製 GUI_SetBkColor(GUI_WHITE); GUI_Clear(); //先填充 GUI_DrawBitmap(&bmtimg,0,0); //給視窗新增圖片背景:中國郵政 break; //注意新增點陣圖作為背景一定要在重繪製訊息後面新增 case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); NCode = pMsg->Data.v; switch(Id) { case ID_QUJIAN_0: switch(NCode) { case WM_NOTIFICATION_CLICKED: break; case WM_NOTIFICATION_RELEASED: if (Id == ID_QUJIAN_0) { GUI_EndDialog(hDlg, 0); GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0); } break; } break; } break; default: WM_DefaultProc(pMsg); break; } } static char _aTitle[] = {"PICK"}; /* 桌面設計函式 */ static void _cbDesktop(WM_MESSAGE * pMsg) { unsigned i; switch (pMsg->MsgId) { case WM_PAINT: GUI_SetBkColor(GUI_GREEN); GUI_Clear(); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt(_aTitle, 140, 5); break; } } /* * MainTask */ void MainTask(void) { WM_HWIN MASTERWIN; GUI_Init(); WM_SetCallback(WM_HBKWIN, _cbDesktop); //桌面回撥函式 MASTERWIN = GUI_CreateDialogBox(_MaDialogCreate, GUI_COUNTOF(_MaDialogCreate), _cbMaster, WM_HBKWIN, 0, 0); //建立主視窗 取件 while (1) { GUI_Delay(1000); } }