Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> При перерисовке кешится буфер DC, а как его удаляить фиг поймешь 
:(
    Опции темы
Royan
  Дата 11.7.2004, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Ну просто капец какой-то wow.gif

Собственно код

Вот так я вывожу текст
Цитата
  //...
  // this->hWnd = CreateWindowEx(...);
  //...
 
this->DrawScene();

Внутри this->DrawScene(); все выводится в буфер - this->hDCBuffer;

Первой строчкой в DrawScene() стоит макрос очистки буфера (на самом деле там он всего лишь закрашивается ровным серым цветом):
Цитата
VOID CMyWin::DrawScene(){
  PREPARE_MYDC_BUFFER(
this->hDCBuffer, this->hDCDisplay, RGB(192, 192, 192)); 
 
//...

Код макроса таков:
Цитата
#define PREPARE_MYDC_BUFFER(hDCBuf, hDCDest, hColorFill) \
   
this->GetClientRect();\
    hDCBuf = ::CreateCompatibleDC(hDCDest); \
    HBITMAP hPrevBmpMem = (HBITMAP)::GetCurrentObject(hDCDest, OBJ_BITMAP); \
    HBITMAP hNewBmpMem = ::CreateCompatibleBitmap(hDCDest, (
this->rct->right) - (this->rct->left) + 1, (this->rct->bottom) - (this->rct->top) + 1); \
    ::SelectObject(hDCBuf, hNewBmpMem); \
    { \
        HBRUSH hBr = ::CreateSolidBrush(hColorFill); \
        ::FillRect(hDCBuf,
this->rct, hBr); \
        ::DeleteObject(hBr); \
    } \
    hDCDest = hDCBuf;



Внутри обработчика WM_PAINT я макросом вывожу содержимое из this->hDCBuffer; в this->hDCDisply; последнее соответственно связано с контекста монитором

Вот макрос который это все деалет:
Цитата
#define DRAW_MYDC_FROM_BUFFER(hDCBuf) \
 
this->hDCDisplay;\
 
int nW = (this->rct->right) - (this->rct->left);\
 
int nH = (this->rct->bottom) - (this->rct->top); \
  ::BitBlt(
this->hDCDisplay, this->rct->left, this->rct->top, nW, nH, hDCBuf, 0, 0, SRCCOPY);

А вот код внутри обработчика WM_PAINT:

Цитата
  this->hDCDisplay = BeginPaint (this->hWnd, &ps); 
  DRAW_MYDC_FROM_BUFFER(
this->hDCBuffer);//Draw buffer 
 
EndPaint (this->hWnd, &ps); 


До сих пор все OK текст выводится и перерисовывается когда надо...
Но вот пришло сообщение WM_SIZE и внутри его обрботчика: я вызываю this->DrawScene(); и все! Окошко порывается серым цветом... хотя внутри DrawScene() куча TextOut'ов. Если закоментировать DrawScene() в WM_SIZE, все опять работает как надо.

Поробовал использовать WM_ERASEBKGND, но там вобще раз на раз не приходится (каждый раз какие-то куски)
Буду признателен за какой-нибудь совет ... smile.gif


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Royan
Дата 12.7.2004, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Вобщем оказалось, что вариантов тьма и все они так или иначе рефрешат картинку, самое главное - это послать WM_NCPAINT тогда все и перерисуется вот возможные решения:

1) ::InvalidateRect(this->hWnd, NULL, TRUE);

2) ::RedrawWindow(this->hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);

Хотя насколько я понял оба они абсолютно одинаковы

Непонятно почемуне работает связка:
HRGN hRgn = NULL;
::GetWindowRgn(this->hWnd, hRgn);
SendMessage(this->hWnd, WM_ERASEBKGND, (WPARAM)this->hDCDisplay, (LPARAM)NULL);
SendMessage(this->hWnd, WM_NCPAINT, (WPARAM)hRgn, (LPARAM)NULL);

Быть может нужно еще WM_PAINT сгенерировать...

Очень бы хотелось услышать коментарии от знатоков smile.gif


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
AndyY
Дата 13.7.2004, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



Royan
как-то странно все ты делаешьsmile.gif
вот например, зачем ты посылаешь WM_NCPAINT? Хочешь чтобы окно отрисовало неклиенскую область (т.е. рамку?) больше ничего толкового рисоваться не будет.

После того, как ты сделал InvalidateRect, попросить систему послать тебе немедленно WM_PAINT - очень просто. Для этого есть UpdateWindow.

еще - на мой взгляд очень плохая практика кешировать HDC. Наверное это у меня с windows 3.0, где HDC было всего 6 штукsmile.gif. Но в общем случае это никогда не нужно - открыл, нарисовал, закрыл. То есть один DC живет не дольше, чем одна отрисовка.

И еще - пожалуйста, если постишь в форум текст - убирай this->. Может кому-то и пофигу, а мне читать такой текст значительно сложнее.


--------------------
PM MAIL WWW   Вверх
Royan
Дата 14.7.2004, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Цитата
вот например, зачем ты посылаешь WM_NCPAINT? Хочешь чтобы окно отрисовало неклиенскую область

Я когда читал его описание почему-то псчитал что фрейм - это все что внутри окна, теперь буду знать smile.gif

Цитата
плохая практика кешировать HDC. Наверное это у меня с windows 3.0, где HDC было всего 6 штук

Я таких времен не помню, был ешо мал, но вот буквально сегодня столкнулся с тем, что не могу создать второй CompatibleDC из hDC монитора, функция CreateCompatibleDC возвращала 0, а GetLastError() что-то вроде can't create file. The file already exists.

Цитата
И еще - пожалуйста, если постишь в форум текст - убирай this->. Может кому-то и пофигу, а мне читать такой текст значительно сложнее.

Okey, буду стараться вырезать только,тогда не оличищь локальных переменных от членов класса имхо это и есть плохо


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1255 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.