MFC单击并移动/拖动对话框窗口
MFC click and move/drag dialog window
我目前正在努力完成交给我的一些代码。它是在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);
}
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- 如何在鼠标挂钩过程中检测拖动
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 使用MFC在对话框上拖放文件
- MFC单击并移动/拖动对话框窗口
- 如何在MFC中拖动子对话框时移动父对话框
- Visual Studio 2008 MFC拖动对话框(不带标题)并检测所有鼠标事件
- Qt5-如何在无框窗口中指定一些可拖动区域
- 拖放功能在我的图形-基于对话框的MFC
- 在 qml 中拖动无框窗口"jiggles"
- 如何在对话框打开时禁用拖放