Vis*_*ota 2 .net visual-studio-2008 visual-c++ winforms
我想在面板中打开双缓冲,但我们可以DoubleBuffered打开该属性的唯一方法是创建一个继承自 的新类System::Windows::Form::Panel,如下所示:
#include "stdafx.h"
public ref class CPPIConfig: public System::Windows::Forms::Panel
{
public: CPPIConfig()
{
this->DoubleBuffered = true;
}
};
Run Code Online (Sandbox Code Playgroud)
我们的表单现在看起来像这样:
#pragma once
#using <system.drawing.dll>
#include "CPPIConfig.h"
[...]
public ref class C3_User_Interface : public System::Windows::Forms::Form
{
[...]
public: CPPIConfig^ pPPI;
[...]
}
void InitializeComponent(void)
{
[...]
this->pPPI = (gcnew CPPIConfig());
[...]
}
[...]
Run Code Online (Sandbox Code Playgroud)
它构建并运行,没问题。但是,当我现在尝试在设计模式下查看表单时,出现以下错误:
C++ CodeDOM 解析器错误:行:144,列:15 --- 未知类型“CPPIConfig”。请确保引用了包含此类型的程序集。如果此类型是您的开发项目的一部分,请确保该项目已成功构建。
我的问题:
DoubleBuffered在true不使用这种方法的情况下进行设置?这里的大问题真的源于我对托管代码和非托管代码的混合。我去MSDN 阅读了更多关于它的信息,但结果是:Visual Studio 无法在此上下文中处理我的类,因为它是非托管/本机代码。CPPIConfig
从为类似问题提供的答案中:
Windows 窗体设计器无法反映混合模式 EXE。确保使用 /clr:pure 进行编译或将任何需要设计时支持的类(例如窗体上的组件和控件)移动到类库项目中。
正如此 MSDN 页面所指出的,反射是设计视图用于在 IDE 中呈现表单的内容。简而言之,这就是反射:
反射允许在运行时检查已知数据类型。反射允许枚举给定程序集中的数据类型,并且可以发现给定类或值类型的成员。无论类型在编译时是否已知或被引用,都是如此。这使得反射成为开发和代码管理工具的有用功能。
啊。这开始变得有意义了。
据我所知,有两种方法可以解决这个问题。
使用/clr:pure在你的项目属性。这会更改项目的公共语言运行时支持。从这个 MSDN 页面:
纯程序集(使用 /clr:pure 编译)可以包含本机和托管数据类型,但只能包含托管函数。与混合程序集一样,纯程序集允许通过 P/Invoke 与本机 DLL 进行互操作(请参阅在 C++ 中使用显式 PInvoke(DllImport 属性)),但 C++ 互操作功能不可用。此外,纯程序集无法导出可从本机函数调用的函数,因为纯程序集中的入口点使用 __clrcall 调用约定。
创建一个类库项目。正如另一个答案所建议的那样,如果我将文件移动到类库项目并以这种方式引用它,我就不会看到这个问题。据我了解,它会生成CPPIConfig托管代码。
最终,结构限制使这些选项都不可行,为了节省时间,我们决定暂时放弃面板上的双缓冲。哦,好吧,至少我对这个环境有了更多的了解!