//----设置焦点窗口--------------------------------------------------------------- //描述: 略. //参数:hwnd: 新的焦点窗口 //返回:旧的焦点窗口. //------------------------------------------------------------------------------ HWND SetFocusWindow(HWND hwnd) { HWND wnd=NULL; if(GDD_Lock()) { wnd =HWND_Focus; HWND_Focus =hwnd; GDD_Unlock(); } else { return NULL; } if(wnd!=NULL) { SendMessage(wnd,MSG_KILLFOCUS,0,0); } if(hwnd!=NULL) { SendMessage(hwnd,MSG_SETFOCUS,0,0); } return wnd; }
//----销毁一个窗口-------------------------------------------------------------- //描述: 可以是主窗口和子窗口,除了删除自身窗口结构,还将发送WSG_DESTROY消息给父窗口. //参数:hwnd:需要销毁的窗口句柄 //返回:无. //------------------------------------------------------------------------------ void DestroyWindow(HWND hwnd) { if(IsFocusWindow(hwnd)) { SetFocusWindow(NULL); } UpdateDisplay(); GDD_Lock(); if(HWND_Lock(hwnd)) { _DestroyChildWindow(hwnd); SendMessage(hwnd,MSG_DESTROY,0,0); if(hwnd->Style&WS_CHILD) { _DeleteChildWindowData(hwnd); } HWND_Unlock(hwnd); } GDD_Unlock(); }
//----获得焦点窗口--------------------------------------------------------------- //描述: 略. //参数:无. //返回:焦点窗口. //------------------------------------------------------------------------------ HWND GetFocusWindow(void) { HWND wnd=NULL; if(GDD_Lock()) { wnd =HWND_Focus; GDD_Unlock(); } return wnd; }
//----锁定窗口------------------------------------------------------------------ //描述: 锁定窗口,用于对窗口互斥操作,该函数返回TRUE时,必须调用HWND_Unlock解锁; // 而当该函数返回FALSE,则无需调用HWND_Unlock. //参数:hwnd:窗口句柄 //返回:成功:TRUE; 失败:FLASE; //------------------------------------------------------------------------------ BOOL HWND_Lock(HWND hwnd) { GDD_Lock(); if(NULL!=hwnd) if(WIN_TAG==hwnd->Tag) { //Lock_MutexPend(hwnd->mutex_lock,5000000); //GDD_Unlock(); return TRUE; } GDD_Unlock(); return FALSE; }
//----判断是否为焦点窗口--------------------------------------------------------- //描述: 略. //参数:无. //返回:如果指定的窗口是焦点窗口,将返回TRUE,否则返回FALSE. //------------------------------------------------------------------------------ BOOL IsFocusWindow(HWND hwnd) { BOOL res=FALSE; if(HWND_Lock(hwnd)) { if(GDD_Lock()) { if(hwnd == HWND_Focus) { res=TRUE; } GDD_Unlock(); } HWND_Unlock(hwnd); } return res; }
void MouseInput(s32 x,s32 y,u32 key_state) { HWND hwnd; POINT pt; RECT rc; pt.x =x; pt.y =y; GDD_Lock(); hwnd =GetWindowFromPoint(&pt); //记录LButtonDown窗口. // LBUTTON if(key_state&MK_LBUTTON) { if(!_IsKeyDown(VK_LBUTTON)) { _SetKeyDown(VK_LBUTTON); HWND_LButton_Down =hwnd; //记录LButtonDown窗口. GetClientRectToScreen(hwnd,&rc); if(_PtInRect(&rc,&pt)) { LButton_Msg =MSG_LBUTTON_DOWN; _ScreenToClient(hwnd,&pt,1); //客户区使用客户坐标. } else { LButton_Msg =MSG_NCLBUTTON_DOWN; } PostMessage(hwnd,LButton_Msg,0,(pt.y<<16)|(pt.x)); } } else { if(_IsKeyDown(VK_LBUTTON)) { _SetKeyUp(VK_LBUTTON); hwnd =HWND_LButton_Down; if(LButton_Msg==MSG_LBUTTON_DOWN) { _ScreenToClient(hwnd,&pt,1); //客户区使用客户坐标. LButton_Msg =MSG_LBUTTON_UP; } else { LButton_Msg =MSG_NCLBUTTON_UP; } PostMessage(hwnd,LButton_Msg,0,(pt.y<<16)|(pt.x)); } } if((cursor_x!=x) || (cursor_y!=y)) { cursor_x =x; cursor_y =y; pt.x =x; pt.y =y; ScreenToClient(hwnd,&pt,1); PostMessage(hwnd,MSG_MOUSE_MOVE,key_state,(pt.y<<16)|(pt.x)); } GDD_Unlock(); }
//----解锁窗口------------------------------------------------------------------ //描述: 当窗口锁定成功后,由该函数进行解锁操作. //参数:hwnd:窗口句柄 //返回:无 //------------------------------------------------------------------------------ void HWND_Unlock(HWND hwnd) { GDD_Unlock(); //Lock_MutexPost(hwnd->mutex_lock); }