【发布时间】:2009-12-23 04:14:47
【问题描述】:
我最近问过this question,这让我朝着正确的方向开始——至少是为了加载 MFC DLL 并尝试显示一个 dlg 框。
问题是,典型的对话框作为 APP 的主窗口是可怕的。创建一个新的 exe 项目来做我想做的事对我来说非常简单,但问题是我有一个 DLL,而这些工具似乎不允许我将类连接到资源中的 windows 窗体编辑。因此,我似乎无法处理我需要的事件。
我的问题:
- 如何在 MFC DLL 项目中创建和显示 CFormView(基于我在资源编辑器中创建的 IDD_FORMVIEW)?
- 如何让表单显示并处理输入?
- 如何为该窗口添加事件/消息处理程序? (从 .rc 编辑器执行此操作的菜单项显示为灰色)
- 如何为表单视图设置菜单? (编辑器中资源的属性不允许我将其与菜单资源相关联。(我不知道为什么)
我一直在查看的链接非常简单且关于如何执行此操作的模棱两可。他们中的大多数人认为我可以通过“向导”将大型机创建为 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);
}
【问题讨论】:
-
是的,我知道 Qt 非常出色,我已经下载了它,并且正在努力学习它。但是现在我们没有时间学习如何构建、使用和部署它。它将在我们软件的下一个版本中使用。
标签: c++ user-interface dll mfc