2

パネルでダブルバッファリングをオンにしたかったのですが、DoubleBufferedプロパティをオンにする唯一の方法はSystem::Windows::Form::Panel、から継承した新しいクラスを作成することでした。

#include "stdafx.h"

public ref class CPPIConfig: public System::Windows::Forms::Panel
{
public: CPPIConfig()
        {
            this->DoubleBuffered = true;
        }
};

そして、私たちのフォームは次のようになります。

#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());
        [...]
    }
[...]

ビルドして実行しますが、問題ありません。ただし、フォームをデザインモードで表示しようとすると、次のエラーが発生します。

C ++ CodeDOMパーサーエラー:行:144、列:15---タイプ'CPPIConfig'が不明です。このタイプを含むアセンブリが参照されていることを確認してください。このタイプが開発プロジェクトの一部である場合は、プロジェクトが正常にビルドされていることを確認してください。

私の質問:

  1. コードをビルドして実行しても、デザインモードが機能しないのはなぜですか?いくつかのクリーンビルドを試しましたが、それは問題ではないようです。
  2. この方法を使用せずDoubleBufferedに設定できる方法はありますか?true
4

4 に答える 4

5

ここでの大きな問題は、マネージ コードとアンマネージ コードが混在していることに起因しています。私はそれについてもっと読むためにMSDNに行きましたが、結果は次のとおりです.Visual Studioは、CPPIConfigアンマネージ/ネイティブコードであるため、このコンテキスト内でクラスを処理できません.

同様の質問に対して提供された回答から:

Windows フォーム デザイナーは、混合モードの EXE を反映できません。/clr:pure を指定してコンパイルするか、デザイン時のサポートが必要なクラス (フォーム上のコンポーネントやコントロールなど) をクラス ライブラリ プロジェクトに移動してください。

この MSDN ページが指摘しているように、リフレクションは、デザイン ビューが IDE 内でフォームをレンダリングするために使用しているものです。簡単に言うと、これがリフレクションです。

リフレクションを使用すると、既知のデータ型を実行時に検査できます。リフレクションにより、特定のアセンブリ内のデータ型の列挙が可能になり、特定のクラスまたは値の型のメンバーを検出できます。これは、型がコンパイル時に認識されていたか、参照されていたかに関係なく当てはまります。これにより、リフレクションは開発およびコード管理ツールにとって便利な機能になります。

ああ。これは理にかなっています。

私が知る限り、この問題を解決するには 2 つの方法があります。

/clr:pureプロジェクトのプロパティで使用します。これにより、プロジェクトの共通言語ランタイム サポートが変更されます。この MSDN ページから:

純粋なアセンブリ (/clr:pure でコンパイル) には、ネイティブ データ型とマネージド データ型の両方を含めることができますが、マネージド関数のみを含めることができます。混合アセンブリと同様に、純粋なアセンブリは P/Invoke を介してネイティブ DLL との相互運用を可能にします (「C++ での明示的な PInvoke の使用 (DllImport 属性)」を参照)。ただし、C++ 相互運用機能は使用できません。さらに、純粋なアセンブリのエントリ ポイントは __clrcall 呼び出し規則を使用するため、純粋なアセンブリはネイティブ関数から呼び出し可能な関数をエクスポートできません。

クラス ライブラリ プロジェクトを作成します。他の回答が示唆したように、ファイルをクラス ライブラリ プロジェクトに移動してそのように参照すると、この問題は発生しません。私が理解しているように、それはCPPIConfigマネージコードを作成します。

最終的には、構造的な制限により、これらのオプションのいずれも実行できません。時間の都合上、パネルでのダブル バッファリングを差し控えることにしました。まあ、少なくとも私はこの環境についてもっと学びました!

于 2012-06-01T20:58:29.963 に答える
1

コントロールの初期化を suspendlayout の下に移動してみてください。これにより、デザイナーは CodeDOM 解析エラーなしで正しくレンダリングできます。

オリジナルはこんな感じでした

#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
    this->lblMessage = (gcnew System::Windows::Forms::Label());
    this->SuspendLayout();
    // lblMessage
    this->lblMessage->Location = System::Drawing::Point(12, 230);
    //.....
}

新しい形式

#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
    this->SuspendLayout();
    // lblMessage
    this->lblMessage = (gcnew System::Windows::Forms::Label());
    this->lblMessage->Location = System::Drawing::Point(12, 230);
    //.....
}
于 2014-10-16T15:34:59.613 に答える