Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Установка графического фона диалогового окна

7.8K
20 февраля 2007 года
simplemortal
62 / / 09.02.2007
Кратко изложу суть проблемы.
Необходимо залить фон диалогового окна кистью из небольшого рисунка.
Я в OnPaint написал следующий код:

 
Код:
CMyDlg dlg;
CClientDC dc(this);
CRect rect;
CBitmap bmpFon;
bmpFon.LoadBitmap(IDB_FON); //в ресурсах лежит такой битмап
CBrush br(&bmpFon);
dc.SetBrushOrg(0,0);
dc.SelectObject(&br);
////////dlg.GetClientRect(rect);  
dc.FillRect(CRect(0,0,200,200),&br);


Фон рисуется нормально, но окно будет с изменяемыми размерами, поэтому, я не могу явно задавать размер CRect(0,0,200,200).
Как я понимаю, нужно получить размер клиентской области экрана.
Если использовать функцию dlg.GetClientRect(rect);, то компилируется нормально, а при работе, происходит какой-то косяк.
Помогите разобраться в чём дело.

И ещё, как сделать, чтобы фон текста в Static, RadioButton и прочих элементах управления стал прозрачным?
Свойство Transparent не помогает (кстати, почему? ведь оно отвечает за прозрачность?!).
Заранее спасибо!
320
21 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
 
Код:
CMyDlg dlg;
CClientDC dc(this);
CRect rect;
CBitmap bmpFon;
bmpFon.LoadBitmap(IDB_FON); //в ресурсах лежит такой битмап
CBrush br(&bmpFon);
dc.SetBrushOrg(0,0);
dc.SelectObject(&br);
GetClientRect(rect);  
dc.FillRect(rect,&br);

Так все работает нормально:)
320
21 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Только не совсем понятно зачем это ? Так рисунок просто повторяется.
Если тебе надо изменить фон диалога можно сделать проще.Обьяви в классе диалога переменную HBRUSH brush;в OnInitDialog добавь
 
Код:
brush = CreateSolidBrush(RGB(200,200,200));

RGB - ставь любой цвет,тут стоит серый.
В Messages добавь для диалога ф-ию OnCtrlColor и верни вместо hbr , свою кисть.Она должна выглядеть так.
 
Код:
HBRUSH CmDLGDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    return brush;
}
7.8K
21 февраля 2007 года
simplemortal
62 / / 09.02.2007
Действительно, если без "dlg.", то работает!:cool:

Цитата:
Только не совсем понятно зачем это ? Так рисунок просто повторяется.



Мне так и нужно, я взял из одной интернет-странички неплохое фоновое изображение и решил залить им окно. Получается довольно мило.:)

Но, как я уже писал, фон под текстом Static, RadioButton и прочих элементов не закрашивается. А кнопки, наоборот, закрашиваются полностью так, что их не видно, и прорисовываются только при наведении мыши.

320
21 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: simplemortal
Но, как я уже писал, фон под текстом Static, RadioButton и прочих элементов не закрашивается. А кнопки, наоборот, закрашиваются полностью так, что их не видно, и прорисовываются только при наведении мыши.



А как должно быть - прозрачный фон элементов управления ?

7.8K
21 февраля 2007 года
simplemortal
62 / / 09.02.2007
Цитата:
А как должно быть - прозрачный фон элементов управления ?



В тексте Static, RadioButton и пр фон окна между буквами и внутри букв, например внутри буквы "О", должен быть закрашен рисунком кисти, а он остаётся стандартного цвета окна.

324
22 февраля 2007 года
AndreySar
532 / / 01.08.2004
Как тебе уже сказали, следует использовать OnCtlColor. В данной функции можно задавать различные параметры отрисовки элементов управления. Для текста возвращай NULL_BRUSH и у тебя будет прозрачный фон.
Код:
HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  Change any attributes of the DC here
    if(nCtlColor == CTLCOLOR_STATIC)
    {
        if(pWnd->GetDlgCtrlID() == IDC_STAT1)
        {
            CFont font;
            font.CreateFont(-18, 0, 0, 0, 700, 1, 0, 0, RUSSIAN_CHARSET,
                0, 0, 0, 0, "Times New Roman Cyr");

            pDC->SelectObject(&font);

            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(RGB(0, 0, 255));
        }

        if(pWnd->GetDlgCtrlID() == IDC_STAT2)
        {
            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(RGB(128, 128, 128));         
        }

        return (HBRUSH)GetStockObject(WHITE_BRUSH);
    }
    // TODO:  Return a different brush if the default is not desired
    return hbr;
}
7.8K
22 февраля 2007 года
simplemortal
62 / / 09.02.2007
Спасибо большое, m_Valery и AndreySar!
У меня получилось закрасить фон.
Кисть для фона создал функцией CreateDIBPatternBrush.
Статики прозрачные!
Почти всё прекрасно. Но всё же не совсем.

Код:
HBRUSH CCImageDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if(nCtlColor == CTLCOLOR_STATIC)
    {
       
        if(pWnd->GetDlgCtrlID() == IDC_STATIC1)
        {
            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(RGB(0, 0, 210));         
        }
        if(pWnd->GetDlgCtrlID() == IDC_CHECK1)
        {
            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(RGB(255, 0, 0));
        }
        if(pWnd->GetDlgCtrlID() == IDC_RADIO1)
        {
            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(RGB(255, 0, 0));
        }

        return (HBRUSH)GetStockObject(NULL_BRUSH);
    }

    if(nCtlColor == CTLCOLOR_DLG)
        return brush; //моя графическая кисть
    return hbr;
}


Проблема в том, что у CheckBox и у RadioButton фон не становится прозрачным, а почему то заливается чёрным.
А мне его во что бы то ни стало нужно сделать прозрачным!
7.8K
23 февраля 2007 года
simplemortal
62 / / 09.02.2007
Проблеме решена!
Прозрачный фон у RadioButton и CheckButton почему-то не ставится, но ставится любой другой.
Я просто для этих элементов управления вернул не NULL_BRUSH, а кисть, содержащую рисунок фона.

Для моей задачи такое решение оказалось вполне приемлимым, но я всё-таки был бы рад узнать как ставить по-настоящему прозрачный фон у RadioButton и CheckButton.:)
320
23 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
У меня тоже пока не получилось поставить прозрачность для кнопки и радиокнопки.Никогда с этим не сталкивался.Поспрашиваю и если узнаю напишу.Но поскольку ты используешь,как я понял, только радиокнопки и чекбоксы - есть другой вариант.Их текст можно убрать в Properties->
Caption.Дальше максимально уменьшить их размеры и вместо их родного текста использовать статики.Просто вытащить их на форму и изменить Caption на нужный тебе текст.Поскольку у тебя в OnCtlDialog для статиков уже все прописано то делать ничего больше и не надо.:) Все получится именно так как тебе надо.А с прозрачностью разберемся.В принципе,если речь идет о кнопке(СButton) то можно изменить для нее фон и поставить такой же как у главного окна.Вот тут мы говорили о том как это сделать.Но имхо все же лучше прозрачность.:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог