0

私は過去に Visual Basic 6 を使用したことがあり (LOONG 前)、PictureBox というコントロールがあり、必要に応じて描画したり、デバイス コンテキストを取得したりできました。純粋な GDI/WinApi (MFC、.net、atl、gdi+ などなし) の同様の「コントロール」。私はオーナー描画ボタン コントロールを使用していましたが、クリックしたときにマウスの座標を (簡単に) 取得できないため、他のコントロールが必要であると考えました。スタティック コントロールを試しましたが、オーナー描画がサポートされていません。私は WM_PAINT を処理しようとしましたが、私の知る限り (何時間もグーグル検索した後)、それを使用してクライアントの 1 つの領域または単一の HWND だけを更新する方法はありません。

それで、私が求めているのは、純粋な GDI と Windows API を使用して、ウィンドウの選択領域をどのようにアニメートまたはブリットするかということです。MFC にはサブクラス化と呼ばれるものがあることは知っていますが、MFC は Windows API の単なるラッパーであるため、これを使用せずにこれを行う方法が必要です (前述のように、MFC はオプションではありません)。

4

2 に答える 2

2

正直なところ、これはあなたが今取り組むには少し大きなプロジェクトかもしれないと思います。これを試す前に、Windows APIを使用していくつかの簡単なプロジェクトを試してみることをお勧めしますが、とにかく少し説明します。

カスタムコントロールを作成する必要があります。これに既存のコントロールを使用することは、それらが意図された方法ではないため、悪い習慣です。カスタムコントロールを作成するには、最初にWNDCLASSEXまたはWNDCLASSを使用してウィンドウクラスを作成する必要があります。

WNDCLASS:http
://msdn.microsoft.com/en-us/library/ms633576 WNDCLASSEX :http: //msdn.microsoft.com/en-us/library/ms633577

これを実行し、必要なすべてのメンバー値を設定したら、RegisterClassまたはRegisterClassExのいずれかにクラスを登録する必要があります。

WNDCLASS(EX)オブジェクトのメンバーの1つは、ウィンドウ・プロシージャー関数ポインターを取ります。このウィンドウクラスで作成されたウィンドウはすべて、このウィンドウプロシージャを使用します。

ウィンドウクラスを登録すると、作成したウィンドウクラスを使用してウィンドウを作成できます。CreateWindow(...、 "YOUR WINDOW CLASS HERE"、...);を実行するだけです。

これで、ウィンドウプロシージャは次のようになります。

LRESULT CALLBACK MyDrawProcedure(HWND hwnd, UMSG uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
      case WM_PAINT:
      {
        // Handle painting your control here.
      }
      break;

      default:
         return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}

まあ、これが少し役立つことを願っています。

于 2011-05-20T22:47:50.960 に答える
2

子ウィンドウを作成し、その .xml でペイントを行いますWM_PAINTInvalidateRect()再描画を強制したい場合に呼び出します。

于 2011-05-20T16:09:25.703 に答える