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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с StretchBlt, изображение с "дефектами" 
:(
    Опции темы
devmstr
Дата 15.9.2004, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 
user posted image
PM MAIL WWW   Вверх
Adil'
Дата 15.9.2004, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Знаешь, абсолютно работоспособный код, я даже проверил. Разве что SelectObject(hdc,hOldBitmap); лишнее, да и
hOldBitmap=SelectObject(hCompatibleDC,hBitmap); для hCompatibleDC было, а не для hdc. Да и загружать картинку из файла на каждый WM_PAINT некрасиво как-то, лучше это в WM_CREATE делать.

Может ты что-то утаил? smile.gif Или картинка в файле попорчена?




--------------------
Удачи
PM MAIL WWW   Вверх
devmstr
Дата 15.9.2004, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Я вообще с WinApi только разбираюсь и учусь по одной книжке, поэтому и написал в WM_PAINT.
Не картинкой всё путем! Так как с BitBtl всё зашибись! tounge.gif Но вот почему с Streatch проблемы - непойму thumbs-up.gif.
А вот еще ще. Если я код рисования картинки кину в WM_CREATE то при изменении размеров ничего происходить хорошего не будет. Тут и так еще одна непонятная проблемма!!!
Я добавил case
WM_SIZE:
UpdateWindow(hwnd);
При изменении размеров перерисовать! notify.gif Но картинка корректно не отображается при изменении размеров. Например при увеличении размера перерисовывается только добавленная часть!


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


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

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



1. Не UpdateWindow(hwnd);
а InvalidateRect(hWND,NULL,true)
2. SetStrechMode - устанавливает режим как "считать" цвета при растяжении. Убирает многие глюки smile.gif


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
devmstr
  Дата 17.9.2004, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Громадное тебе спасибо Nastya! tounge.gif Все, ты мне очень помогла. Всё работает cool.gif. И без глюков и на порядок быстрее.




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


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 
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.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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