在没有标题栏的mfc c ++中移动窗口?

时间:2015-06-05 02:45:34

标签: html c++ visual-studio-2013 mfc

我正在使用此代码移动窗口。但是这段代码效果不好。当我点击窗口上的任何地方时,它会移动,但我只想移动窗体。当我点击具体思考。例如图片。我正在使用MFC C ++ HtmlDialog。有谁知道怎么做?

DHTML_EVENT_ONCLICK(_T(" image"),PreTranslateMessage)

BOOL CHtmlDlgTestDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_MOUSEMOVE && (pMsg->wParam & MK_LBUTTON))
{
    CPoint p;
    GetCursorPos(&p);
    CRect r;
    GetWindowRect(&r);
    if (r.PtInRect(p))
    {
        ReleaseCapture();
        SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);
        SendMessage(WM_NCLBUTTONUP, HTCAPTION, 0);
        return 1;
    }
}

return CDialog::PreTranslateMessage(pMsg);    
}

1 个答案:

答案 0 :(得分:1)

WM_NCLBUTTONDOWN是一条通知消息,Windows发送此消息并且程序响应它。该程序不应将此消息发送到Windows。在这种情况下,它可以工作,但不建议这样做。

我不知道这段代码是如何工作的:DHTML_EVENT_ONCLICK(_T("image"), PreTranslateMessage)它可能会被忽略,你可以删除它。仍然会调用PreTranslateMessage。您可以将其限制为窗口中的任何矩形,例如CRect(50,50,200,200)

BOOL CHtmlDlgTestDlg::PreTranslateMessage(MSG* pMsg)
{
   if (pMsg->message == WM_MOUSEMOVE && (pMsg->wParam & MK_LBUTTON))
   {
       CPoint p = pMsg->pt;
       ScreenToClient(&p);
       CRect r(50,50,200,200);
       if (r.PtInRect(p))
       {
           ReleaseCapture();
           SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);
           SendMessage(WM_NCLBUTTONUP, HTCAPTION, 0);
           return 1;
       }
   }
   return CDialog::PreTranslateMessage(pMsg);
}

如果您想在窗口中移动元素,可以使用javascript:

Moveable/draggable <div>

Ps,通常你应该使用 WM_NCHITTEST ,如前所述。这种情况非常不寻常,因为它是HTML对话框。您应该重新考虑放置用户理解的普通标题栏,或者您可以将html控件放在对话框中,然后您可以使用标准WinApi控制对​​话的其余部分。