void UIIMEdit::_ImEditPaste() { BOOL bHadPic = FALSE; if (::OpenClipboard(::GetDesktopWindow())) { if (IsClipboardFormatAvailable(CF_BITMAP)) { HBITMAP hBitmap = (HBITMAP)::GetClipboardData(CF_BITMAP); BITMAP bitmap; GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bitmap); SIZE bitmapSize = { bitmap.bmWidth, bitmap.bmHeight }; if (hBitmap) { _SaveFile(hBitmap, m_strImagePath); InsertImage(m_strImagePath.GetBuffer(), bitmapSize, FALSE); bHadPic = TRUE; } } else if (IsClipboardFormatAvailable(CF_HDROP)) { HDROP hDrop = (HDROP)GetClipboardData(CF_HDROP); onDropFiles(hDrop); } CloseClipboard(); } }
LRESULT UIIMEdit::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled) { if (uMsg == WM_KEYDOWN) { if ('V' == wParam && ::GetAsyncKeyState(VK_CONTROL) & 0x8000) { _ImEditPaste(); } else if (VK_RETURN == wParam)//回车 { module::TTConfig* pTTConfig = module::getSysConfigModule()->getSystemConfig(); BOOL bWantCtrlEnter = (pTTConfig->sysBaseFlag & module::BASE_FLAG_SENDIMG_BY_CTRLENTER); SetWantReturn(!bWantCtrlEnter); } } else if (uMsg == WM_KILLFOCUS) { //removed by kuaidao 2015-03-05,这段话会导致焦点之间切换有问题 ////fix bug,当嵌入Windows控件时,如果别的windows控件(如嵌入的IE,它是该窗口的一个子窗口)得到Focus的时候,自己的焦点并没有去掉,造成下次不能再输入 //https://code.google.com/p/duilib/issues/detail?id=102 //if (m_bFocused && m_pManager // && m_pManager->GetFocus() == this) //{ // OutputDebugString(_T("-------WM_KILLFOCUS\n")); // m_pManager->SetFocus(NULL); // m_bFocused = FALSE; //} if (m_pTwh) { m_pTwh->GetTextServices()->OnTxUIDeactivate(); m_pTwh->GetTextServices()->TxSendMessage(WM_KILLFOCUS, 0, 0, 0); m_pTwh->TxShowCaret(FALSE); } } else if (uMsg == WM_SETFOCUS) { if (m_pTwh) { m_pTwh->GetTextServices()->OnTxUIActivate(); m_pTwh->GetTextServices()->TxSendMessage(WM_SETFOCUS, 0, 0, 0); m_pTwh->TxShowCaret(TRUE); } } else if (uMsg == WM_DROPFILES) {//文件拖拽 HDROP hDrop = (HDROP)wParam; onDropFiles(hDrop); } return __super::MessageHandler(uMsg, wParam, lParam, bHandled); }
LRESULT CMainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_MOUSEMOVE) OnMouseMove(uMsg, wParam, lParam); if (uMsg == WM_RBUTTONDOWN) { LRESULT lRes = __super::HandleMessage(uMsg, wParam, lParam); OnRButtonDown(uMsg, wParam, lParam); return lRes; } if (uMsg == WM_LBUTTONDBLCLK) OnLButtonDblClk(uMsg, wParam, lParam); if ((m_pSendEdit != NULL) && m_pSendEdit->IsFocused() && (uMsg == WM_KEYDOWN) && (wParam == 'V') && (lParam & VK_CONTROL)) // 发送消息框的Ctrl+V消息 { m_pSendEdit->PasteSpecial(CF_TEXT); return TRUE; } if (uMsg == WM_NOTIFY && EN_PASTE == ((LPNMHDR)lParam)->code) { ITextServices * pTextServices = m_pSendEdit->GetTextServices(); if ((UINT)pTextServices == ((LPNMHDR)lParam)->idFrom) { AddMsgToSendEdit(((NMRICHEDITOLECALLBACK *)lParam)->lpszText); } if (pTextServices != NULL) pTextServices->Release(); } if (uMsg == WM_MENU) { CControlUI * pControl = (CControlUI *)lParam; if (pControl != NULL) this->paint_manager_.SendNotify(pControl, _T("menu_msg"), wParam, lParam); } if (uMsg == FACE_CTRL_SEL) return OnFaceCtrlSel(uMsg, wParam, lParam); if (uMsg == WM_DROPFILES) return onDropFiles(uMsg, wParam, lParam); return __super::HandleMessage(uMsg, wParam, lParam); }
/*=============================================================== * WMHandler::onDropFiles_() * ドロップファイルの定型處理を行ひ、ユーザ實裝部を呼び出す */ void urania::WMHandler::onDropFiles_(urania::Window* win, WPARAM wp) { HDROP hd = (HDROP)wp; POINT p; DragQueryPoint(hd, &p); std::vector<std::wstring> astr; wchar_t temp[MAX_PATH]; int n = DragQueryFile(hd, 0xffffffff, nullptr, 0); for (int i = 0; i < n; i++) { DragQueryFile(hd, i, temp, MAX_PATH); astr.push_back(temp); } DragFinish(hd); // ユーザがサブクラスでオーバーライドするハンドラを呼び出し onDropFiles(win, astr, p.x, p.y); }