Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CDialogEx::SetBackgroundImage() - проблема, нормальная отрисовка элементов диалога 
:(
    Опции темы
Albor
Дата 14.9.2010, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Проблема этого класса известна и описывается здесь. Предложенный способ решения прекрасно работает для однотонной заливки, но для метода 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-ов становятся жирного начертания и с малиновой подцветкой (как на расстроенном сведении лучей на кинескопе). У себя, примерного эффекта, я добился небольшим изменением размера прямоугольников в вышеприведенном коде. Вопрос такой: может я что-то делаю не так или вообще не правильно?
PM MAIL ICQ   Вверх
Albor
Дата 17.9.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Подозреваю, что это происходит из-за "двойного" рисования. То есть сначала "рисует" BitBlt, а потом рисуется фон контрола полученной кистью (может я и не прав). Переформулирую вопрос: можно ли как-то получить часть рисунка поверхности диалога для формирования патерновой кисти?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.