テキストのドロップ
クリップボードを介して別のウィンドウにテキストデータをドロップするサンプルコード。OLE のドラッグ & ドロップをサポートしていない素のエディットコントロールへのドロップ操作を実現する。
#ifdef _UNICODE #define CF_MYTEXT CF_UNICODETEXT #else #define CF_MYTEXT CF_TEXT #endif void CMyDlg::Copy(LPCTSTR pszText) { if (OpenClipboard()) { ::EmptyClipboard(); DWORD dwBytes = (lstrlen(pszText)+1) * sizeof(TCHAR); HGLOBAL hMem = ::GlobalAlloc(GMEM_DDESHARE, dwBytes); LPTSTR pMem = (LPTSTR)::GlobalLock(hMem); lstrcpy(pMem, pszText); ::GlobalUnlock(hMem); ::SetClipboardData(CF_MYTEXT, hMem); ::CloseClipboard(); } } void CMyDlg::Paste(HWND hWnd) { if (::IsClipboardFormatAvailable(CF_MYTEXT)) ::PostMessage(hWnd, WM_PASTE, 0, 0); } void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); GetDlgItemText(IDC_EDIT1, m_sText); CDialog::OnLButtonDown(nFlags, point); } void CMyDlg::OnMouseMove(UINT nFlags, CPoint point) { if (GetCapture() == this) ::SetCursor(AfxGetApp()->LoadCursor(IDC_POINTER_COPY)); CDialog::OnMouseMove(nFlags, point); } void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point) { if (GetCapture() == this) { ClientToScreen(&point); HWND hWnd = ::WindowFromPoint(point); if (hWnd) { ::ScreenToClient(hWnd, &point); LRESULT nSel = ::SendMessage(hWnd, EM_CHARFROMPOS, 0, MAKELPARAM(point.x, point.y)); if (nSel != -1) { nSel = LOWORD(nSel); ::SendMessage(hWnd, EM_SETSEL, nSel, nSel); ::SetFocus(hWnd); Copy(m_sText);
Paste(hWnd); } } ReleaseCapture(); } CDialog::OnLButtonUp(nFlags, point); }
| 固定リンク

