Picture控件:IDC_CAP
三个文本框:IDC_EDT_HWND IDC_EDT_CLASS IDC_EDT_TEXT
两个按钮: IDC_BTN_SETTEXT IDC_BTN_CLASE
主对话框头文件添加:
protected:
HCURSOR m_hCursor;//鼠标拖动时的光标
BOOL m_bCapturing;//是否处于捕获中
RECT m_rtCtrl;//拖动控件的位置和大小
HWND m_hwndDest;//目标窗体的句柄
主对话框的OnInitDialog中添加:
// TODO: 在此添加额外的初始化代码
//加载拖动光标
m_hCursor=LoadCursor(NULL,IDC_SIZEALL);
//获取拖动控件的位置和大小
GetDlgItem(IDC_CAP)->GetWindowRect(&m_rtCtrl);
添加WM_LButtonUp和WM_LButtonDown消息:
void CSendMsgDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//判断鼠标是否在IDC_CAP上,如果是,则设置捕获鼠标。
if (point.x >= m_rtCtrl.left && point.x <= m_rtCtrl.right
|| point.y >= m_rtCtrl.top && point.y <= m_rtCtrl.bottom)
{
m_bCapturing = TRUE;
SetCapture();
SetCursor(m_hCursor);
}
}
void CSendMsgDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//鼠标左键松开,如果处于捕获状态则做相应处理
if(m_bCapturing)
{
//恢复状态
ReleaseCapture();
m_bCapturing = FALSE;
//取得当前鼠标位置的窗体句柄
POINT pt = point;
ClientToScreen(&pt);
m_hwndDest = ::WindowFromPoint(pt);
//显示句柄
TCHAR szBuf[MAX_PATH] = {0};
_stprintf(szBuf, _T("0x%.8X"), m_hwndDest);
SetDlgItemText(IDC_EDT_HWND, szBuf);
//取得并显示类名
GetClassName(m_hwndDest, szBuf, MAX_PATH);
SetDlgItemText(IDC_EDT_CLASS, szBuf);
//取得并显示文本
::SendMessage(m_hwndDest, WM_GETTEXT, MAX_PATH, (LPARAM)szBuf);
SetDlgItemText(IDC_EDT_TEXT, szBuf);
}
}
为两个按钮添加消息响应:
void CSendMsgDlg::OnBnClickedBtnSettext()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
GetDlgItemText(IDC_EDT_TEXT,str);
::SendMessageW(m_hwndDest,WM_SETTEXT,0,(LPARAM)str.GetBuffer(256));
}
void CSendMsgDlg::OnBnClickedBtnClose()
{
// TODO: 在此添加控件通知处理程序代码
::SendMessageW(m_hwndDest,WM_CLOSE,0,0);
}