我目前正在努力完成一些传递给我的代码。它是在Visual Studio 2005年的MFC中编写的,被搁置了,现在被带到我身边。
虽然我知道C ++,但我花了最近2个月的时间研究代码并学习MFC,并且它已经开始融合了。
代码的GUI是嵌入在不可见对话窗口中的SWF Flash文件。我没有SWF文件的源代码,因此将来可能会在WPF中重做它。我将WMMode设置为“Window”,因为在透明/不透明模式下,它无法正常显示,每次捕获鼠标事件时它都会闪烁/闪烁。
无论如何,在Win XP / Vista中,单击并拖动闪光控制可以正常工作。在Windows 7 / 8.1中,它不会移动。
很高兴提供所需的任何和所有信息。我仍然对MFC对话有点不知所措,所以不确定你们都希望看到什么。
我发现了这个问题:Moving window by click-drag on a control
它看起来像是解决了很多问题。但是,我不希望整个控件像这样可点击,只有顶部。不幸的是,在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()
重写方法:
afx_msg void MyDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd::OnNcLButtonDown(HTCAPTION, point);
}
我还尝试将nFlags设置为0x2,调用OnLButtonDown(而不是onNcLButtonDown),以及其他各种事情。消息触发但窗口不移动(它确实从标题栏移动,正常情况下)。我错过了什么?
答案 0 :(得分: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);
}
第二种选择: 如果我们想通过单击子控件来移动对话框,并且该控件捕获鼠标,则尝试使用此方法。 ***注意,测试以确保控制在移动后正常工作。
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);
}