uCGUI使用

http://blog.sina.com.cn/s/blog_6b94d5680101e9v3.html


最好多参考几篇文章,比如UC/GUI中文手册与emWin5_UM_SC

0:画图函数
   GUI_DrawRect: 在当前窗口中的指定位置绘制矩形(不填充,画线颜色为前景色)
       void GUI_DrawRect(int x0, int y0, int x1, int y1);
   GUI_FillRect: 在当前窗口中的指定位置绘制填充的矩形区域 (填充前景色)
   GUI_ClearRect:清除矩形区域(为 矩形区域填充背景颜色,图形界面用填充背景色达到清除屏幕的                               效果
1:存储设备
    不使用存储设备时,绘制操作直接写入显示器。屏幕在执行绘制操作时随时更新,从而在进行各
种更新时使屏幕闪烁。如果在此过程中使用存储设备,则所有绘制操作都在存储器中执行。仅在所有操作都完成后才将最终结果显示在屏幕上,其优点是没有闪烁。
      如果不使用存储设备,则可以看到一步步的绘制操作效果,缺点是会出现显示器闪 
烁。 使用存储设备时,一次可见到所有例程的效果,就象单次操作一样,不能实际看见中间步骤。
      以下例程是在使用存储设备时通常会调用的,基本用法非常简单:
              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() 设置默认字体

4:通过触摸屏获取输入信息
  int CursorX 、CursorY ;
  CursorX = GUI_TOUCH_GetxPhys();
   CursorY = GUI_TOUCH_GetyPhys();
  GUI_CURSOR_SetPosition(CursorX,CursorY);
  GUI_Delay(100); //调用GUI_EXEC() 完成操作作业

  在UC/OS中,一般通过建立一个高优先级的任务,来通过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()在这个函数中调用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() 获取用户输入

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值