![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| devmstr |
|
|||
![]() 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 ![]() |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
ИМХО
для hCD нужно установить битмеп пусть и нулевой.... и вообще при работе с битмепами необходима на каждое устройсво биткарту пусть даже пустую..... Где то это обсуждалось сделайте поиск по StretchBlt или BitBlt -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Атос |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 11.9.2004 Где: Екатеринбург Репутация: нет Всего: нет |
Не очень понял код... Читать трудно...
Но может не надо SelectObject(hdc, hOldBitmap)? точнее:
Это сообщение отредактировал(а) Атос - 18.9.2004, 10:58 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Модератор: пользуйтесь С++ FAQ или поиском!!! ссылка на тему, являющуюся прямым ответом на поставленный вопрос: http://forum.vingrad.ru/index.php?showtopi...ndpost&p=181201 -------------------- ![]() |
|||
|
||||
| devmstr |
|
|||
![]() 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, что в принцыпе и является(ну я так понимаю) основой метода двойной буфферизации. Единственно, меня не устраивает во всем этом, так это появления небольших полос во время изменения размера формы. Как от них избавиться. -------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |