2009-03-13 3 views
3

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

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関数」:「HWND」

からパラメータ1を変換することはできません「システム::のIntPtr」私はthis->代わりにm.HWndの同じエラーを処理し使用しようとすると発生する。

私は(HWND)にm.HWndをキャストしようとすると、このエラーが発生します。 エラーC2440: 'タイプのキャストを': 'HWND'に 'システム::のIntPtr' から変換することはできません

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

答えて

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に切り替えることをお勧めします。

これが役に立ちます。乾杯。

2

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

1

私は、Win32プログラミング(WM_PAINTをオーバーライドする必要があります)とWindows Forms/.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); 
} 
+0

私は彼がC++コードではなくAndrewであると信じています。貧しい若者を混乱させるのに十分な違いがあります。 – user72491

+0

ありがたいことに、私はC#でたくさんの経験をしていますので、私はそれを見て、それをかなり素早くC++に変換しています。 Win32アプリケーションとWindows Formsアプリケーションの違いを指摘してくれてありがとう、Andrew Grant –

+0

奇妙な、元の質問のコードは、私が見たC++のようには見えません! –

関連する問題