Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.23.101.60] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Нужно вывести bmp в static. Делаю с помощью STM_SETIMAGE, но если изображение больше чем static , то оно не рисуется полностью. Так вот как ужать (или растянуть) картинку на весь статик?
|
Сообщ.
#2
,
|
|
|
Используй StretchBlt с режимом HALFTONE
|
Сообщ.
#3
,
|
|
|
И что это даст?
|
Сообщ.
#4
,
|
|
|
Профит это даст.
|
Сообщ.
#5
,
|
|
|
а пример кода или ссылку можно?
|
Сообщ.
#6
,
|
|
|
помог SS_REALSIZECONTROL
|
Сообщ.
#7
,
|
|
|
Цитата www @ а пример кода или ссылку можно? ПОИСК: StretchBlt Например, Поместить изображение в CStatic SS_REALSIZECONTROL не сглаживает изображение при масштабировании |
Сообщ.
#8
,
|
|
|
Вот вернулся опять...
Есть такой вопрос: нужно нарисовать в памяти изображение, а затем вывести его в static. Делаю так, но на выходе получаю черный квадрат. Где я не прав? bool DrawObject::Draw(HWND hWnd, ImageObject &hImage) { RECT rct={0}; GetClientRect(hWnd,&rct); HDC dc=GetDC(hWnd); HDC dest=CreateCompatibleDC(dc); DrawScale(dest,rct,maxY,maxC); ImageObject *obj=DrawGisto(dest,rct,maxY,maxC,vector,N); DrawImage(hWnd,rct.right-rct.left,rct.bottom-rct.top,*obj); ReleaseDC(hWnd,dc); return true; } bool DrawObject::DrawImage(HWND hWnd,int wDest,int hDest,ImageObject &hImage) { HBITMAP hBitmap=hImage.GetImageHandle(); if(hBitmap) { hBitmap=(HBITMAP)SendMessage(hWnd,STM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBitmap); return true; } return false; } bool DrawObject::DrawScale(HDC &hdcDst,RECT rct,int maxY,int maxC) { HPEN hAxisPen=CreatePen(PS_SOLID,2,RGB(0x00,0x00,0xff)); HGDIOBJ hOld=SelectObject(hdcDst,hAxisPen); MoveToEx(hdcDst,rct.left+10,rct.top+10,NULL); LineTo(hdcDst,rct.left+10,rct.bottom-10); LineTo(hdcDst,rct.right-10,rct.bottom-10); DeleteObject(hAxisPen); return true; } |
Сообщ.
#9
,
|
|
|
CreateCompatibleBitmap не хватает ну и SelectObject...
|
Сообщ.
#10
,
|
|
|
дописал вот так, но результата нет
bool DrawObject::Draw(HWND hWnd, ImageObject &hImage) { RECT rct={0}; GetClientRect(hWnd,&rct); HDC dc=GetDC(hWnd); HDC dest=CreateCompatibleDC(dc); HBITMAP hCompatibleBitmap=CreateCompatibleBitmap(dc,rct.right-rct.left,rct.bottom-rct.top); SelectObject(dest,hCompatibleBitmap); DrawScale(dest,rct,maxY,maxC); ImageObject *obj=DrawGisto(dest,rct,maxY,maxC,vector,N); DrawImage(hWnd,rct.right-rct.left,rct.bottom-rct.top,*obj); ReleaseDC(hWnd,dc); return true; } |
Сообщ.
#11
,
|
|
|
Дык у тебя DrawImage() посылает SendMessage, а не рисует на hCompatibleBitmap, а потом типа BitBlt на DC статика.
Вот от этого у тебя ничего и нету |
Сообщ.
#12
,
|
|
|
еще бы быть уверенным как получается изображение из контекста в DrawGisto.... там есть SelectObject, чтоб вернуть заполненый битмап?
|
Сообщ.
#13
,
|
|
|
2Dem_max
а как нарисовать в hCompatibleBitmap? нужно в памяти сформировать изображение, а потом вывести его в static с помощью STM_SETIMAGE. 2ElcnU все выглядит так bool DrawObject::DrawImage(HWND hWnd,int wDest,int hDest,ImageObject &hImage) { HBITMAP hBitmap=hImage.GetImageHandle(); if(hBitmap) { hBitmap=(HBITMAP)SendMessage(hWnd,STM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBitmap); } return false; } bool DrawObject::DrawScale(HDC &hdcDst,RECT rct,int maxY,int maxC) { HPEN hAxisPen=CreatePen(PS_SOLID,2,RGB(0x00,0x00,0xff)); HGDIOBJ hOld=SelectObject(hdcDst,hAxisPen); MoveToEx(hdcDst,rct.left+10,rct.top+10,NULL); LineTo(hdcDst,rct.left+10,rct.bottom-10); LineTo(hdcDst,rct.right-10,rct.bottom-10); DeleteObject(hAxisPen); return true; } ImageObject* DrawObject::DrawGisto(HDC &dest,RECT rct,int maxY, int maxC,int *vector,int N) { double xStep=(rct.right-rct.left-20)/256; double yStep=(rct.bottom-rct.top-20)/maxC; HBITMAP hCompatibleBitmap=CreateCompatibleBitmap(dest,rct.right-rct.left,rct.bottom-rct.top); SelectObject(dest,hCompatibleBitmap); HPEN hGistoPen=CreatePen(PS_SOLID,1,RGB(0xff,0x00,0x00)); HGDIOBJ hOld=SelectObject(dest,hGistoPen); for(int i=0;i<N;i++) { MoveToEx(dest,xStep*i,rct.bottom-10,NULL); LineTo(dest,xStep*i,yStep*vector[i]); } SelectObject(dest,hOld); DeleteObject(hGistoPen); return new ImageObject(hCompatibleBitmap); } bool DrawObject::DrawGistogram(HWND hWnd, ImageObject &hImage) { RECT rct={0}; GetClientRect(hWnd,&rct); HDC dc=GetDC(hWnd); hImage.CalculateGistogramm(dc); int *vector=hImage.GetGistoVector(); int maxY=0,maxC=0; int N=hImage.GetGistoCount(); for(int i=0;i<N;i++) { if(vector[i/*яркость*/]>maxC) maxC=vector[i]; if(i>maxY && i!=0) maxY=i; } HDC dest=CreateCompatibleDC(dc); DrawScale(dest,rct,maxY,maxC); ImageObject *obj=DrawGisto(dest,rct,maxY,maxC,vector,N); DrawImage(hWnd,rct.right-rct.left,rct.bottom-rct.top,*obj); ReleaseDC(hWnd,dc); return true; } |
Сообщ.
#14
,
|
|
|
может наведет на мысль Разделить HBITMAP на куски (сообщение #1834452)
стоит обратить внимание, что битмап отвязывался от контекста перед возвратом из функции |
Сообщ.
#15
,
|
|
|
Сам Bjarne Stroustrup дал ответ: "Так перед тем как битмап HBITMAP запиcывать в файл .bmp его надо удалить из контекста памяти."
GDI Вызов DeleteDC(dest); перед return new ImageObject(hCompatibleBitmap); помог. |