以下例程是在使用存儲設備時通常會調用的,基本用法非常簡單:
1. 創建存儲設備(使用GUI_MEMDEV_Create() )。
2. 激活它(使用GUI_MEMDEV_Select() )。
3. 執行繪制操作。
4. 將結果復制到顯示器中(使用GUI_MEMDEV_CopyToLCD() )。
5. 不再需要它時,刪除該存儲設備(使用 GUI_MEMDEV_Delete() )。
2:WM窗口管理器
回調例程:回調例程由用戶程序定義,指示在特定事件出現時圖形系統調用特定的函數。它們通常用于在窗口內容更改時自動重繪窗口。窗口管理器的默認特性是向每個需要重繪的窗口發送一條 WM_PAINT 。
當用戶對窗口有操作時,WM會發送相應的消息給該窗口,窗口可通過回調函數根據消息直接對屏(沒有用存儲設備時)或對窗口的存儲設備進行操作再拷貝到屏幕上,具體的消息說明可以參考emWin的中文手冊。
WM_SetCallback
設置窗口的回調例程:WM_CALLBACK* WM_SetCallback (WM_HWIN hWin, WM_CALLBACK* cb)
有了這個函數就可以動態的選擇操作的重繪操作等消息的響應動作了。
WM_SetDesktopColor
設置桌面窗口的顏色:WGUI_COLOR WM_SetDesktopColor(GUI_COLOR Color);
桌面窗口由視窗管理器自動創建,總是覆蓋整個顯示區域。它始終是一個最底層的窗口,沒有定義其 他窗口,它就是默認活動窗口。所有窗口都是桌面窗口的繼承窗口。桌面窗口的默認設置不用于自身 重新著色。如果不調用此函數,則桌面窗口不進行重繪;因此其它窗口將保持可見,即使在將它們刪 除之后。一旦使用此函數指定了顏色,則桌面窗口將進行自身重新著色。為了恢復默認設置,請調用 此函數并指定GUI_INVALID_COLOR 。
對桌面窗口顏色設置后,需要調用WM_Exec(),通過執行回調函數重繪無效窗口(針對所有作業),這 樣新的桌面窗口的顏色就會顯現。
GUI_Exec【重要、重要,進行操作動作后,一般都要會通過一個GUI延時函數(GUI_Delay)來間接調用該函數,也可以單獨建立一個任務來執行GUI_Exec()函數】
GUI_Exec()可以理解為GUI執行函數,調用了很多操作函數或發生了相關的動作,最后都需要通過GUI_Exec()函數通過各個回調函數來一一執行,所以函數名叫GUI_Exec
此函數將自動重復調用WM_Exec1(),直至完成所有作業 – 實質是直至返回0 值為止。建議調用函數GUI_Exec()作為代替。通常,此函數無需由用戶應用程序調用,它自動由GUI_Delay() 調用,所以一般作業后都調用一個GUI_Delay(),使作業顯現出來。如果使用的是多任務系統,建議通過單獨的任務執行此函數,如下所示:
void ExecIdleTask(void)
{
while(1) {
WM_Exec();//調用WM_Exec()完成到顯示屏的顯示作業(我的理解是:(類似于)調用該函數前,其他的函數執行繪制操作,WM_Exec完成將結果復制到顯示器中)
}
}
WM_InvalidateWindow:調用此函數會告訴WM 指定的窗口未更新
WM_PAINT消息: 窗口變為無效并應重繪時,發送到窗口。
void WM_InvalidateWindow(WM_HWIN hWin);
WM_BringToTop:將窗口放在其同屬窗口前面
void WM_BringToTop(WM_HWIN hWin);該窗口將放置在其他所有同屬窗口及父窗口的頂部,加入同屬于A窗口的B、C兩個子窗口,B先C后,則可以通過該函數將B又放在前面。
WM_BringToBottom:窗口將放置在所有其他同屬窗口的下面,但將留在其父窗口的前面。
void WM_BringToBottom(WM_HWIN hWin);
例:
WM_BringToBottom(_hWindow1);
GUIDEMO_Delay(SPEED);
WM_HideWindow:使指定窗口不可見。
void WM_HideWindow(WM_HWIN hWin);調用此函數后,窗口不會立即“不可見”。在執行WM_Exec() 時,其它窗口的無效區域(出現在要隱藏窗口“后面”的區域)將重繪。隱藏父窗口時,父窗口上的子窗口也會消息。
WM_HideWindow(hChild2);
GUIDEMO_Delay(1000/3);
WM_ShowWindow:使指定窗口顯示。
WM_ShowWindow(hWindow1);
GUIDEMO_Delay(1000/3);
WM_GetInsideRect:
void WM_GetInsideRect(GUI_RECT* pRect);
返回客戶區的坐標,該區域由活動小工具尺寸減去邊界尺寸確定。此函數向活動窗口發送一條消息,檢
索內部矩形。如果小工具不處理此消息(也即意味著小工具沒有邊界),則需使用 WM_GetClientRect函數計算出矩形。結果通過窗口坐標給出。也即, GUI_RECT結構中的 x0和y0相當于x 和y 的邊界尺寸, x1和y1相當于窗口尺寸減去邊界尺寸 -1。
客戶區:一個窗口的客戶區簡單地說是它的可使用區。如果一個窗口包括一個邊框或標題欄,則客戶區是內部的矩形區域。如果沒有這樣一個 邊框或標題欄 ,則客戶區等于窗口本身
WM_GetWindowSizeX/WM_GetWindowSizeY:
int WM_GetWindowSizeX(WM_HWIN hWin) ...Y(WM_HWIN hWin)
返回窗口的水平尺寸(寬度) ,返回窗口的垂直尺寸(高度)
WM_GetWindowSizeX(pMsg->hWin);pMsg為發送給窗口的消息。
WM_DefaultProc:窗口消息的默認處理函數
void WM_DefaultProc(WM_MESSAGE* pMsg);
WM_MoveTo():將指定窗口移動到某個位置
void WM_MoveTo(WM_HWIN hWin, int x, int y);父窗口移動時,子窗口是跟著做相應移動;
【WM_MoveTo使用說明】
WM_MoveTo剛開始用的時候,移動一個窗口,窗口一直會留下運動的痕跡;
后來學習別人的例程,了解到,所有窗口都是桌面窗口的繼承窗口;因為窗口移動,不僅被移動的窗口要重繪,桌面窗口也要重繪,所以必須給桌面通過 WM_SetCallback(WM_GetDesktopWindow(), BkWindow)函數配置一個桌面的回調函數,在回調函數中處理重繪信息WM_PAINT時,要設置好背景色(與桌面窗口的背景一致),然后調用GUI_Clear(),這樣移動窗口的移動痕跡就沒有了,同理子窗口在父窗口中移動時,父窗口的WM_PAINT也要如此處理,即一個原則就是要在重繪時清除移動窗口所在的上層窗口,以去掉痕跡。
WM_MoveWindow():將指定窗口移動某段距離
void WM_MoveWindow(WM_HWIN hWin, int dx, int dy);
WM_ResizeWindow:通過增加(或減少)給定差別更改指定窗口的尺寸
WM_ResizeWindow(_hWindow2, -1, -1);
GUI_Delay(tDiff);
WM_DeleteWindow:刪除一個窗口
///////////////窗口設計shil///////////////////
下面就是一個窗口的一個設計,建立窗口后,在窗口的區域默認是黑色;且窗口使用存儲設備;建好之后,是不會直接顯示出來的,但可通過各種途徑調用WM_EXEC()來完成作業(這里是GUIDEMO_Delay);
建立好之后,在它的回調函數里面設置各個消息的處理操作;
用戶對操作的各種操作,都會向串口發送對應的消息;消息都可以通過WM_DefaultProc進行默認處理;如果要想達到一定效果可以分開處理,這里要重繪窗口,處理WM_PAINT消息,在這個消息處理中先設置好環境顏色,在窗口區域內畫了一個矩形顯示了漢子,做出一個彩色窗口。
【改變窗口背景兩種方法:1.在窗口的回調函數的WM_PAINT中先設置背景色,再GUI_Clear()
2.在窗口的回調函數的WM_PAINT中先設置背景色,再可以畫框等
】
【一個窗口會接收到不同的消息,用回調函數來處理消息是窗口最合適的選擇,尤其是窗體重繪WM_PAINT】
static void Window1(WM_MESSAGE* pMsg) {
GUI_RECT Rect;
int x, y;
switch (pMsg->MsgId) {
case WM_PAINT:
WM_GetInsideRect(&Rect);
GUI_SetBkColor(GUI_RED);
GUI_SetColor(GUI_YELLOW);
GUI_ClearRectEx(&Rect);
GUI_DrawRectEx(&Rect);
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_Font24_ASCII);
x = WM_GetWindowSizeX(pMsg->hWin);
y = WM_GetWindowSizeY(pMsg->hWin);
GUI_DispStringHCenterAt("Window 1", x / 2, (y / 2) - 12);
break;
default:
WM_DefaultProc(pMsg); //要處理WM_GetInsideRect發過來的消息(檢索內部矩形的大小)
}
}
static void cbChild(WM_MESSAGE* pMsg) {
int x, y;
switch (pMsg->MsgId) {
case WM_PAINT:
GUI_SetBkColor(GUI_WHITE);
GUI_Clear(); //清除的范圍是子窗口即該回調函數對應的窗口,其他的窗口均不受影響
GUI_SetColor(GUI_RED);
GUI_SetFont(&GUI_Font24_ASCII);
x = WM_GetWindowSizeX(pMsg->hWin);
y = WM_GetWindowSizeY(pMsg->hWin);
GUI_DispStringHCenterAt("Child window", x / 2, (y / 2) - 12);
break;
default:
WM_DefaultProc(pMsg);
}
}
WM_HWIN hWindow1;
hWindow1 = WM_CreateWindow( 50, 70, 165, 100, WM_CF_SHOW|WM_CF_MEMDEV , Window1, 0);
GUIDEMO_Delay(1000/3);
hChild = WM_CreateWindowAsChild(10, 50, 145, 40, hWindow1, WM_CF_SHOW | WM_CF_MEMDEV, cbChild, 0);
GUIDEMO_Delay(1000);
/////////////////////////////////////////////
3:GUI環境設置
背景、前景顏色設置(這里只是設置顏色,需要通過GUI_Clear()全部換成新的背景色)
設置(還有有讀取)當前背景顏色:GUI_COLOR GUI_SetBkColor(GUI_COLOR Color)
設置(還有有讀取)當前前景色: void GUI_SetColor(GUI_COLOR Color);
【 GUI_Clear()清除背景時,清除的范圍是調用函數時所多對應的窗口,其他的窗口(包括桌面窗口)等均不受影響, 】
設置用于文本輸出的字體
GUI_SetFont() 設置當前字體:const GUI_FONT * GUI_SetFont(const GUI_FONT * pNewFont);
GUI_SetFont(&GUI_Font24_ASCII);
GUI_SetDefaultFont() 設置默認字體
static void taskA (void *p_arg)
{
u8 tick=0;
(void)p_arg;
while(DEF_TRUE)
{
OSTimeDlyHMSM(0,0,0,10);
GUI_TOUCH_Exec();
}
}
GUI_TOUCH_Exec()在這個函數中調用TOUCH_X_MeasureY TOUCH_X_MeasureX檢測觸摸屏的觸摸位置,保存在xPhys、yPhys 中,應用層可以通過GUI_TOUCH_GetyPhys來獲取這個值。
yPhys = TOUCH_X_MeasureY();
xPhys = TOUCH_X_MeasureX();
int GUI_TOUCH_GetyPhys(void) {
return yPhys;
}
5:窗口對象(小工具)
1:BUTTON:可按下的按鈕。按鈕上可顯示文本或位圖
int Key;
BUTTON_Handle hButton1;
hButton1 = BUTTON_CreateEx(10,10,50,50,0,WM_CF_SHOW,0,'1');
BUTTON_SetText(hButton1,"hello!");//按鍵上顯示的文字
do {
Key = GUI_GetKey();//BUTTON創建后,會響應觸摸屏的觸摸消息;通過GUI_GetKey()可以獲取鍵緩沖器中的字符編碼;若未緩沖鍵,則返回值為0,緩沖鍵可以理解為被按下的 BUTTON,若有BUTTON被按下,它的ID值就會傳送到鍵緩沖器中,用GUI_GetKey可以讀到。
代碼://此處需根據Key值或超時退出while循環等待
GUI_Delay(100);//內部調用GUI_Exec(); 有事件或操作任務需要通過GUI_Exec()來最終執行,
} while()
2: EDIT:文本編輯框控件,編輯區通常用作輸入文本的主要用戶接口
EDIT_Handle hEdit;
hEdit = EDIT_Create( 200, 114, 100, 25, ' ', 80, 0 );
EDIT_SetFont(hEdit, &GUI_Font8x16);
GUIDEMO_Delay(100);
do {
Key = GUIDEMO_WaitKey();//內部包含GUI_GetKey()與GUI_Exec(),獲取緩沖鍵的ID
switch (Key) {
case 0:
case GUI_ID_CANCEL:
break;
default:
EDIT_AddKey(hEdit, Key);//在EDIT中顯示Key
}
} while ((Key != '3') && (Key!=GUI_ID_CANCEL));
/////EDIT_GetText() 獲取用戶輸入