![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
Тут возникла проблема. Заданная картинка почему-то отображается с некоторыми "глюками". При отображении в некоторых местах появились черные полосы-пятна. Если использовать BitBtl- всё путем. Подскажите почему.
#include <windows.h> LONG WINAPI WinProc(HWND,UINT,WPARAM,LPARAM); int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int CmdShow) { WNDCLASS WND; HWND Handle; MSG msg; memset(&WND,0,sizeof WND); WND.hInstance=hInstance; WND.style=CS_HREDRAW|CS_VREDRAW; WND.lpfnWndProc=WinProc; WND.hCursor=LoadCursor(NULL,IDC_ARROW); WND.hIcon=LoadIcon(NULL,IDI_ASTERISK); WND.hbrBackground=(HBRUSH)COLOR_WINDOW; WND.lpszClassName="WApl"; RegisterClass(&WND); Handle=CreateWindow("WApl","Picture Viewer",WS_OVERLAPPEDWINDOW,0,0,1024,768,NULL, NULL,hInstance,NULL); ShowWindow(Handle,CmdShow); UpdateWindow(Handle); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LONG WINAPI WinProc(HWND Handle,UINT msg,WPARAM wparam,LPARAM lparam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: HDC hdc,hCompatibleDC; HANDLE hBitmap,hOldBitmap; PAINTSTRUCT ps; BITMAP iBitmap; RECT rect; hdc=BeginPaint(Handle,&ps); hBitmap=LoadImage(NULL,"s.bmp",IMAGE_BITMAP, 0,0,LR_LOADFROMFILE); GetObject(hBitmap,sizeof iBitmap,&iBitmap); hCompatibleDC=CreateCompatibleDC(hdc); hOldBitmap=SelectObject(hCompatibleDC,hBitmap); GetClientRect(Handle,&rect); StretchBlt(hdc,0,0,rect.right,rect.bottom, hCompatibleDC,0,0,iBitmap.bmWidth, iBitmap.bmHeight,SRCCOPY); SelectObject(hdc,hOldBitmap); DeleteObject(hBitmap); DeleteDC(hCompatibleDC); EndPaint(Handle,&ps); return 0; break; default: return DefWindowProc(Handle,msg,wparam,lparam); } return 0; } -------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
| Adil' |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 6 Всего: 15 |
Знаешь, абсолютно работоспособный код, я даже проверил. Разве что SelectObject(hdc,hOldBitmap); лишнее, да и
hOldBitmap=SelectObject(hCompatibleDC,hBitmap); для hCompatibleDC было, а не для hdc. Да и загружать картинку из файла на каждый WM_PAINT некрасиво как-то, лучше это в WM_CREATE делать. Может ты что-то утаил? -------------------- Удачи |
|||
|
||||
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
Я вообще с WinApi только разбираюсь и учусь по одной книжке, поэтому и написал в WM_PAINT.
Не картинкой всё путем! Так как с BitBtl всё зашибись! А вот еще ще. Если я код рисования картинки кину в WM_CREATE то при изменении размеров ничего происходить хорошего не будет. Тут и так еще одна непонятная проблемма!!! Я добавил case WM_SIZE: UpdateWindow(hwnd); При изменении размеров перерисовать! -------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
1. Не UpdateWindow(hwnd);
а InvalidateRect(hWND,NULL,true) 2. SetStrechMode - устанавливает режим как "считать" цвета при растяжении. Убирает многие глюки -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
Громадное тебе спасибо Nastya!
-------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
Тут есть ещ один вопрос:
При изменении размера возникают небольшие белые пятна (именно во время расстягивания, потом они сразу же исчезают). То есть это перерисовывается окно. А возможно ли убрать эти полосы. Вот например в ACDSee сколько не дергай полос нет. Или они реализовывали свои функции по растяжению изображения. Вот я знаю что есть еще такая фича как двойная буферизация. Вот я попробовал её реализовать, только что-то ничего не получается. А правильно ли я вообще понял идею буферизации. Вначале во временный 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 ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |