Stemwin軟鍵盤,小專案,控制元件,回撥函式
阿新 • • 發佈:2019-02-06
視窗回撥函式很重要
下面是我做的一個簡單的快遞收發系統框架,也可以算個計算器吧,有些功能不太全哦,再改進一下就可以了
下面是原始碼,圖片流太大了,沒有新增進來,自己可以用軟體做一個圖片
#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);
}
}