久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

uCGUI使用

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月18日   【字體:
最好多參考幾篇文章,比如UC/GUI中文手冊(cè)與emWin5_UM_SC
 
0:畫(huà)圖函數(shù)
   GUI_DrawRect:在當(dāng)前窗口中的指定位置繪制矩形(不填充,畫(huà)線顏色為前景色)
       void GUI_DrawRect(int x0, int y0, int x1, int y1);
   GUI_FillRect:在當(dāng)前窗口中的指定位置繪制填充的矩形區(qū)域(填充前景色)
   GUI_ClearRect:清除矩形區(qū)域(為矩形區(qū)域填充背景顏色,圖形界面用填充背景色達(dá)到清除屏幕的                               效果

1:存儲(chǔ)設(shè)備

    不使用存儲(chǔ)設(shè)備時(shí),繪制操作直接寫(xiě)入顯示器。屏幕在執(zhí)行繪制操作時(shí)隨時(shí)更新,從而在進(jìn)行各
種更新時(shí)使屏幕閃爍。如果在此過(guò)程中使用存儲(chǔ)設(shè)備,則所有繪制操作都在存儲(chǔ)器中執(zhí)行。僅在所有操作都完成后才將最終結(jié)果顯示在屏幕上,其優(yōu)點(diǎn)是沒(méi)有閃爍。
    如果不使用存儲(chǔ)設(shè)備,則可以看到一步步的繪制操作效果,缺點(diǎn)是會(huì)出現(xiàn)顯示器閃
爍。使用存儲(chǔ)設(shè)備時(shí),一次可見(jiàn)到所有例程的效果,就象單次操作一樣,不能實(shí)際看見(jiàn)中間步驟。
    以下例程是在使用存儲(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)字體
 
4:通過(guò)觸摸屏獲取輸入信息
  int CursorX 、CursorY ;
  CursorX = GUI_TOUCH_GetxPhys();
  CursorY = GUI_TOUCH_GetyPhys();
  GUI_CURSOR_SetPosition(CursorX,CursorY);
  GUI_Delay(100); //調(diào)用GUI_EXEC() 完成操作作業(yè)

  在UC/OS中,一般通過(guò)建立一個(gè)高優(yōu)先級(jí)的任務(wù),來(lái)通過(guò)GUI_TOUCH_Exec()掃描觸摸屏,獲得
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()在這個(gè)函數(shù)中調(diào)用TOUCH_X_MeasureY  TOUCH_X_MeasureX檢測(cè)觸摸屏的觸摸位置,保存在xPhys、yPhys 中,應(yīng)用層可以通過(guò)GUI_TOUCH_GetyPhys來(lái)獲取這個(gè)值。
yPhys = TOUCH_X_MeasureY();
xPhys = TOUCH_X_MeasureX();
 
int  GUI_TOUCH_GetyPhys(void) {
  return yPhys;
}
5:窗口對(duì)象(小工具)
 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創(chuàng)建后,會(huì)響應(yīng)觸摸屏的觸摸消息;通過(guò)GUI_GetKey()可以獲取鍵緩沖器中的字符編碼;若未緩沖鍵,則返回值為0,緩沖鍵可以理解為被按下的 BUTTON,若有BUTTON被按下,它的ID值就會(huì)傳送到鍵緩沖器中,用GUI_GetKey可以讀到。  
            代碼://此處需根據(jù)Key值或超時(shí)退出while循環(huán)等待
            GUI_Delay(100);//內(nèi)部調(diào)用GUI_Exec(); 有事件或操作任務(wù)需要通過(guò)GUI_Exec()來(lái)最終執(zhí)行,
         } while()
 
 2: EDIT:文本編輯框控件,編輯區(qū)通常用作輸入文本的主要用戶接口
        EDIT_Handle   hEdit;
        hEdit = EDIT_Create( 200, 114, 100, 25, ' ', 80, 0 );
        EDIT_SetFont(hEdit, &GUI_Font8x16);
        GUIDEMO_Delay(100);
do {
  Key = GUIDEMO_WaitKey();//內(nèi)部包含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() 獲取用戶輸入
關(guān)閉窗口
主站蜘蛛池模板: 久久国产精品一区二区三区 | 欧美精品二区 | 欧美自拍第一页 | 亚洲欧美日韩激情 | 中文字幕亚洲视频 | 精品久久久久一区二区国产 | 日韩欧美亚洲 | 最新中文字幕在线 | 午夜寂寞福利视频 | 国产精品国产三级国产aⅴ入口 | 国产成人精品午夜视频免费 | 日韩精品一区二区三区免费视频 | 日韩精品久久久 | 久久国产电影 | 日韩视频一区二区三区 | 国产精品一二区 | 四虎影视一区二区 | 国产成人精品视频在线观看 | 精品免费国产一区二区三区 | 久久精品国产一区老色匹 | 99热国产免费 | 伊人久久综合 | 国产精品无码专区在线观看 | 国产精品久久久 | 狠狠操狠狠干 | 国产精品久久久乱弄 | 一级黄色片在线免费观看 | 国产中文一区二区三区 | a免费观看 | 在线观看免费av片 | 爱爱免费视频 | av手机在线 | 天堂一区二区三区 | 欧美日韩成人影院 | 国产欧美视频一区二区 | 日韩在线 | 日本不卡免费新一二三区 | 欧美精品啪啪 | 美女日批免费视频 | 日韩中文字幕 | 久久青青|