全部博文(2005)
分类: 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