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

虽然我了解C++,但是我花了大约2个月的时间研究代码并学习MFC,并且它们开始融合在一起。

该代码的GUI是嵌入在不可见对话框窗口中的SWF Flash文件。我没有SWF文件的源代码,因此将来可能会在WPF中重做它。我将WMMode设置为“窗口”,因为在“透明/不透明”模式下,它无法正确显示,每次捕获鼠标事件时,它都会在其中闪烁/闪烁。

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

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

我发现了这个问题:Moving window by click-drag on a control

看起来它解决了很多问题。但是,我不希望整个控件都是这样可单击的,而只是顶部。不幸的是,在MS Resource View 中,由于SWF仅在运行时加载,因此ActiveX控件为空。我试图为这种事情寻找资源,但是由于我不确定要使用的技术术语,因此这非常困难。

编辑

我通过创建一个非常简单的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);
}

09-10 03:49
查看更多