1

円形の押しボタンを作成しようとしています。これまでの私のプロセスは次のとおりです。

BS_BITMAP スタイル ボタンを作成します。

hButton = CreateWindow(L"button",L"Label",WS_CHILD|WS_VISIBLE|BS_BITMAP,
               122,363,65,65,hWnd,(HMENU)BUTTON_ID,NULL,NULL);

LoadImage でビットマップを読み込みます。ビットマップは正方形ですが、中央に円を表示したいだけです (これについては後で詳しく説明します)。

buttonImage = (HBITMAP)LoadImage(hInstance,L"button.bmp",IMAGE_BITMAP,65,65, 
               LR_LOADFROMFILE|LR_CREATEDIBSECTION);

ボタンの画像を設定します。

SendMessage(hButton,BM_SETIMAGE,IMAGE_BITMAP,(LPARAM)buttonImage);

円だけを表示するには、次を使用します。

hButtonRgn = CreateEllipticRgn(0,0,65,65);
SetWindowRgn(hButton,hButtonRgn,TRUE);

SetWindowRgn の MSDN ドキュメントには、「システムは、領域ハンドル hRgn によって指定された領域を所有している」と記載されているため、hButtonRgn をグローバルに定義し、再度使用しないことに注意してください。

問題は次のとおりです。

ボタンは、最初は円としてのみ表示されます。ただし、クリックして保持すると、完全な正方形のビットマップが表示され、円が空白で囲まれます。ただし、リリースすると、再び円のみが表示されます。

これが私の試みた解決策です:

ボタンがクリックされるとすぐに、ボタンの周りのメイン ウィンドウを再描画します。メイン ウィンドウの WndProc 内で、次の操作を行います。

case WM_PARENTNOTIFY:
    if ((int)wParam == WM_LBUTTONDOWN)
    {
        PAINTSTRUCT ps;
        BeginPaint(hWnd, &ps);
        pRenderTarget->BeginDraw();
        // paint the background surrounding the button in another function
        pRenderTarget->EndDraw();
        EndPaint(hWnd, &ps);
    }

ただし、これには目に見える効果はありません。ボタンは、マウスを離すと円形に表示されますが、マウスを押したままにすると四角形に表示されます。

私が間違っていた場所についてのアイデアはありますか?

4

1 に答える 1

0

あなたの再描画ルーチンは正しくありません。BeginPaint()メッセージへの応答としてのみ使用するWM_PAINT必要があります。これは、何かが汚れていて再描画が必要であることを示しています。やりたいことは、そのメカニズムをトリガーすることです。その方法はInvalidateRect()、再描画のために親ウィンドウの適切な領域をマークするために使用することです。

これで状況が改善されたとしても、おそらく許容できないちらつきが発生すると思います。調査できる別のメカニズムは、ボタンの所有者を描画することです。これは、同じ手順でボタンを円として描画する (そして親ウィンドウを無効にする) ことができるためです。

于 2013-10-17T19:37:22.707 に答える