MFC单击并移动/拖动对话框窗口

MFC click and move/drag dialog window

本文关键字:拖动 对话框 窗口 移动 单击 MFC      更新时间:2023-10-16

我目前正在努力完成交给我的一些代码。它是在2005年前在Visual Studio中用MFC撰写的,被搁置了,现在被带给了我。

虽然我知道C ,但我花了最后〜2个月来研究代码和学习MFC,并且开始在一起。

代码的GUI是一个嵌入在隐形对话框窗口中的SWF闪存文件。我没有SWF文件的源代码,因此将来可能会在WPF或其他内容中重做它。我将WMMODE设置为"窗口",因为在透明/不透明的模式下,它不正确显示,每次捕获鼠标事件时都会闪烁/眨眼。

无论如何,在Win XP/Vista中,单击并拖动Flash控件。在Windows 7/8.1中,它不会移动。

很高兴提供所需的所有信息。我仍然对MFC对话让我有些不知所措,因此不确定您都希望看到什么。

我找到了这个问题:通过在控件上的click-drag移动窗口

看起来它解决了很多问题。但是,我不希望这样的整个控件像这样单击,而只是顶部。不幸的是,在MS资源视图中,ActiveX控件是空白的,因为SWF仅在运行时加载;我试图为这种东西找到资源,但是这非常困难,因为我不确定要使用的技术术语。

编辑

我尝试通过创建一个非常简单的MFC应用程序,该应用具有静态文本控件,而无需其他。我试图通过单击静态文本来使它起作用(尽管我可能会将自己绘制到一个角落,因为它没有内置的lbuttondown事件)。

这是相关代码:

class MyDialog : public CDialog
{
public:
    MyDialog(CWnd* pParent = NULL) : CDialog(MyDialog::IDD, pParent)
    {    }
    // Dialog Data, name of dialog form
    enum{ IDD = INTERFACE1 };
protected:
    virtual void DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); }
    //Called right after constructor. Initialize things here.
    virtual BOOL OnInitDialog()
    {
        CDialog::OnInitDialog();
        pText = (CStatic *)GetDlgItem(ID_TEXT);
        pText->SetWindowTextW(_T("Hello World!"));
        return true;
    }
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
private:
    CStatic * pText;
public:
    DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

覆盖方法:

afx_msg void MyDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
    CWnd::OnNcLButtonDown(HTCAPTION, point);
}

我还尝试将Nflags设置为0x2,称其为Onlbuttondown(与Onnclbuttondown相对),这是其他各种情况。消息启动,但窗口不会移动(它确实从标题栏移动,就像正常情况一样)。我想念什么?

实际上让我们使用ON_WM_NCHITTEST()尝试此代码。如果单击客户端区域中的任何位置(客户端区域),则将拖动对话框。如果您输入,则有一条rc.bottom = rc.top + 100行,则只有在您单击顶部(我随机选择数字100)时才会拖动。

//declare:
afx_msg LRESULT OnNcHitTest(CPoint point);
BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_WM_NCHITTEST()
END_MESSAGE_MAP()
LRESULT MyDialog::OnNcHitTest(CPoint point)
{
    ScreenToClient(&point);
    CRect rc;
    GetClientRect(&rc);
    //rc.bottom = rc.top + 100; 
    if (rc.PtInRect(point))
        return HTCAPTION;
    return CDialog::OnNcHitTest(point);
}

第二个选项:如果我们想通过单击子控件来移动对话框,并且如果该控件捕获鼠标,请尝试使用此方法。***注意,测试以确保控件在移动后正常工作。

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