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

Moe*_*673 2 c++ flash mfc dialog

我目前正在努力完成一些传递给我的代码.它是在Visual Studio 2005年的MFC中编写的,被搁置了,现在被带到我身边.

虽然我知道C++,但我花了最近2个月的时间研究代码并学习MFC,它开始融合在一起.

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

无论如何,在Win XP/Vista中,单击并拖动闪光控件可以正常工作.在Windows 7/8.1中,它不会移动.

很高兴提供所需的任何和所有信息.我仍然对MFC对话有点不知所措,所以不确定你们都希望看到什么.

我发现了这个问题:通过在控件上单击并拖动来移动窗口

看起来它解决了很多问题.但是,我不希望整个控件像这样可点击,只有顶部.不幸的是,在MS Resource视图中,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()
Run Code Online (Sandbox Code Playgroud)

重写方法:

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

}
Run Code Online (Sandbox Code Playgroud)

我也尝试将nFlags设置为0x2,调用OnLButtonDown(而不是onNcLButtonDown),以及其他各种事情.消息触发但窗口不移动(它确实从标题栏移动,正常情况下).我错过了什么?

Bar*_*ani 5

实际上让我们试试这个代码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);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)