у меня есть диалоговое окно, на котором я рисую бмпешку(перекрытием метода OnEraseBkgnd). Так поверх этого окна(над бмпешкой) хотелось бы выводить текс. Причем делать это именно при помощи CStatic. Проблема в том, что когда я это делаю, то окно CStatic затерает часть бмпешки своим фоном. Хотелось бы, чтоб только текст отображался...
Как это можно сделать?
P.S. использовать не CStatic не предлогать
заранее спасибо!!!!
Здравствуйте МедведьB, Вы писали:
МB>у меня есть диалоговое окно, на котором я рисую бмпешку(перекрытием метода OnEraseBkgnd). Так поверх этого окна(над бмпешкой) хотелось бы выводить текс. Причем делать это именно при помощи CStatic. Проблема в том, что когда я это делаю, то окно CStatic затерает часть бмпешки своим фоном. Хотелось бы, чтоб только текст отображался... МB>Как это можно сделать?
МB>P.S. использовать не CStatic не предлогать МB>заранее спасибо!!!! МB>
Может, я и ошибаюсь( да скорее всего, ошибаюсь точно ), но может быть, стоит перекрыть функцию CStatic::DrawItem? Например, так:
За ошибки не пинать — в особенностях MFC не силен...
Re: CStatic
От:
Аноним
Дата:
03.07.02 08:10
Оценка:
Здравствуйте МедведьB, Вы писали:
МB>у меня есть диалоговое окно, на котором я рисую бмпешку(перекрытием метода OnEraseBkgnd). Так поверх этого окна(над бмпешкой) хотелось бы выводить текс. Причем делать это именно при помощи CStatic. Проблема в том, что когда я это делаю, то окно CStatic затерает часть бмпешки своим фоном. Хотелось бы, чтоб только текст отображался... МB>Как это можно сделать?
МB>P.S. использовать не CStatic не предлогать:-) МB>заранее спасибо!!!! МB> :crash:
А почему нельзя там где ты рисуешь бмпешку сразу сделать и
Здравствуйте grad, Вы писали:
G>Это имя WinAPI-класса окна. В CreateEx этот параметр должен быть ненулевым (RTFM). Передай туда _T("STATIC").
Сделал.
WS_EX_TRANSPARENT не помогает. Все выглядит также как и без него.
Если добавлять не динамически а *выставлять ему стиль Transparent — мышкой в свойствах* то тоже не работает
МB>WS_EX_TRANSPARENT не помогает. Все выглядит также как и без него. МB>Если добавлять не динамически а *выставлять ему стиль Transparent — мышкой в свойствах* то тоже не работает
Попробуй рисовать через CDC::DrawState() — должно получиться. Наверное это OnEraseBkgnd() воду мутит.
F>CMyStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
F>if(TRANSPARENT != GetBkMode(lpDrawItemStruct->hDC)) F> SetBkMode(lpDrawItemStruct->hDC, TRANSPARENT);
F>CStatic::DrawItem(lpDrawItemStruct); F>
F>За ошибки не пинать — в особенностях MFC не силен...
я так понимаю речь шла о OnDrawItem. Переопределить ее можно, но вызывается она только для так сказать owner-draw котролов. А Cstatic или CWnd таким не сделать.... Или я заблуждаюсь?
SH>Ну сделай своё окошко, унаследованное от CWnd. И рисуй в нём что хочешь.
Я поспешил с ответом... Делаю я свой окно, унаследованное от CWnd. Теперь вопрос... когда нужно рисовать все что хочешь? Какой метод переопределять? Если OnEraseBkgnd то что-то этот метод хоть и работает(выполняется), но визуально ничего не рисуется.
Здравствуйте МедведьB, Вы писали:
SH>>Ну сделай своё окошко, унаследованное от CWnd. И рисуй в нём что хочешь.
МB>Я поспешил с ответом... Делаю я свой окно, унаследованное от CWnd. Теперь вопрос... когда нужно рисовать все что хочешь? Какой метод переопределять? Если OnEraseBkgnd то что-то этот метод хоть и работает(выполняется), но визуально ничего не рисуется.
Рисовать — в OnPaint().
OnEraseBkgnd() вызывается до OnPaint и занимается очисткой фона, т.е. по умолчанию заполняет прямойгольник цветом фона окна. Можно оставить его таким (или переопределить в пустой для большей скорости) и в OnPaint рисовать в качестве фона нужный тебе кусочек картинки. А можно переопределить его так:
И поставить родительскому окну флаг "рисовать поверх дочерних". Точнее, убрать WS_CLIPCHILDREN. Я не пробовал, но вроде должно работать.
Делай что должно, и будь что будет
Re: CStatic
От:
Аноним
Дата:
01.03.05 09:23
Оценка:
Здравствуйте, МедведьB, Вы писали:
МB>у меня есть диалоговое окно, на котором я рисую бмпешку(перекрытием метода OnEraseBkgnd). Так поверх этого окна(над бмпешкой) хотелось бы выводить текс. Причем делать это именно при помощи CStatic. Проблема в том, что когда я это делаю, то окно CStatic затерает часть бмпешки своим фоном. Хотелось бы, чтоб только текст отображался... МB>Как это можно сделать?
МB>P.S. использовать не CStatic не предлогать МB>заранее спасибо!!!! МB>
Все очень просто с использованием MFC
WM_CTLCOLOR переопределить у диалога сообщение
HBRUSH CMfccliDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(CTLCOLOR_STATIC == nCtlColor) //хотим обраватывать статические элементы
{
UINT idST = pWnd->GetDlgCtrlID();
if( IDC_STATGAME_TXT == idST //не все а толко нужные, этот if можно выкинуть
|| IDC_STATIC_ROOM == idST
|| IDC_STATIC_MEMBER== idST
)
{
pDC->SetTextColor(RGB(255, 0, 0)); //если и цвет фрифта хочется поменть
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
}
return hbr;
}
выдрал прям из кода поэтому лишнее убери, если проэкт не MFC то там тоже есть очень похожее сообшение примерно WM_CTLCOLORSTATIC