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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать двойную буферизацию? 
:(
    Опции темы
devmstr
  Дата 18.9.2004, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Как реализовать двойную буферизацию?

Вот я попробовал её реализовать, только что-то ничего не получается. А правильно ли я вообще понял идею буферизации. Вначале во временный DC загружаю BITMAP, потом расстягиваю его до нужных размеров, копируя в другой временный DC(StretchBlt). Затем функцией BitBtl "показываю" второй временный канвас(а такли нужно делать?). Где ошибка?


LONG WINAPI WindProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
HDC hdc,hCompatibleDC,hCD;
static HANDLE hBitmap;
HANDLE hOldBitmap;
BITMAP Bitmap;
PAINTSTRUCT ps;
RECT rect;
switch (msg)
{
case WM_CREATE:
hBitmap=LoadImage(NULL,"s.bmp",IMAGE_BITMAP,NULL,NULL,LR_LOADFROMFILE);
break;
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hCompatibleDC=CreateCompatibleDC(hdc);
hCD=CreateCompatibleDC(hdc);
hOldBitmap=SelectObject(hCompatibleDC,hBitmap);
GetObject(hBitmap,sizeof BITMAP,&Bitmap);
GetClientRect(hwnd,&rect);

SetStretchBltMode(hCD,COLORONCOLOR);
StretchBlt(hCD,0,0,rect.right,rect.bottom,
hCompatibleDC,0,0,Bitmap.bmWidth,
Bitmap.bmHeight,SRCCOPY);
BitBlt(hdc,0,0,rect.right,rect.bottom,hCD,0,0,SRCCOPY);

SelectObject(hdc,hOldBitmap);
EndPaint(hwnd,&ps);
DeleteDC(hCompatibleDC);
DeleteDC(hCD);

break;
case WM_SIZE:
InvalidateRect(hwnd,NULL,true);
break;
default:
return DefWindowProc(hwnd,msg,wparam,lparam);
}
return 0;
}

Просветите ламера?


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Step
Дата 18.9.2004, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



ИМХО
для hCD нужно установить битмеп пусть и нулевой....
и вообще при работе с битмепами необходима на каждое устройсво биткарту пусть даже пустую.....

Где то это обсуждалось сделайте поиск по StretchBlt или BitBlt


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Атос
Дата 18.9.2004, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не очень понял код... Читать трудно...

Но может не надо SelectObject(hdc, hOldBitmap)?

точнее:

Код

  HDC dc = BeginPaint(hwnd, &ps);

  hdc dcBUF = CreateComp....
  hbmp bmpBUF = CreateCompBitm...
  SelectObject(dcBUF, bmpBUF);

  // рисуем в bmpBUF посредством dcBUF

 BitBlt(hdc, 0, 0, width, height, dBUF);

 EndPaint(hwnd, &ps)


Это сообщение отредактировал(а) Атос - 18.9.2004, 10:58
PM MAIL ICQ   Вверх
mr.DUDA
Дата 18.9.2004, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232




Модератор: пользуйтесь С++ FAQ или поиском!!!

ссылка на тему, являющуюся прямым ответом на поставленный вопрос:
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=181201


--------------------
user posted image
PM MAIL WWW   Вверх
devmstr
Дата 18.9.2004, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Спасибо Вам. Постараюсь воспользоваться Вашим советом.
Я посмотрел тот пример.
У меня вообщем был вначале полностью рабочий код
{
HDC hdc,hCompatibleDC;
static HANDLE hBitmap;
HANDLE hOldBitmap;
BITMAP Bitmap;
PAINTSTRUCT ps;
RECT rect;
switch (msg)
{
case WM_CREATE:
hBitmap=LoadImage(NULL,"s.bmp",IMAGE_BITMAP,NULL,NULL,LR_LOADFROMFILE);
break;
case WM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hCompatibleDC=CreateCompatibleDC(hdc);
hOldBitmap=SelectObject(hCompatibleDC,hBitmap);
GetObject(hBitmap,sizeof BITMAP,&Bitmap);
GetClientRect(hwnd,&rect);
SetStretchBltMode(hdc,COLORONCOLOR);
StretchBlt(hdc,0,0,rect.right,rect.bottom,
hCompatibleDC,0,0,Bitmap.bmWidth,
Bitmap.bmHeight,SRCCOPY);
SelectObject(hdc,hOldBitmap);
EndPaint(hwnd,&ps);
DeleteDC(hCompatibleDC);


break;
case WM_SIZE:
InvalidateRect(hwnd,NULL,true);
break;
default:
return DefWindowProc(hwnd,msg,wparam,lparam);
}
return 0;
}


Все классно (ну почти) работало. Я имею некоторые проблемы с "пониманием" макросов и программ на WinApi, так как вообщем только недавно перешел на С++ и на API.
Посмотрев Ваш пример мне кажется, что приведенная программа и так поддерживает двойную буф., так как все действия я проводил на другом Dc, что в принцыпе и является(ну я так понимаю) основой метода двойной буфферизации.
Единственно, меня не устраивает во всем этом, так это появления небольших полос во время изменения размера формы.
Как от них избавиться.
sad.gif


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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