// 清除指定名字的子控件 BOOL CControlBase::RemoveControl(CString strControlName, UINT uControlID) { vector<CControlBase*>::iterator it; for(it=m_vecControl.begin();it!=m_vecControl.end();++it) { CControlBase* pControlBase = *it; if (pControlBase && pControlBase->IsThisObject(uControlID, strControlName)) { // 如果是焦点控件,则需要先将焦点设置为空 if(IsFocusControl()) { CDlgBase* pDlg = GetParentDialog(FALSE); if(pDlg) { pDlg->SetFocusControlPtr(NULL); } } m_vecControl.erase(it); delete pControlBase; return TRUE; } } return FALSE; }
// 清除指定的子控件 BOOL CControlBase::RemoveControl(CControlBase* pControl) { vector<CControlBase*>::iterator it; for(it=m_vecControl.begin();it!=m_vecControl.end();++it) { CControlBase* pControlBase = *it; if (pControlBase == pControl) { // 如果是焦点控件,则需要先将焦点设置为空 if(IsFocusControl()) { CDlgBase* pDlg = GetParentDialog(FALSE); if(pDlg) { pDlg->SetFocusControlPtr(NULL); } } m_vecControl.erase(it); delete pControlBase; return TRUE; } } return FALSE; }
// 键盘事件处理 BOOL CDuiComboBox::OnControlKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // 如果当前处于焦点状态,用下箭头可以下拉列表 if(m_bDown && (nChar == VK_DOWN) && (nFlags == 0) && IsFocusControl()) { // 模拟鼠标点击 SendMessage(m_uID, BUTTOM, BUTTOM_DOWN); return true; } return false; }
// 键盘事件处理 BOOL CDuiWkeView::OnControlKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // 如果当前处于焦点状态,则处理回车键和ESC键 if(IsFocusControl() && ((nChar == VK_RETURN) || (nChar == VK_ESCAPE)) && (nFlags == 0) && m_pWebView) { //m_pWebView->keyDown(nChar, nFlags, false); m_pWebView->keyPress(nChar, nFlags, false); m_render.render(m_pWebView); return true; } return false; }
// 释放控件 void CDuiWkeView::ReleaseControl() { // 如果是焦点控件,则将当前焦点控件设置为空 if(IsFocusControl()) { SetCurrentFocusControl(NULL); } // 删除宿主窗口 if(m_hwndHost && ::IsWindow(m_hwndHost)) { DestroyWindow(m_hwndHost); } m_hwndHost = NULL; }
LRESULT CDuiNativeWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled) { if((m_hwndHost == NULL) || !::IsWindow(m_hwndHost)) { return 0; } if( !GetRresponse() && uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST ) { return 0; } bool bWasHandled = true; if( (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) || uMsg == WM_SETCURSOR ) { // Mouse message only go when captured or inside rect DWORD dwHitResult = HITRESULT_HIT; if( dwHitResult != HITRESULT_HIT ) return 0; if( uMsg == WM_SETCURSOR ) bWasHandled = false; }else if( uMsg >= WM_KEYFIRST && uMsg <= WM_KEYLAST ) { // Keyboard messages just go when we have focus if( !IsFocusControl() ) return 0; }else { switch( uMsg ) { case WM_HELP: case WM_CONTEXTMENU: bWasHandled = false; break; default: return 0; } } LRESULT lResult = 0; return lResult; }
// 处理WM_KEYDOWN消息 LRESULT CDuiWkeView::OnWmKeyDown(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { bool handled = true; unsigned int virtualKeyCode = wParam; unsigned int flags = 0; bool bShiftState = false; if (HIWORD(lParam) & KF_REPEAT) flags |= WKE_REPEAT; if (HIWORD(lParam) & KF_EXTENDED) flags |= WKE_EXTENDED; if((GetKeyState(VK_SHIFT) & 0x8000) || (VK_SHIFT == wParam)) bShiftState = true; HKL hKL = GetKeyboardLayout(0); int i = LOWORD(hKL); TCHAR buffer[255]; memset(buffer,0,255 * sizeof(TCHAR)); if( (i == 0x0804) && (ImmIsIME(hKL)) ) { ImmGetDescription(hKL,buffer,255); if(buffer[0] != NULL) { if(( wParam & 0x80 ) | (wParam >= 0x70 && wParam <= 0x7F )) { if( !IsFocusControl() ) return 0; } } } if(wParam >= 0x70 && wParam <= 0x7F ) { handled = m_pWebView->keyDown(virtualKeyCode, flags, false); m_render.render(m_pWebView); if( wParam == 0x74 ) { MSG msg; msg.hwnd = hWnd; msg.message = WM_CHAR; msg.wParam = virtualKeyCode; msg.lParam = lParam; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } if( !IsFocusControl() ) return 0; } handled = m_pWebView->keyDown(virtualKeyCode, flags, false); m_render.render(m_pWebView); if(!bShiftState) { if( !GetKeyState(VK_CAPITAL) ) { if((wParam >= 'A') && (wParam <= 'Z')) virtualKeyCode = tolower(wParam); } if(wParam != VK_SHIFT) { if( wParam > 0x80 ) return 0; } }else { if(wParam != VK_SHIFT) { //wParam = wParam & 0x7F;//`~ //virtualKeyCode = wParam; if(wParam == '1' || wParam == '3' || wParam == '4' || wParam == '5' ) virtualKeyCode = wParam - 0x10; else if(wParam == '2') virtualKeyCode = '@'; else if(wParam == '6') virtualKeyCode = '^'; else if(wParam == '7') virtualKeyCode = '&'; else if( wParam == '8') virtualKeyCode = '*' ; else if( wParam == '9') virtualKeyCode = '('; else if(wParam == '0') virtualKeyCode = ')'; else if(wParam == 45) virtualKeyCode = '_'; else if(wParam == '=') virtualKeyCode = '+'; else if(wParam == '[') virtualKeyCode = '{'; else if(wParam == ']') virtualKeyCode = '}'; else if(wParam == ';') virtualKeyCode = ':'; else if(wParam == '\'') virtualKeyCode = '"'; else if(wParam == '\\') virtualKeyCode = '|'; else if(wParam == ',') virtualKeyCode = '<'; else if(wParam == '.') virtualKeyCode = '>'; else if(wParam == '/') virtualKeyCode = '?'; else if(wParam == '`') virtualKeyCode = '~'; else if(wParam > 0x80) return 0; } } MSG msg; msg.hwnd = hWnd; msg.message = WM_CHAR; msg.wParam = virtualKeyCode; msg.lParam = lParam; ::TranslateMessage(&msg); ::DispatchMessage(&msg); return 0; }