Задать фон в Single document.
Никак не могу найти, как это задать в Single document. А перерисовывать в OnDraw постоянно не хотелось бы, и так программа критична к графике, да и не правильно это.
Надо что - то, как при регистрации окна без MFC:
WNDCLASSEX wcl;
wcl.hbrBackground =(HBRUSH)GetStockObject (LTGRAY_BRUSH);
...
RegisterClassEx(&wcl);
либо какой-то другой похожий способ.
Заранее спасибо за помощь.
Нужно сделать фон в рабочей области окна серым.
Никак не могу найти, как это задать в Single document. А перерисовывать в OnDraw постоянно не хотелось бы, и так программа критична к графике, да и не правильно это.
Надо что - то, как при регистрации окна без MFC:
WNDCLASSEX wcl;
wcl.hbrBackground =(HBRUSH)GetStockObject (LTGRAY_BRUSH);
...
RegisterClassEx(&wcl);
либо какой-то другой похожий способ.
Заранее спасибо за помощь.
Если под MFC, посмотри
CWnd::OnCtlColor - удели внимание возвр. зн-ю
CWnd::OnEraseBkgnd - можно использовать CDC::GetBkColor
Если без MFC (Win32API напрямую или WTL), посмотри
WM_ERASEBKGND
WM_CTLCOLORDLG
Если под MFC, посмотри
CWnd::OnCtlColor - удели внимание возвр. зн-ю
CWnd::OnEraseBkgnd - можно использовать CDC::GetBkColor
Надо под MFC.
Ты не мог бы немного по подробнее. Я попробывал использовать CWnd::OnCtlColor - пишет, что protected (вызывал из CLookApp::InitInstance()).
и еще, мне надо изменить цвет фона, а не узнать каков он ( не понял чем может помочь CDC::GetBkColor).
Попробывал
CLookView::OnDraw(CDC* pDC){
pDC->SetBkColor(RGB(255,25,0));
не видно никакого результата, хоть в принципе и искал не совсем это.
Нужно сделать фон в рабочей области окна серым.
Никак не могу найти, как это задать в Single document. А перерисовывать в OnDraw постоянно не хотелось бы, и так программа критична к графике, да и не правильно это.
Надо что - то, как при регистрации окна без MFC:
WNDCLASSEX wcl;
wcl.hbrBackground =(HBRUSH)GetStockObject (LTGRAY_BRUSH);
...
RegisterClassEx(&wcl);
либо какой-то другой похожий способ.
Заранее спасибо за помощь.
В классе CWnd есть виртуальная функция PreCreateWindow, которая вызывается перед созданием окна. Переопредели ее в своем классе окна. В этой функции можешь зарегистрировать новый оконный класс (например, с помощью AfxRegisterWndClass), указав нужную кисть для фона, и сохранить его имя в поле lpszClass структуры CREATESTRUCT.
BOOL Window:: PreCreateWindow(CREATESTRUCT &cs)
{
if (!CWnd:: PreCreateWindow(cs))
{
return FALSE;
}
cs.lpszClass = AfxRegisterWndClass(/* параметры для оконного класса */);
return TRUE;
}
Смотри, чтобы реализация функции в классе-предке вызывалась до твоих изменений параметра cs.
Извините, если не очень внятно объяснил.
[QUOTE]Originally posted by Green
Если под MFC, посмотри
CWnd::OnCtlColor - удели внимание возвр. зн-ю
CWnd::OnEraseBkgnd - можно использовать CDC::GetBkColor
Надо под MFC.
Ты не мог бы немного по подробнее. Я попробывал использовать CWnd::OnCtlColor - пишет, что protected (вызывал из CLookApp::InitInstance()).
и еще, мне надо изменить цвет фона, а не узнать каков он ( не понял чем может помочь CDC::GetBkColor).
Попробывал
CLookView::OnDraw(CDC* pDC){
pDC->SetBkColor(RGB(255,25,0));
не видно никакого результата, хоть в принципе и искал не совсем это.
Вариант 1: если рабочая обл.должна быть серой всегда.
Находим в сгенеренном визардом коде метод
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
или т.п. Если метода нет то пишем его (не забудь объявить его в соотв.заголовочнике):
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
// ::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL); // Wizard code
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(LTGRAY_BRUSH), NULL); // My code
return TRUE;
}
Вариант 2: цвет надо менять.
С помощью ClassWizard-а или вручную создаем обработчик WM_ERASEBKGND
{
CRect rc;
GetClientRect(&rc);
pDC->FillSolidRect(&rc, m_BackColor);
return TRUE;
}
Далее создаем поле-член (переменую-член) m_BackColor, в которой и определяем цвет фона в текущий момент.
CWnd::OnCtlColor необходимо для того, чтобы делать фон контролов, рассположенных в окне, такого же цвета, как и фон самого окна.
Иногда можно обойтись без OnEraseBkgnd, если есть OnCtlColor и точно есть контролы в окне. Тогда можно просто вызывать в OnCtlColor метод SetBkColor. Но я бы не рекомендовал так делать.
А с GetBkColor я просто очепятался, хотел написать SetBkColor.
P.S. Блин, пока разжевывал, уже запостили про PreCreateWindow. Так что уж не сочтите за плагиат...
Спасибо. Использовал первый метод. Извини, что не дорубил с первого раза. Зачем нужно было лезть в ...App. CView ведь наследник CWnd. Мне стыдно, что тебе пришлось так разжовывать. Мне надо больше работать и меньше всякой фигней заниматься, типа "а-ля у меня где - то было письмо на компе, а сейчас его нету, ты не мог бы найти".(слежу за сеткой в одной фирме). "Нет, значит не было".- И работать дальше. А то забуду и то что знал.
Это для View-ера. Почти - что как ACDSee версии эдак 2.4, вот только графика чуть медленнее. Пытаюсь сделать побыстрее. Но думаю, что без лучшего метода открытия графических файлов не обойдусь.
Еще раз спасибо.