【问题标题】:Can't call CWnd::Create from COleControl C++无法从 COleControl C++ 调用 CWnd::Create
【发布时间】:2021-05-02 14:58:01
【问题描述】:

我正在为 MFC 应用程序开发 ActiveX 控件。

在这个应用程序中,我有一个控制类:

class MyControl : public COleControl

还有一个 CWnd 类:

class MyCWnd : public CWnd

以及活动 x 和 idl 文件的其他类...

在 MyControl 类中,我想将窗口 MyCWnd 作为 MFC 设备(窗口运行的线程)打开。

为此,我在 MyControl 中有一个属性 theWnd 定义为:

MyCWnd theWnd

在使用 MyControl 的方法中,我想通过调用来创建窗口:

theWnd.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), NULL, AFX_IDW_PANE_FIRST, NULL);

但是这一行返回 false。

我应该如何在 COleControl 类中初始化然后创建(启动)一个 CWnd? 如果不可能,我可以从 COleControl 以外的其他类继承 ActiveX 控件吗?

【问题讨论】:

  • 不确定是否允许将NULL 用作CWnd::Create() 调用的第一个参数。 Documentation.
  • @AdrianMole,我认为这不是问题,因为在另一个项目中,我看到 create 的第一个参数为 NULL,它工作正常。在另一个项目中,CWnd::Create() 是从 CWnd 类调用的,因此第 5 个参数定义为this。我猜这里的问题是MyControl 不是窗口。
  • 首先,为什么要使用 ActiveX?是的,在一个线程中,这对于第五个参数是不够的。你还没有窗户。

标签: c++ mfc activex cwnd


【解决方案1】:

所以我找到了一个在我看来像 hack 的解决方案:

theWnd.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), GetDesktopWindow(), AFX_IDW_PANE_FIRST, NULL)

父窗口就是桌面。我不知道这是否是一种干净的方式......

【讨论】:

  • 我很确定,这是一个肮脏的解决方案。为什么不使用托管 MFC 应用程序的窗口?即使 ActiveX 控件需要不可见,最好将其集成到应用程序窗口层次结构中,这样它就可以获取 WM_DESTROY 消息并做出相应的反应。
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2018-02-10
相关资源
最近更新 更多