1

私の目標は、共通コントロールの編集コントロールの背景を置き換えることです。私の現在のコードはこれを行います:

HBITMAP hBmp = ::LoadBitmap(hInstance, MAKEINTRESOURCE(BKGND_ID));
HBRUSH hBkgndBrush = ::CreatePatternBrush(hBmp);
::DeleteObject(hBmp);


HBRUSH CDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  Change any attributes of the DC here

    if(pWnd->GetDlgCtrlID() == MY_CTRL_ID && hBkgndBrush)
    {
        hbr = hBkgndBrush;

        //Do I need to select it?
        //pDC->SelectObject(hbr);   //This line?

        pDC->SetBkMode(TRANSPARENT);
    }

    // TODO:  Return a different brush if the default is not desired
    return hbr;
}

hbr問題は、返品する前に選択する必要があるかどうかです。(上記のコメントアウトされた行を参照してください。)オンラインのさまざまな例で、両方の方法で行われているようです。

編集:また、言及するのを忘れていましたが、WM_ERASEBKGNDを次のようにオーバーライドします:

HDC hDc = ::GetDC(hWnd);
if(hDc)
{
    RECT rc = {0};
    ::GetClientRect(hWnd, &rc);

    ::FillRect(hDc, &rc, hBkgndBrush);

    ::ReleaseDC(hWnd, hDc);
}

EDIT2:問題を説明するために、小さなサンプル MFC プロジェクトを作成しました。基本的に、アプリを画面からすばやく移動してから戻すと、この視覚的な「グリッチ」が作成されますが、コントロールに ES_MULTILINE スタイルがない場合に限ります。

ここに画像の説明を入力

4

1 に答える 1

2

を使用してビットマップから背景ブラシを作成するCreatePatternBrushと、ダイアログのサイズ変更中または移動中に「繰り返しアーティファクト」が発生する場合があります。

これらのアーティファクトを削除するには、ON_WM_WINDOWPOSCHANGEDメッセージに応じて子コントロールを強制的に再描画します。

void CMyDialog::OnWindowPosChanged(WINDOWPOS *wndpos)
{
    CDialog::OnWindowPosChanged(wndpos);

    CWnd *wnd = GetWindow(GW_CHILD);
    while (wnd)
    {
        wnd->Invalidate(TRUE);
        wnd = wnd->GetWindow(GW_HWNDNEXT);
    }
}

また

void CMyDialog::OnWindowPosChanged(WINDOWPOS *wndpos)
{
    CDialog::OnWindowPosChanged(wndpos);
    edit1.Invalidate(FALSE);
    edit2.Invalidate(FALSE);
    ...
}

OnCtlColorオーバーライドは次のようになります。

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* wnd, UINT nCtlColor)
{
    if (nCtlColor == CTLCOLOR_DLG)
        return CDialogEx::OnCtlColor(pDC, wnd, nCtlColor); 
    pDC->SetBkMode(TRANSPARENT);
    return hBkgndBrush;
}

編集コントロールのみの背景に基づいて、wndまたはnCtlColor変更するために他の条件を追加できます。

于 2016-06-13T09:37:29.760 に答える