Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15366768
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: C/C++

2007-08-30 14:20:11

μC/GUI-v3.90a在应用程序中WM控件怎么绘制到LCD上?
//---------------------------------------------------------------------------
//内部不含有剪切计算函数WM_ITERATE_START()的WM窗体控件
1.BUTTON
2.CHECKBOX
3.DROPDOWN
4.LISTBOX
5.MENU
6.MESSAGEBOX
7.MULTIPAGE
8.PROGBAR
9.RADIO
10.SCROLLBAR
11.SLIDER
12.TEXT
13.WINDOW
以上控件的所有剪切域都由
WM_Exec1()->_DrawNext()->_Paint()->WM__PaintWinAndOverlays()->_Paint1()函数提供,
所以以上所有控件的绘制,必须经由_Paint1()->WM_SendMessage()发送给相应控件WM_PAINT消息才能完成.
//---------------------------------------------------------------------------
//内部含有剪切计算函数WM_ITERATE_START()的WM窗体控件---status属性为WM_SF_LATE_CLIP
1.EDIT
2.FRAMEWIN
因为以上控件PAINT时,会自身调用WM_ITERATE_START()函数进行剪切,所以,对于以上控件的绘制
仅仅发送WM_SendMessage(WM_PAINT)消息即可,
static void _Paint1(WM_HWIN hWin, WM_Obj* pWin) {
  int Status = pWin->Status;
  if ((pWin->cb != NULL) && (Status & WM_SF_ISVIS)) {
    WM_MESSAGE Msg;
    WM__PaintCallbackCnt++;
    if (Status & WM_SF_LATE_CLIP) {
    //仅需要直接发送绘制消息即可,相应控件内部WM_PAINT消息处理时,已经调用WM_ITERATE_START()
      Msg.hWin = hWin;//内部含有剪切计算函数WM_ITERATE_START()的WM窗体控件
      Msg.MsgId = WM_PAINT;
      Msg.Data.p = (GUI_RECT*)&pWin->InvalidRect;
      WM_SetDefault();
      WM_SendMessage(hWin, &Msg);
    } else {
      WM_ITERATE_START(&pWin->InvalidRect) {
//首先完成当前hWin窗体控件的剪切域计算,之后发送绘制消息,由hWin的WM_PAINT消息处理代码填充剪切域窄条
//而当前hWin可能是FRAMEWIN客户区Client的一个GUI_ID_VSCROLL垂直滚动条控件
//总之所有属性为WM_SF_INVALID的位于WM__FirstWin窗体单向链表上的窗体,且status属性不是WM_SF_LATE_CLIP的
//控件都会通过这里:先计算该hWin控件的剪切域窄条,之后发送绘制消息WM_PAINT给该当前hWin控件,
//当前hWin控件在WM_PAINT消息处理代码中,将hWin控件位于剪切域窄条矩形区域中的部分绘制出来,
//最后一个hWin控件就由这样一个个可见的剪切域窄条拼接出来了.[gliethttp]
//我想之所以要集中在这里统一进行剪切,主要目的在于:
//让控件处理WM_PAINT消息的代码一方面更专心,另一方面代码更清晰、更简洁明了.
        Msg.hWin = hWin;//内部不含有剪切计算函数WM_ITERATE_START()的控件剪切绘制
        Msg.MsgId = WM_PAINT;
        Msg.Data.p = (GUI_RECT*)&pWin->InvalidRect;
        WM_SetDefault();
        WM_SendMessage(hWin, &Msg);
      } WM_ITERATE_END();
    }
    WM__PaintCallbackCnt--;
  }
}
//---------------------------------------------------------------------------
//独立于WM窗体的,直接调用就可以直接显示到LCD上的已经包含剪切计算函数WM_ITERATE_START()的函数
//所以以下函数个个都是可以独立完成剪切绘制的自治函数
GUI_ClearRect
GUI_FillRect
GUI_InvertRect
GUI_FillPolygon
GUI_DrawVLine
GUI_DrawHLine

GUI_DispString
GUI_DispChar
GUI__DispLine

GUI_DrawBitmap

GUI_DrawEllipse
GUI_FillEllipse
GUI_DrawCircle
GUI_FillCircle
GUI_DrawArc

阅读(3296) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~