私の目標は、共通コントロールの編集コントロールの背景を置き換えることです。私の現在のコードはこれを行います:
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 スタイルがない場合に限ります。