2009-09-12 66 views
6

私はネイティブのC++を使い慣れていません。今は、マウスの左ボタンを押すと、InvalidateRectを実行して矩形を描画し、反復するたびにXをボックスサイズだけインクリメントするforループがあります。しかし、C++は、C#よりもはるかに高速で効率的な描画であり、すべてを即座に描画します。私が望むのは、長方形を無効にし、長方形を表示し、50ms待ってから、ループを続けることです。私は睡眠(50)を試みたが、結果を示す前に絵画が終わるまでまだ待っている。私もPeekMessageを試しましたが、何も変わっていませんでした。 ご協力いただければ幸いです。おかげDoEventsはC++に相当しますか?

答えて

16

DoEvents関数は、基本的には翻訳:

void DoEvents() 
{ 
    MSG msg; 
    BOOL result; 

    while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    { 
     result = ::GetMessage(&msg, NULL, 0, 0); 
     if (result == 0) // WM_QUIT 
     {     
      ::PostQuitMessage(msg.wParam); 
      break; 
     } 
     else if (result == -1) 
     { 
      // Handle errors/exit application, etc. 
     } 
     else 
     { 
      ::TranslateMessage(&msg); 
      :: DispatchMessage(&msg); 
     } 
    } 
} 
+3

GetMessageの戻り値がチェックされず、WM_QUITが正しく処理されない点を除いてほぼ正しい。 –

+2

GetMessageが0を返した場合、WM_QUITメッセージは次のようになります。 (http://blogs.msdn.com/oldnewthing/archive/2005/02/22/378018.aspx)GetMessageは-1を返すこともできます。 –

+0

@FilipNavara私はこれを3つの可能性のあるすべてのケースを表示するために、あなたは絶対に右に編集されています。 –

2

私はWin32 APIの中で少し錆びていますが、これを行うための非同期の方法は次のようになります。

  • は矩形
  • セットAを無効にタイマ(下記参照)を使用して50ms後にメッセージを送信する
  • WM_PAINTイベントが発生するようにイベントループに戻る
  • タイマメッセージを受信すると、矩形を移動してから、繰り返します。

このようにして、イベント駆動型になります。私はこれがあなたが求めているものではないことを理解していますが、とにかく可能な解決策として言及したいと思いました。

EDIT:すばやいgoogleがWindows API呼び出し[SetTimer]を使用します。http://msdn.microsoft.com/en-us/library/ms644906(VS.85,loband).aspx)メッセージをWM_TIMERにする

+0

+1、これは特定の問題のためのより良い解決策です。 –

関連する問題