Моя цель - заменить фон для элемент управления для редактирования. Мой текущий код делает это:
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:
if (nCtlColor == CTLCOLOR_DLG) return hbr;
или, если bitmapBrush покрывает весь диалог, используйтеSetBrushOrg
для выравнивания дочернего растрового изображения, которое будет выровнено с фоновым растровым изображением. - person Barmak Shemirani   schedule 13.06.2016