CStatic
От: МедведьB  
Дата: 03.07.02 07:58
Оценка:
у меня есть диалоговое окно, на котором я рисую бмпешку(перекрытием метода OnEraseBkgnd). Так поверх этого окна(над бмпешкой) хотелось бы выводить текс. Причем делать это именно при помощи CStatic. Проблема в том, что когда я это делаю, то окно CStatic затерает часть бмпешки своим фоном. Хотелось бы, чтоб только текст отображался...
Как это можно сделать?

P.S. использовать не CStatic не предлогать
заранее спасибо!!!!
Re: CStatic
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 03.07.02 08:07
Оценка:
Здравствуйте МедведьB, Вы писали:

МB>у меня есть диалоговое окно, на котором я рисую бмпешку(перекрытием метода OnEraseBkgnd). Так поверх этого окна(над бмпешкой) хотелось бы выводить текс. Причем делать это именно при помощи CStatic. Проблема в том, что когда я это делаю, то окно CStatic затерает часть бмпешки своим фоном. Хотелось бы, чтоб только текст отображался...

МB>Как это можно сделать?

МB>P.S. использовать не CStatic не предлогать

МB>заранее спасибо!!!!
МB>


Может, я и ошибаюсь( да скорее всего, ошибаюсь точно ), но может быть, стоит перекрыть функцию CStatic::DrawItem? Например, так:



CMyStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {

if(TRANSPARENT != GetBkMode(lpDrawItemStruct->hDC)) 
       SetBkMode(lpDrawItemStruct->hDC, TRANSPARENT);

CStatic::DrawItem(lpDrawItemStruct);
 


}


За ошибки не пинать — в особенностях MFC не силен...
Re: CStatic
От: Аноним  
Дата: 03.07.02 08:10
Оценка:
Здравствуйте МедведьB, Вы писали:

МB>у меня есть диалоговое окно, на котором я рисую бмпешку(перекрытием метода OnEraseBkgnd). Так поверх этого окна(над бмпешкой) хотелось бы выводить текс. Причем делать это именно при помощи CStatic. Проблема в том, что когда я это делаю, то окно CStatic затерает часть бмпешки своим фоном. Хотелось бы, чтоб только текст отображался...

МB>Как это можно сделать?

МB>P.S. использовать не CStatic не предлогать:-)

МB>заранее спасибо!!!!
МB> :crash:

А почему нельзя там где ты рисуешь бмпешку сразу сделать и

CDC::TextOut(....)

При этом установить

CDC::SetBkMode(TRANSPARENT);
Re: CStatic
От: grad  
Дата: 03.07.02 08:14
Оценка:
Выставь ему стиль Transparent — мышкой в свойствах или WS_EX_TRANSPARENT если динамически.
Re[2]: CStatic
От: МедведьB  
Дата: 03.07.02 08:23
Оценка:
А>CDC::TextOut(....)

А>При этом установить


А>CDC::SetBkMode(TRANSPARENT);


просто мне удобно, чтоб текст представлял из себя окно, чтоб от него некоторые сообщения иногда получать.
Re[2]: CStatic
От: МедведьB  
Дата: 03.07.02 08:28
Оценка:
Здравствуйте grad, Вы писали:

G>Выставь ему стиль Transparent — мышкой в свойствах или WS_EX_TRANSPARENT если динамически.


да я в общем-то так и делал...
не получилось....

Text[Text.size()-1]->CreateEx(WS_EX_TRANSPARENT, !!!!!!, "45123",
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|SS_NOTIFY,
CRect(Property->Left,Property->Top,Property->Left+Width,Property->Top+Height), this, 777);

не подскажите зачем нужен 2-ой параметр? И как его попроще передать?
Re[3]: CStatic
От: SergH Россия  
Дата: 03.07.02 08:32
Оценка:
Здравствуйте МедведьB, Вы писали:

МB>не подскажите зачем нужен 2-ой параметр? И как его попроще передать?


Да вроде класс создаваемого окна... Для статика — передовай TEXT("STATIC").
Делай что должно, и будь что будет
Re[3]: CStatic
От: grad  
Дата: 03.07.02 08:32
Оценка:
Это имя WinAPI-класса окна. В CreateEx этот параметр должен быть ненулевым (RTFM). Передай туда _T("STATIC").
Re[4]: CStatic
От: МедведьB  
Дата: 03.07.02 08:41
Оценка:
Здравствуйте grad, Вы писали:

G>Это имя WinAPI-класса окна. В CreateEx этот параметр должен быть ненулевым (RTFM). Передай туда _T("STATIC").

Сделал.

WS_EX_TRANSPARENT не помогает. Все выглядит также как и без него.
Если добавлять не динамически а *выставлять ему стиль Transparent — мышкой в свойствах* то тоже не работает
Re[3]: CStatic
От: SergH Россия  
Дата: 03.07.02 09:12
Оценка:
Здравствуйте МедведьB, Вы писали:

МB>просто мне удобно, чтоб текст представлял из себя окно, чтоб от него некоторые сообщения иногда получать.


Ну сделай своё окошко, унаследованное от CWnd. И рисуй в нём что хочешь.
Делай что должно, и будь что будет
Re[4]: CStatic
От: МедведьB  
Дата: 03.07.02 09:15
Оценка:
SH>Ну сделай своё окошко, унаследованное от CWnd. И рисуй в нём что хочешь.

Да уже сделал.... Ну все таки хотелось бы на будущие знать
Re[5]: CStatic
От: grad  
Дата: 03.07.02 09:21
Оценка:
МB>WS_EX_TRANSPARENT не помогает. Все выглядит также как и без него.
МB>Если добавлять не динамически а *выставлять ему стиль Transparent — мышкой в свойствах* то тоже не работает
Попробуй рисовать через CDC::DrawState() — должно получиться. Наверное это OnEraseBkgnd() воду мутит.
Re[2]: CStatic
От: МедведьB  
Дата: 03.07.02 09:23
Оценка:
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 таким не сделать.... Или я заблуждаюсь?
Re[4]: На самом деле...
От: МедведьB  
Дата: 03.07.02 11:36
Оценка:
SH>Ну сделай своё окошко, унаследованное от CWnd. И рисуй в нём что хочешь.

Я поспешил с ответом... Делаю я свой окно, унаследованное от CWnd. Теперь вопрос... когда нужно рисовать все что хочешь? Какой метод переопределять? Если OnEraseBkgnd то что-то этот метод хоть и работает(выполняется), но визуально ничего не рисуется.
Re[5]: На самом деле...
От: SergH Россия  
Дата: 03.07.02 12:12
Оценка:
Здравствуйте МедведьB, Вы писали:

SH>>Ну сделай своё окошко, унаследованное от CWnd. И рисуй в нём что хочешь.


МB>Я поспешил с ответом... Делаю я свой окно, унаследованное от CWnd. Теперь вопрос... когда нужно рисовать все что хочешь? Какой метод переопределять? Если OnEraseBkgnd то что-то этот метод хоть и работает(выполняется), но визуально ничего не рисуется.


Рисовать — в OnPaint().
OnEraseBkgnd() вызывается до OnPaint и занимается очисткой фона, т.е. по умолчанию заполняет прямойгольник цветом фона окна. Можно оставить его таким (или переопределить в пустой для большей скорости) и в OnPaint рисовать в качестве фона нужный тебе кусочек картинки. А можно переопределить его так:

    CRect rc;
    GetWindowRect(&rc);

    CWnd* parent = GetParent();

    parent->InvalidateRect(rc, TRUE);
    parent->UpdateWindow();


И поставить родительскому окну флаг "рисовать поверх дочерних". Точнее, убрать 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.