3

ウィンドウにデータをプロットする Visual C++ 2008 プログラムを作成しようとしています。これを行う正しい方法は、WndProc をオーバーライドすることです そこで、Visual C++ 2008 Express Edition で Windows フォーム アプリケーションを作成し、このコードを Form1.h に追加しましたが、コンパイルされません。

    public:
    [System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
    virtual void WndProc(Message %m) override
    {
        switch(m.Msg)
        {
            case WM_PAINT:
            {
                HDC     hDC;
                PAINTSTRUCT ps;
                hDC = BeginPaint(m.HWnd, &ps);

                // i'd like to insert GDI code here

                EndPaint(m.Wnd, &ps);
                return;
            }
        }
        Form::WndProc(m);
    }

これを Visual C++ 2008 Express Edition でコンパイルしようとすると、 エラー C2664: 'BeginPaint' : パラメーター 1 を 'System::IntPtr' から 'HWND' に変換できません。

m.HWnd の代わりに this->Handle を使用しようとすると、同じエラーが発生します。

m.HWnd を (HWND) にキャストしようとすると、次のエラーが発生します: error C2440: 'type cast' : cannot convert from 'System::IntPtr' to 'HWND'

たぶん、m.HWnd を pin_ptr などにキャストする必要があります。

4

3 に答える 3

2

参照する記事では、WinForms アプリではなく、ネイティブ C++ アプリケーションで行う方法について説明しています。WndProc でメッセージを処理する代わりに、OnPaint メソッドをオーバーライドする必要があります。

于 2009-03-13T00:58:49.790 に答える
2

生の Win32 アプリケーションを作成している場合は、これらの関数を使用できます。

一方、WinForms アプリケーションを作成している場合は、OnPaint イベントをオーバーライドする必要があります。

  • デザイン ビュー (フォームを表示するビュー) に切り替えます。
  • フォームのタイトル バーをクリックします。
  • プロパティ ウィンドウ (デフォルトではおそらく右下の画面) で、上部近くの稲妻を選択します。これにより、イベントのリストが表示されます。
  • ペイント イベントまで下にスクロールし、ダブルクリックします。

最終的に、グラフィックス オブジェクトの描画機能を使用できる Paint ルーチン シェルが作成されます。


private: System::Void Form1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) 
{
    e->Graphics->DrawRectangle(...)              
}

生の Win32 コードを本当に書きたい場合は、お知らせください。シェルの作成をお手伝いします。とりあえず Win32 に興味があるなら、Charles Petzold の Programming Windows 5th edition をお勧めします。

C++ WinForms を学習したい場合は、C# または VB.NET に切り替えることをお勧めします。単純に、C# または VB.NET の方が直感的だからです。

お役に立てれば。乾杯。

于 2009-03-13T01:11:17.750 に答える
1

Win32 プログラミング (WM_PAINT をオーバーライドする必要があります) と、描画メソッドのみをオーバーライドする必要がある Windows フォーム/.NET の間で混乱していると思います。

.NET でのフォームへの描画は非常に簡単です。OnPaint メソッドをオーバーライドするだけで、すべての描画を実行できます。

Visual Studio のツールボックスを使用するか、クラスで次のコードを使用して、ペイント ハンドラーにバインドできます。

this.Paint += new System.Windows.Forms.PaintEventHandler(this.MyForm_Paint); 

次に、MyForm_Paint メソッドを次のように実装します。

private void MyForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
  //create a graphics object from the form
  Graphics g = this.CreateGraphics();

  // create  a  pen object with which to draw
  Pen p = new Pen(Color.Red, 7);  // draw the line 

  // call a member of the graphics class
  g.DrawLine(p, 1, 1, 100, 100);
}
于 2009-03-13T01:01:29.427 に答える