STemWin圖形化界面設計專題
STemWin專題–滑鼠飛色彩舞
今天,我們來點好玩的。廢話少說,直接開捶~~~
1、把之前下載下傳好的檔案打開(下載下傳連結:https://www.segger.com/downloads/embedded-studio#ESforARM)

2、下載下傳好後,以VC++運作這個工作區
3、在該檔案的相應處修改程式
4、首先,定義一個數組,裡面有五種顔色
5、定義一個變量,用于五種顔色的切換。
static unsigned char ucBackColor; //(2)定義變量,用于五種顔色的切換
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{FRAMEWIN_CreateIndirect,"feiluo",0,0,0,800,480,FRAMEWIN_CF_MOVEABLE,0},
{BUTTON_CreateIndirect,"BUTTON0", GUI_ID_BUTTON0,82,122,162,37,0,0},
{BUTTON_CreateIndirect,"BUTTON1", GUI_ID_BUTTON1,357,123,152,35,0,0}
};
6、在WM_PAINT消息中實作重繪,用于實作對話框使用者區的顔色重繪
void PaintDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin;
GUI_SetBkColor(_acColor[ucBackColor]);//(3)在WM_PAINT消息中實作重繪,用于實作對話框使用者區的顔色重繪
GUI_Clear();
}
7、初始化對話框中的控件,初始化了FraneWin
void InitDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin; //(4)初始化對話框中的控件,初始化了FraneWin
FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
FRAMEWIN_AddCloseButton(hWin,FRAMEWIN_BUTTON_RIGHT,0);
FRAMEWIN_AddMaxButton(hWin,FRAMEWIN_BUTTON_RIGHT,1);
FRAMEWIN_AddMinButton(hWin,FRAMEWIN_BUTTON_RIGHT,2);
FRAMEWIN_SetTitleHeight(hWin,30);
ucBackColor = 0; //(5)初始化背景顔色的初始值
}
8、功能:指針輸入裝置接觸到視窗輪廓時發送到視窗,僅在啟用滑鼠支援時發送在消息裡面切換對話框的背景色變量
static void _cbCallback(WM_MESSAGE * pMsg)
{
int NCode, Id;
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId)
{
case WM_MOUSEOVER: //(6)功能:指針輸入裝置接觸到視窗輪廓時發送到視窗,僅在啟用滑鼠支援時發送
ucBackColor++; //在消息裡面切換對話框的背景色變量
if(ucBackColor ==5)
{
ucBackColor = 0;
}
WM_InvalidateWindow(hWin);
break;
case WM_PAINT:
PaintDialog(pMsg);
break;
case WM_INIT_DIALOG:
InitDialog(pMsg);
break;
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
{
case GUI_KEY_ESCAPE:
GUI_EndDialog(hWin,1);
break;
case GUI_KEY_ENTER:
GUI_EndDialog(hWin,0);
break;
}
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch (Id)
{
case GUI_ID_OK:
if(NCode == WM_NOTIFICATION_RELEASED)
GUI_EndDialog(hWin,0);
break;
case GUI_ID_CANCEL:
if(NCode == WM_NOTIFICATION_RELEASED)
GUI_EndDialog(hWin,0);
break;
case GUI_ID_BUTTON0:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
// OnButtonClicked(pMsg);
break;
case WM_NOTIFICATION_RELEASED:
// OnButtonReleased(pMsg);
break;
case WM_NOTIFICATION_MOVED_OUT:
// OnButtonMovedOut(pMsg);
break;
}
break;
case GUI_ID_BUTTON1:
switch (NCode)
{
case WM_NOTIFICATION_CLICKED:
// OnButtonClicked(pMsg);
break;
case WM_NOTIFICATION_RELEASED:
// OnButtonReleased(pMsg);
break;
case WM_NOTIFICATION_MOVED_OUT:
// OnButtonMovedOut(pMsg);
break;
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
9、修改MainTask()函數中代碼
void MainTask(void )
{
GUI_Init();
WM_SetDesktopColor(GUI_WHITE);
WM_SetCreateFlags(WM_CF_MEMDEV);
PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
GUI_ExecDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),&_cbCallback,0,0,0);
}
以上代碼都是寫到GUIIDE_Start.c檔案中,下面是全源碼
#include <stddef.h>
#include "GUI.h"
#include "DIALOG.h"
#include "WM.h"
#include "BUTTON.h"
#include "CHECKBOX.h"
#include "DROPDOWN.h"
#include "EDIT.h"
#include "FRAMEWIN.h"
#include "LISTBOX.H"
#include "MULTIEDIT.h"
#include "RADIO.h"
#include "SLIDER.h"
#include "TEXT.h"
#include "PROGBAR.h"
#include "SCROLLBAR.h"
#include "LISTVIEW.h"
GUI_COLOR _acColor[5] = {GUI_BLUE,GUI_RED,GUI_YELLOW,GUI_GREEN,GUI_WHITE};
//(1)定義數組,裡面存放顔色
static unsigned char ucBackColor; //(2)定義變量,用于三種顔色的切換
//void OnButtonClicked(WM_MESSAGE * pMsg);
//void OnButtonReleased(WM_MESSAGE * pMsg);
//void OnButtonMovedOut(WM_MESSAGE * pMsg);
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{FRAMEWIN_CreateIndirect,"feiluo",0,0,0,800,480,FRAMEWIN_CF_MOVEABLE,0},
{BUTTON_CreateIndirect,"BUTTON0", GUI_ID_BUTTON0,82,122,162,37,0,0},
{BUTTON_CreateIndirect,"BUTTON1", GUI_ID_BUTTON1,357,123,152,35,0,0}
};
void PaintDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin;
GUI_SetBkColor(_acColor[ucBackColor]);//(3)在WM_PAINT消息中實作重繪,用于實作對話框使用者區的顔色重繪
GUI_Clear();
}
void InitDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin; //(4)初始化對話框中的控件,初始化了FraneWin
FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
FRAMEWIN_AddCloseButton(hWin,FRAMEWIN_BUTTON_RIGHT,0);
FRAMEWIN_AddMaxButton(hWin,FRAMEWIN_BUTTON_RIGHT,1);
FRAMEWIN_AddMinButton(hWin,FRAMEWIN_BUTTON_RIGHT,2);
FRAMEWIN_SetTitleHeight(hWin,30);
ucBackColor = 0; //(5)初始化背景顔色的初始值
}
static void _cbCallback(WM_MESSAGE * pMsg)
{
int NCode, Id;
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId)
{
case WM_MOUSEOVER: //(6)功能:指針輸入裝置接觸到視窗輪廓時發送到視窗,僅在啟用滑鼠支援時發送
ucBackColor++; //在消息裡面切換對話框的背景色變量
if(ucBackColor ==5)
{
ucBackColor = 0;
}
WM_InvalidateWindow(hWin);
break;
case WM_PAINT:
PaintDialog(pMsg);
break;
case WM_INIT_DIALOG:
InitDialog(pMsg);
break;
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
{
case GUI_KEY_ESCAPE:
GUI_EndDialog(hWin,1);
break;
case GUI_KEY_ENTER:
GUI_EndDialog(hWin,0);
break;
}
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch (Id)
{
case GUI_ID_OK:
if(NCode == WM_NOTIFICATION_RELEASED)
GUI_EndDialog(hWin,0);
break;
case GUI_ID_CANCEL:
if(NCode == WM_NOTIFICATION_RELEASED)
GUI_EndDialog(hWin,0);
break;
case GUI_ID_BUTTON0:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
// OnButtonClicked(pMsg);
break;
case WM_NOTIFICATION_RELEASED:
// OnButtonReleased(pMsg);
break;
case WM_NOTIFICATION_MOVED_OUT:
// OnButtonMovedOut(pMsg);
break;
}
break;
case GUI_ID_BUTTON1:
switch (NCode)
{
case WM_NOTIFICATION_CLICKED:
// OnButtonClicked(pMsg);
break;
case WM_NOTIFICATION_RELEASED:
// OnButtonReleased(pMsg);
break;
case WM_NOTIFICATION_MOVED_OUT:
// OnButtonMovedOut(pMsg);
break;
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
void MainTask(void )
{
GUI_Init();
WM_SetDesktopColor(GUI_WHITE);
WM_SetCreateFlags(WM_CF_MEMDEV);
PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
GUI_ExecDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),&_cbCallback,0,0,0);
}
10、運作圖像如下
11、這樣就可以啦!~希望能幫到大家。開捶!!!(ps:大家可以嘗試着捶其它自己喜歡的顔色,發揮自己的現象去捶它)