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);
Установка графического фона диалогового окна
Необходимо залить фон диалогового окна кистью из небольшого рисунка.
Я в OnPaint написал следующий код:
Код:
Фон рисуется нормально, но окно будет с изменяемыми размерами, поэтому, я не могу явно задавать размер CRect(0,0,200,200).
Как я понимаю, нужно получить размер клиентской области экрана.
Если использовать функцию dlg.GetClientRect(rect);, то компилируется нормально, а при работе, происходит какой-то косяк.
Помогите разобраться в чём дело.
И ещё, как сделать, чтобы фон текста в Static, RadioButton и прочих элементах управления стал прозрачным?
Свойство Transparent не помогает (кстати, почему? ведь оно отвечает за прозрачность?!).
Заранее спасибо!
Код:
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);
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);
Так все работает нормально:)
Если тебе надо изменить фон диалога можно сделать проще.Обьяви в классе диалога переменную 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;
}
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return brush;
}
Цитата:
Только не совсем понятно зачем это ? Так рисунок просто повторяется.
Мне так и нужно, я взял из одной интернет-странички неплохое фоновое изображение и решил залить им окно. Получается довольно мило.:)
Но, как я уже писал, фон под текстом Static, RadioButton и прочих элементов не закрашивается. А кнопки, наоборот, закрашиваются полностью так, что их не видно, и прорисовываются только при наведении мыши.
Цитата: simplemortal
Но, как я уже писал, фон под текстом Static, RadioButton и прочих элементов не закрашивается. А кнопки, наоборот, закрашиваются полностью так, что их не видно, и прорисовываются только при наведении мыши.
А как должно быть - прозрачный фон элементов управления ?
Цитата:
А как должно быть - прозрачный фон элементов управления ?
В тексте Static, RadioButton и пр фон окна между буквами и внутри букв, например внутри буквы "О", должен быть закрашен рисунком кисти, а он остаётся стандартного цвета окна.
Код:
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;
}
{
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;
}
У меня получилось закрасить фон.
Кисть для фона создал функцией 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;
}
{
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 фон не становится прозрачным, а почему то заливается чёрным.
А мне его во что бы то ни стало нужно сделать прозрачным!
Прозрачный фон у RadioButton и CheckButton почему-то не ставится, но ставится любой другой.
Я просто для этих элементов управления вернул не NULL_BRUSH, а кисть, содержащую рисунок фона.
Для моей задачи такое решение оказалось вполне приемлимым, но я всё-таки был бы рад узнать как ставить по-настоящему прозрачный фон у RadioButton и CheckButton.:)
Caption.Дальше максимально уменьшить их размеры и вместо их родного текста использовать статики.Просто вытащить их на форму и изменить Caption на нужный тебе текст.Поскольку у тебя в OnCtlDialog для статиков уже все прописано то делать ничего больше и не надо.:) Все получится именно так как тебе надо.А с прозрачностью разберемся.В принципе,если речь идет о кнопке(СButton) то можно изменить для нее фон и поставить такой же как у главного окна.Вот тут мы говорили о том как это сделать.Но имхо все же лучше прозрачность.:)