Проблема этого класса известна и описывается http://support.microsoft.com/kb/961031. Предложенный способ решения прекрасно работает для однотонной заливки, но для метода SetBackgroundImage() специалисты микрософта недвусмысленно предлагают разобраться самому. Поэксперементировав с данным классом увидел, что при "подкладывании" картинки некорректно красится только Checkbox, поэтому, по аналогии с предложением создателя, родился следующий код| Код | HBRUSH CCDialogExExDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here if (m_brBkgr.GetSafeHandle() != NULL || m_hBkgrBitmap != NULL) { #define AFX_MAX_CLASS_NAME 255 #define AFX_BUTTON_CLASS _T("Button") if (nCtlColor == CTLCOLOR_STATIC) { TCHAR lpszClassName[AFX_MAX_CLASS_NAME + 1]; int nChars = ::GetClassName(pWnd->GetSafeHwnd(), lpszClassName, AFX_MAX_CLASS_NAME); if(( nChars > 0 ) && ( _tcsncmp( lpszClassName, AFX_BUTTON_CLASS, nChars ) == 0)) { UINT uStyle=((CButton*)pWnd)->GetButtonStyle(); if (uStyle==BS_AUTOCHECKBOX) { CBitmap bmpBk; CDC * pParentDC = GetDC();//Получаем контекст владельца контрола CDC dcBk; m_brBkImage.DeleteObject();// уничтожаем предыдущее CRect rClient; // клиентская область контрола CRect rWnd;// окно контрола pWnd->GetClientRect(& rClient); pWnd->GetWindowRect(& rWnd); ScreenToClient(& rWnd);// перевод в клиентские координаты родителя dcBk.CreateCompatibleDC(pDC); bmpBk.CreateCompatibleBitmap(pDC, rClient.Width(), rClient.Height()); CBitmap * pOldBitmap=dcBk.SelectObject(& bmpBk); dcBk.BitBlt(0, 0, rClient.Width(), rClient.Height(), pParentDC, rWnd.left, rWnd.top, SRCCOPY); m_brBkImage.CreatePatternBrush(&bmpBk);// получаем кисть для контрола dcBk.SelectObject(pOldBitmap);//pOldBrush ReleaseDC(pParentDC); // освобождаем контекст //pDC->SetBkMode(TRANSPARENT); hbr =(HBRUSH)m_brBkImage; ReleaseDC(&dcBk); //return (HBRUSH)m_brBkgr; } } } } return hbr; }
|
Совмещение фона check-кнопки с фоном диалога нормальное, но замечено следующее: при клике по кнопке мигает наполовину отрисованная фокусная рамка, затем эта рамка прорисовывается полностью и так и остаётся даже если кликнуть по другому контролу (в итоге - несколько контролов под фокусной рамкой). Если спрятать диалог и снова отобразить, данная рамка исчезает. Но это не самая большая проблема. При запуске этого творения на машине коллеги наблюдается следующая картина: после появления диалога на экране картинка нормальная, но стоит провести указателем мыши по клиентской области, как caption-ы checkbox-ов становятся жирного начертания и с малиновой подцветкой (как на расстроенном сведении лучей на кинескопе). У себя, примерного эффекта, я добился небольшим изменением размера прямоугольников в вышеприведенном коде. Вопрос такой: может я что-то делаю не так или вообще не правильно? |