以下例程是在使用存儲(chǔ)設(shè)備時(shí)通常會(huì)調(diào)用的,基本用法非常簡(jiǎn)單:
1. 創(chuàng)建存儲(chǔ)設(shè)備(使用GUI_MEMDEV_Create() )。
2. 激活它(使用GUI_MEMDEV_Select() )。
3. 執(zhí)行繪制操作。
4. 將結(jié)果復(fù)制到顯示器中(使用GUI_MEMDEV_CopyToLCD() )。
5. 不再需要它時(shí),刪除該存儲(chǔ)設(shè)備(使用 GUI_MEMDEV_Delete() )。
2:WM窗口管理器
回調(diào)例程:回調(diào)例程由用戶程序定義,指示在特定事件出現(xiàn)時(shí)圖形系統(tǒng)調(diào)用特定的函數(shù)。它們通常用于在窗口內(nèi)容更改時(shí)自動(dòng)重繪窗口。窗口管理器的默認(rèn)特性是向每個(gè)需要重繪的窗口發(fā)送一條 WM_PAINT 。
當(dāng)用戶對(duì)窗口有操作時(shí),WM會(huì)發(fā)送相應(yīng)的消息給該窗口,窗口可通過(guò)回調(diào)函數(shù)根據(jù)消息直接對(duì)屏(沒(méi)有用存儲(chǔ)設(shè)備時(shí))或?qū)Υ翱诘拇鎯?chǔ)設(shè)備進(jìn)行操作再拷貝到屏幕上,具體的消息說(shuō)明可以參考emWin的中文手冊(cè)。
WM_SetCallback
設(shè)置窗口的回調(diào)例程:WM_CALLBACK* WM_SetCallback (WM_HWIN hWin, WM_CALLBACK* cb)
有了這個(gè)函數(shù)就可以動(dòng)態(tài)的選擇操作的重繪操作等消息的響應(yīng)動(dòng)作了。
WM_SetDesktopColor
設(shè)置桌面窗口的顏色:WGUI_COLOR WM_SetDesktopColor(GUI_COLOR Color);
桌面窗口由視窗管理器自動(dòng)創(chuàng)建,總是覆蓋整個(gè)顯示區(qū)域。它始終是一個(gè)最底層的窗口,沒(méi)有定義其 他窗口,它就是默認(rèn)活動(dòng)窗口。所有窗口都是桌面窗口的繼承窗口。桌面窗口的默認(rèn)設(shè)置不用于自身 重新著色。如果不調(diào)用此函數(shù),則桌面窗口不進(jìn)行重繪;因此其它窗口將保持可見(jiàn),即使在將它們刪 除之后。一旦使用此函數(shù)指定了顏色,則桌面窗口將進(jìn)行自身重新著色。為了恢復(fù)默認(rèn)設(shè)置,請(qǐng)調(diào)用 此函數(shù)并指定GUI_INVALID_COLOR 。
對(duì)桌面窗口顏色設(shè)置后,需要調(diào)用WM_Exec(),通過(guò)執(zhí)行回調(diào)函數(shù)重繪無(wú)效窗口(針對(duì)所有作業(yè)),這 樣新的桌面窗口的顏色就會(huì)顯現(xiàn)。
GUI_Exec【重要、重要,進(jìn)行操作動(dòng)作后,一般都要會(huì)通過(guò)一個(gè)GUI延時(shí)函數(shù)(GUI_Delay)來(lái)間接調(diào)用該函數(shù),也可以單獨(dú)建立一個(gè)任務(wù)來(lái)執(zhí)行GUI_Exec()函數(shù)】
GUI_Exec()可以理解為GUI執(zhí)行函數(shù),調(diào)用了很多操作函數(shù)或發(fā)生了相關(guān)的動(dòng)作,最后都需要通過(guò)GUI_Exec()函數(shù)通過(guò)各個(gè)回調(diào)函數(shù)來(lái)一一執(zhí)行,所以函數(shù)名叫GUI_Exec
此函數(shù)將自動(dòng)重復(fù)調(diào)用WM_Exec1(),直至完成所有作業(yè) – 實(shí)質(zhì)是直至返回0 值為止。建議調(diào)用函數(shù)GUI_Exec()作為代替。通常,此函數(shù)無(wú)需由用戶應(yīng)用程序調(diào)用,它自動(dòng)由GUI_Delay() 調(diào)用,所以一般作業(yè)后都調(diào)用一個(gè)GUI_Delay(),使作業(yè)顯現(xiàn)出來(lái)。如果使用的是多任務(wù)系統(tǒng),建議通過(guò)單獨(dú)的任務(wù)執(zhí)行此函數(shù),如下所示:
void ExecIdleTask(void)
{
while(1) {
WM_Exec();//調(diào)用WM_Exec()完成到顯示屏的顯示作業(yè)(我的理解是:(類(lèi)似于)調(diào)用該函數(shù)前,其他的函數(shù)執(zhí)行繪制操作,WM_Exec完成將結(jié)果復(fù)制到顯示器中)
}
}
WM_InvalidateWindow:調(diào)用此函數(shù)會(huì)告訴WM 指定的窗口未更新
WM_PAINT消息: 窗口變?yōu)闊o(wú)效并應(yīng)重繪時(shí),發(fā)送到窗口。
void WM_InvalidateWindow(WM_HWIN hWin);
WM_BringToTop:將窗口放在其同屬窗口前面
void WM_BringToTop(WM_HWIN hWin);該窗口將放置在其他所有同屬窗口及父窗口的頂部,加入同屬于A窗口的B、C兩個(gè)子窗口,B先C后,則可以通過(guò)該函數(shù)將B又放在前面。
WM_BringToBottom:窗口將放置在所有其他同屬窗口的下面,但將留在其父窗口的前面。
void WM_BringToBottom(WM_HWIN hWin);
例:
WM_BringToBottom(_hWindow1);
GUIDEMO_Delay(SPEED);
WM_HideWindow:使指定窗口不可見(jiàn)。
void WM_HideWindow(WM_HWIN hWin);調(diào)用此函數(shù)后,窗口不會(huì)立即“不可見(jiàn)”。在執(zhí)行WM_Exec() 時(shí),其它窗口的無(wú)效區(qū)域(出現(xiàn)在要隱藏窗口“后面”的區(qū)域)將重繪。隱藏父窗口時(shí),父窗口上的子窗口也會(huì)消息。
WM_HideWindow(hChild2);
GUIDEMO_Delay(1000/3);
WM_ShowWindow:使指定窗口顯示。
WM_ShowWindow(hWindow1);
GUIDEMO_Delay(1000/3);
WM_GetInsideRect:
void WM_GetInsideRect(GUI_RECT* pRect);
返回客戶區(qū)的坐標(biāo),該區(qū)域由活動(dòng)小工具尺寸減去邊界尺寸確定。此函數(shù)向活動(dòng)窗口發(fā)送一條消息,檢
索內(nèi)部矩形。如果小工具不處理此消息(也即意味著小工具沒(méi)有邊界),則需使用 WM_GetClientRect函數(shù)計(jì)算出矩形。結(jié)果通過(guò)窗口坐標(biāo)給出。也即, GUI_RECT結(jié)構(gòu)中的 x0和y0相當(dāng)于x 和y 的邊界尺寸, x1和y1相當(dāng)于窗口尺寸減去邊界尺寸 -1。
客戶區(qū):一個(gè)窗口的客戶區(qū)簡(jiǎn)單地說(shuō)是它的可使用區(qū)。如果一個(gè)窗口包括一個(gè)邊框或標(biāo)題欄,則客戶區(qū)是內(nèi)部的矩形區(qū)域。如果沒(méi)有這樣一個(gè) 邊框或標(biāo)題欄 ,則客戶區(qū)等于窗口本身
WM_GetWindowSizeX/WM_GetWindowSizeY:
int WM_GetWindowSizeX(WM_HWIN hWin) ...Y(WM_HWIN hWin)
返回窗口的水平尺寸(寬度) ,返回窗口的垂直尺寸(高度)
WM_GetWindowSizeX(pMsg->hWin);pMsg為發(fā)送給窗口的消息。
WM_DefaultProc:窗口消息的默認(rèn)處理函數(shù)
void WM_DefaultProc(WM_MESSAGE* pMsg);
WM_MoveTo():將指定窗口移動(dòng)到某個(gè)位置
void WM_MoveTo(WM_HWIN hWin, int x, int y);父窗口移動(dòng)時(shí),子窗口是跟著做相應(yīng)移動(dòng);
【WM_MoveTo使用說(shuō)明】
WM_MoveTo剛開(kāi)始用的時(shí)候,移動(dòng)一個(gè)窗口,窗口一直會(huì)留下運(yùn)動(dòng)的痕跡;
后來(lái)學(xué)習(xí)別人的例程,了解到,所有窗口都是桌面窗口的繼承窗口;因?yàn)榇翱谝苿?dòng),不僅被移動(dòng)的窗口要重繪,桌面窗口也要重繪,所以必須給桌面通過(guò) WM_SetCallback(WM_GetDesktopWindow(), BkWindow)函數(shù)配置一個(gè)桌面的回調(diào)函數(shù),在回調(diào)函數(shù)中處理重繪信息WM_PAINT時(shí),要設(shè)置好背景色(與桌面窗口的背景一致),然后調(diào)用GUI_Clear(),這樣移動(dòng)窗口的移動(dòng)痕跡就沒(méi)有了,同理子窗口在父窗口中移動(dòng)時(shí),父窗口的WM_PAINT也要如此處理,即一個(gè)原則就是要在重繪時(shí)清除移動(dòng)窗口所在的上層窗口,以去掉痕跡。
WM_MoveWindow():將指定窗口移動(dòng)某段距離
void WM_MoveWindow(WM_HWIN hWin, int dx, int dy);
WM_ResizeWindow:通過(guò)增加(或減少)給定差別更改指定窗口的尺寸
WM_ResizeWindow(_hWindow2, -1, -1);
GUI_Delay(tDiff);
WM_DeleteWindow:刪除一個(gè)窗口
///////////////窗口設(shè)計(jì)shil///////////////////
下面就是一個(gè)窗口的一個(gè)設(shè)計(jì),建立窗口后,在窗口的區(qū)域默認(rèn)是黑色;且窗口使用存儲(chǔ)設(shè)備;建好之后,是不會(huì)直接顯示出來(lái)的,但可通過(guò)各種途徑調(diào)用WM_EXEC()來(lái)完成作業(yè)(這里是GUIDEMO_Delay);
建立好之后,在它的回調(diào)函數(shù)里面設(shè)置各個(gè)消息的處理操作;
用戶對(duì)操作的各種操作,都會(huì)向串口發(fā)送對(duì)應(yīng)的消息;消息都可以通過(guò)WM_DefaultProc進(jìn)行默認(rèn)處理;如果要想達(dá)到一定效果可以分開(kāi)處理,這里要重繪窗口,處理WM_PAINT消息,在這個(gè)消息處理中先設(shè)置好環(huán)境顏色,在窗口區(qū)域內(nèi)畫(huà)了一個(gè)矩形顯示了漢子,做出一個(gè)彩色窗口。
【改變窗口背景兩種方法:1.在窗口的回調(diào)函數(shù)的WM_PAINT中先設(shè)置背景色,再GUI_Clear()
2.在窗口的回調(diào)函數(shù)的WM_PAINT中先設(shè)置背景色,再可以畫(huà)框等
】
【一個(gè)窗口會(huì)接收到不同的消息,用回調(diào)函數(shù)來(lái)處理消息是窗口最合適的選擇,尤其是窗體重繪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發(fā)過(guò)來(lái)的消息(檢索內(nèi)部矩形的大小)
}
}
static void cbChild(WM_MESSAGE* pMsg) {
int x, y;
switch (pMsg->MsgId) {
case WM_PAINT:
GUI_SetBkColor(GUI_WHITE);
GUI_Clear(); //清除的范圍是子窗口即該回調(diào)函數(shù)對(duì)應(yīng)的窗口,其他的窗口均不受影響
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環(huán)境設(shè)置
背景、前景顏色設(shè)置(這里只是設(shè)置顏色,需要通過(guò)GUI_Clear()全部換成新的背景色)
設(shè)置(還有有讀取)當(dāng)前背景顏色:GUI_COLOR GUI_SetBkColor(GUI_COLOR Color)
設(shè)置(還有有讀取)當(dāng)前前景色: void GUI_SetColor(GUI_COLOR Color);
【 GUI_Clear()清除背景時(shí),清除的范圍是調(diào)用函數(shù)時(shí)所多對(duì)應(yīng)的窗口,其他的窗口(包括桌面窗口)等均不受影響, 】
設(shè)置用于文本輸出的字體
GUI_SetFont() 設(shè)置當(dāng)前字體:const GUI_FONT * GUI_SetFont(const GUI_FONT * pNewFont);
GUI_SetFont(&GUI_Font24_ASCII);
GUI_SetDefaultFont() 設(shè)置默認(rèn)字體