2017-07-13 4 views
0

私はそれの前にイメージとジオメトリのフォームを描画するWindowsフォームアプリケーションを持っています。私は、画面をオフスクリーンでドラッグして画面上に戻すときに問題が発生し、オフスクリーンになった部分がすべてクリアされます。paintformイベントからVM_ERASEBKGNDを無視すると、毎回winformオフスクリーンで動作しません。なぜですか?

これは、アプリケーションにWindowsのメッセージVM_ERASEBKGNDを送信し、オフスクリーンになった部分がクリアされたために発生する可能性があると読んでいます。 (?右Iアム)

をだから、最初、私は画像のみを表示するテスト・アプリケーションを作成していると私はそのような場合には作業を行いにWndProcメソッドをオーバーライドし、それが実現され、ここでどのように:

protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
    switch (m.Msg) 
    { 
     //0x0014 reprensts VM_ERASEBKGND message 
     case 0x0014: 
      //ignore this message else pass it to base 
      break; 
     default: 
      base.WndProc(ref m); 
      break; 
    } 
    } 

基本的には、VM_ERASEBKGNDというメッセージを無視しているだけで、その場合は正常に動作します。 アプリケーションは、PictureBoxを含むフォームです。

これを全く同じ別のプロジェクトに統合したいのですが、PictureBoxをフォームに追加しましたが、コントロールにはScrollBar、Axis、GridPanelなどのコントロールがいくつかあります。 WndProcメソッド私は別のプロジェクトで行ったのと同じ方法を上書きする場合

、それがブレークポイントに入り、base.WndProc(REFメートル)を処理していなくても動作しません。しかし、それは私がメッセージを処理していないことに気にしないようですが、それでも私のフォームはクリアされます。

私の質問はです:それは、軸やスクロールバーなどの他のコントロールは、私は上記の例のようにWndProcを上書きしてERASEBKGNDを無視したにも関わらず、画面外に移動するときにクリアフォームを作ることも可能です。

これは、1つのアプリケーションでは動作しますが、ほとんど同じではないため、Windowsからの実際の動作は奇妙です。

+0

これはxpかVista以上に勝っていますか?あなたのロジックが動作します。眺めと高級では。あなたが 'WM_ERASEBKGND'を無視しても、フォーム**は背景を描画します**。 'WM_PAINT'メッセージは何度も呼び出されません。別のウィンドウを前に移動しても、フォームは再描画されません。 –

+0

私はWindows 7を使用していますが、ドラッグしている間にオフスクリーンになっているときに自分のPictureBoxを消去しないように指示する方法を知っていますか? –

+0

'WM_PAINT'が呼び出されているときは、2つのオプションがあります:それをオーバーライドして、自分自身を描くか、システムに任せます。いずれにしても、何らかの描画が行われます。あなたの図面は、システムがそれらの知識を持っていないので消去されます。何も描かないようにシステムに指示しても問題は解決しません。画面を画面から移動して画面上に移動すると、**必要な部分が描画されます**。 –

答えて

0

私の簡単なトリックは、あなたのケースでは最高の解決策ではないが、まだ動作しますが、フォームのWndProcをオーバーライドし、VM_ERASEBKGをキャッチすることです。そして、ベースに渡す代わりに、スワップチェーンを再描画するスワップチェーンを提示してください。

win32でDirectXを使用すると、Windows 32ハンドルのGPUとCPUが悪い動作をすることがよくあります。

Protected Overrides Sub WndProc(ByRef m As Message) 
     Select Case m.Msg 
     Case VM_ERASEBKGND 
      swapchain.Present(1,PresentFlags.None) 
      Exit Select 
     Case Else 
      MyBase.WndProc(m) 
      Exit Select 
     End Select 
    End Sub 
関連する問題