/* no message */ return FALSE; }
第一步部分,是获取消息的部分; 第二部分,是等待消息循环的部分。
第二部分,请看函数最后部分,if(bWait)的代码。对于线程版,它就是通过wait信号量,让自己进入休眠。对于进程版和standalone版,它调用OnIdle回调。OnIdle回调在进程版中和线程版转化为对端口的select方法调用,从而导致一个较短时间的休眠。
重点看第一部分,它按照优先级,依次取MSG_QUIT消息,同步消息,notify消息,post消息,和MSG_PAINT消息和MSG_TIMER消息。
#define IS_MSG_WANTED(message) \\
( (iMsgFilterMin <= 0 && iMsgFilterMax <= 0) || \\
(iMsgFilterMin > 0 && iMsgFilterMax >= iMsgFilterMin && \\
message >= iMsgFilterMin && message <= iMsgFilterMax) )
msgCheckInvalidRegion函数判断窗口是否存在无效区域,如果存在,则是需要重绘,否则,它会继续查找下个hosted窗口。
3、相关函数
1、msgCheckHostedTree
static HWND msgCheckHostedTree (PMAINWIN pHosting) {
HWND hNeedPaint; PMAINWIN pHosted;
if ( (hNeedPaint = msgCheckInvalidRegion (pHosting)) ) return hNeedPaint;
pHosted = pHosting->pFirstHosted; while (pHosted) {
if ( (hNeedPaint = msgCheckHostedTree (pHosted)) ) return hNeedPaint;
pHosted = pHosted->pNextHosted; } return 0;
}
2、msgCheckInvalidRegion
static HWND msgCheckInvalidRegion (PMAINWIN pWin)
{
PCONTROL pCtrl = (PCONTROL)pWin; HWND hwnd;
if (pCtrl->InvRgn.rgn.head) return (HWND)pCtrl;
pCtrl = pCtrl->children; while (pCtrl) {
if ((hwnd = msgCheckInvalidRegion ((PMAINWIN) pCtrl))) return hwnd;
pCtrl = pCtrl->next; }
return 0; }
这里面涉及很多点:
1. MiniGUI窗口的管理方式,是主窗口和普通窗口分离的。主窗口采用hosting的链表
树方式管理,可以遍历到所有的主窗口。而每个主窗口则是一个树的根节点,通过parent-child关系管理所有的子窗口。所以,msgCheckHostedTree是遍历主窗口用的,而msgCheckInvalidRegion是遍历子窗口用的。注意这两个函数的返回值,都是需要重绘的窗口句柄。
2. 当找到一个需要重绘的窗口句柄的时候,它就返回该窗口句柄。返回后,消息循环
接下来回调用DispatchMessage,该函数会调用到窗口过程。在窗口过程中,处理MSG_PAINT消息时,我们必须用BeginPaint和EndPaint来获取绘制的DC。这一点非常重要,因为在BeginPaint中,会清除无效区域。当无效区域被清除后,下次在此调用msgCheckHostedTree和msgCheckInvalidRegion的时候,该窗口的子窗口或者兄弟窗口就会被检测。一直等到所有窗口被检测完毕后,整个绘制过程才算完成。在此过程中,MiniGUI会多次遍历所有的窗口。
3. msgCheckHostedTree和msgCheckInvalidRegion相结合使用,是通过递归的方法
进行的一个先根遍历法,这个方法,总是能够保证父窗口先于子窗口被绘制,从而保证了窗口之间以正确的次序被绘制。
六、输入事件响应流程
1、底层事件初始化InitLWEvent():
BOOL InitLWEvent (void) {
GetDblclickTime (); //获得鼠标双击时间间隔 GetTimeout (); //获得超时时间 if (InitIAL ()) //初始化输入抽象层 return FALSE;
ResetMouseEvent(); //重置鼠标事件
ResetKeyEvent(); //重置键盘事件 return TRUE;
}
2、初始化输入抽象层InitIAL ():
1、数据结构INPUT:
typedef struct tagINPUT {
char* id;
// Initialization and termination
BOOL (*init_input) (struct tagINPUT *input, const char* mdev, const char* mtype); void (*term_input) (void);
// Mouse operations
int (*update_mouse) (void); void (*get_mouse_xy) (int* x, int* y); void (*set_mouse_xy) (int x, int y); int (*get_mouse_button) (void);
void (*set_mouse_range) (int minx, int miny, int maxx, int maxy); void (*suspend_mouse) (void); int (*resume_mouse) (void);
// Keyboard operations
int (*update_keyboard) (void); const char* (*get_keyboard_state) (void); void (*suspend_keyboard) (void); int (*resume_keyboard) (void); void (*set_leds) (unsigned int leds);
int (*wait_event) (int which, int maxfd, fd_set *in, fd_set *out,fd_set *except, struct timeval *timeout);
char mdev [MAX_PATH + 1]; }INPUT;
2、输入引擎的参数信息:
static INPUT inputs [] = {
/* General IAL engines ... */ #ifdef _DUMMY_IAL
{\, InitDummyInput, TermDummyInput}, #endif
#ifdef _AUTO_IAL
{\, InitAutoInput, TermAutoInput}, #endif
#ifdef _RANDOM_IAL
{\, InitRandomInput, TermRandomInput}, #endif
#ifdef _CUSTOM_IAL
{\, InitCustomInput, TermCustomInput}, #endif
#ifdef _COMM_IAL
{\, InitCOMMInput, TermCOMMInput}, #endif
#ifdef _QVFB_IAL
{\, InitQVFBInput, TermQVFBInput}, #endif
#ifdef _WVFB_IAL
{\, InitWVFBInput, TermWVFBInput}, #endif
#ifdef _NATIVE_IAL_ENGINE
{\, InitNativeInput, TermNativeInput}, #endif
#ifdef _DFB_IAL
{\, InitDFBInput, TermDFBInput}, #endif
/* ... end of general IAL engines */
/* Board-specific IAL engines... */ #ifdef _ADS_IAL
{\, InitADSInput, TermADSInput}, #endif
#ifdef _VR4181_IAL
{\, InitVR4181Input, TermVR4181Input}, #endif
#ifdef _HELIO_IAL
{\, InitHelioInput, TermHelioInput}, #endif
#ifdef _EP7211_IAL
{\, InitEP7211Input, TermEP7211Input}, #endif
#ifdef _TFSTB_IAL
{\, InitTFSTBInput, TermTFSTBInput}, #endif
#ifdef _HH5249KBDIR_IAL
{\, InitHH5249KbdIrInput, TermHH5249KbdIrInput}, #endif
#ifdef _IPAQ_IAL
{\, InitIPAQInput, TermIPAQInput}, #endif
#ifdef _T800_IAL
{\, InitT800Input, TermT800Input}, #endif
#ifdef _MPC823_IAL
{\, InitMPC823Input, TermMPC823Input}, #endif
#ifdef _UCB1X00_IAL
{\, InitUCB1X00Input, TermUCB1X00Input}, #endif
#ifdef _PX255B_IAL
{\, InitPX255BInput, TermPX255BInput}, #endif
#ifdef _MC68X328_IAL
{\, InitMC68X328Input, TermMC68X328Input}, #endif
#ifdef _SMDK2410_IAL
{\, Init2410Input, Term2410Input}, #endif
#ifdef _DMGSTB_IAL
{\, InitDMGSTBInput, TermDMGSTBInput}, #endif
#ifdef _FIP_IAL
{\, InitFIPInput, TermFIPInput}, #endif
#ifdef _PALMII_IAL
{\, InitPALMIIInput, TermPALMIIInput}, #endif
#ifdef _HH2410R3_IAL
{\, InitHH2410R3Input, TermHH2410R3Input}, #endif
#ifdef _C33L05_IAL
{\, InitC33L05Input, TermC33L05Input}, #endif
#ifdef _HH2440_IAL
{\, InitHH2440Input, TermHH2440Input}, #endif
#ifdef _EMBEST44B0_IAL
{\, InitEMBEST44b0Input, TermEMBEST44b0Input}, #endif
#ifdef _SVPXX_IAL
{\, InitSvpxxInput, TermSvpxxInput}, #endif
#ifdef _ADS7846_IAL
{\, InitAds7846Input, TermAds7846Input},
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库minigui代码分析(4)在线全文阅读。
相关推荐: