- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近问了this question这让我开始朝着正确的方向前进——至少是为了加载 MFC DLL 并尝试显示 dlg 框。
问题是,典型的对话框作为APP的主窗口是很糟糕的。创建一个新的 exe 项目来做我想做的事对我来说非常简单,但问题是我有一个 DLL,而且这些工具似乎不允许我将类连接到资源中的 Windows 窗体编辑。因此我似乎无法处理我需要的事件。
我的问题:
我一直在查看的链接都非常简单,而且对于如何操作也含糊不清。他们中的大多数人认为我可以通过“向导”将大型机创建为 MFC 单文档应用程序 - 但事实并非如此。
现在我在我创建的窗口类上调用 Create() 并将桌面的 CWnd 作为父级传递。
我不确定我是否正确地对 CFormView 进行了子类化。事实上,我很确定我几乎没有做我需要做的事情,尽管我尝试按照我看到的说明进行操作。
然后我调用 ShowWindow(SW_SHOW),但我仍然看不到任何东西。
我认为这应该很简单。我只想显示我在表单编辑器中创建的表单。
我该怎么做,最简单的方法是什么?
这是一些代码——调用它的cpp代码
MainForm *mf = new MainForm();
mf->Create(CWnd::GetDesktopWindow());
mf->ShowWindow(SW_SHOW);
这是 MainForm 类的 .h 文件
#include "afxcmn.h"
// MainForm form view
class MainForm : public CFormView
{
DECLARE_DYNCREATE(MainForm)
public:
MainForm();
virtual ~MainForm();
public:
virtual BOOL Create(CWnd* pParent);
public:
enum { IDD = IDD_FORMVIEW_MAIN };
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_SymbolSetList;
};
这是 MainForm 的 cpp
#include "stdafx.h"
#include "MainForm.h"
// MainForm
IMPLEMENT_DYNCREATE(MainForm, CFormView)
MainForm::MainForm()
: CFormView(MainForm::IDD)
{
}
MainForm::~MainForm()
{
}
void MainForm::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_SYMBOLSETS, m_SymbolSetList);
}
BEGIN_MESSAGE_MAP(MainForm, CFormView)
END_MESSAGE_MAP()
// MainForm diagnostics
#ifdef _DEBUG
void MainForm::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void MainForm::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG
BOOL MainForm::Create(CWnd* pParent)
{
CRect rect;
//pParent->GetClientRect(rect);
return CFormView::Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, pParent, 0, NULL);
}
最佳答案
我会研究在单独的 MFC UI 线程中创建和显示您的窗口。 MFC 有自己的机制来将 Windows 消息传送到称为消息泵的 CWnd 派生对象,它需要初始化其内部结构才能工作。我认为你需要使用框架函数调用来做到这一点。试试这个版本的 AfxBeginThread:
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority=HREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
并将您的表单作为 pThreadClass 传递;有 RUNTIME_CLASS 宏可以为您完成。然后,您使用框架代码结束线程。
至于消息处理,请尝试在资源编辑器中打开表单的属性,然后单击顶部的“消息”按钮。然后,您可以将处理程序添加到需要处理的消息中。
我能够将 Menu 属性与菜单的资源 ID 相关联。我不确定你为什么不能这样做。如果您在 TreeView 中选择不同的资源但主窗口显示不同的资源,有时资源编辑器可能会感到困惑。
问候
关于c++ - 如何在 MFC 常规 DLL 中创建和使用 CFormView? ( Visual Studio 2008),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1950662/
我是一名优秀的程序员,十分优秀!