小菜鸟在开发中遇到了好多困难~
希望各位高手能指导一下,谢谢!打开一张图片,将它显示出来,其中有放大和缩小操作。
原来每次OnDraw时,都用CDC::StretchBlt函数操作,但是滚动的时候屏幕闪的很厉害。
所以就想把各种尺寸的图片放到几个memDC中存储,每次显示的时候直接pDC->BilBlt就可以了。
但是这里却遇到了困难。怎么都显示不出来希望各位高手帮忙啊!!!
还有就是关于屏幕绘图,到底什么时候显示,怎么刷新才最合理啊!!
下面是一些代码,我觉得主要问题是不是在storeDCOne那个地方啊?
void CMapView::SetStretchMap(CDC *pDC, CGPSDoc *pDoc)
{
if(!pDoc->IsHaveMap())
return;
CBitmap* pBitmap=pDoc->GetBitmap();
if(pBitmap!=NULL)
{
int nWidth, nHeight;
CPalette* pOldPalette;
CPalette* pPalette=pDoc->GetPalette();
if(pPalette!=NULL)
{
pOldPalette=pDC->SelectPalette(pPalette,FALSE);
pDC->RealizePalette();
}
BITMAP bm;
pBitmap->GetBitmap(&bm);
if(storeDC.CreateCompatibleDC(pDC))
storeDC.SelectObject(pBitmap);
nWidth = bm.bmWidth/2;
nHeight = bm.bmHeight/2;
if(storeDCOne.CreateCompatibleDC(pDC)) //storeDCOne存储另一个尺寸的图片
{
if(storeBitmapOne.CreateCompatibleBitmap(pDC, nWidth, nHeight))
{
storeDCOne.SelectObject(&storeBitmapOne);
storeDCOne.SetStretchBltMode(COLORONCOLOR);
storeDCOne.StretchBlt(0, 0, nWidth, nHeight, &storeDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
}
int left = 0;
int top = 0;
SetMapPosition(bm.bmWidth, bm.bmHeight, left, top);
pDC->BitBlt(left,top,bm.bmWidth,bm.bmHeight,&storeDC,0,0,SRCCOPY);
SetScrollSizes(MM_TEXT, CSize(bm.bmWidth,bm.bmHeight));
if(pPalette!=NULL)
pDC->SelectPalette(pOldPalette,FALSE);
}
}
希望各位高手能指导一下,谢谢!打开一张图片,将它显示出来,其中有放大和缩小操作。
原来每次OnDraw时,都用CDC::StretchBlt函数操作,但是滚动的时候屏幕闪的很厉害。
所以就想把各种尺寸的图片放到几个memDC中存储,每次显示的时候直接pDC->BilBlt就可以了。
但是这里却遇到了困难。怎么都显示不出来希望各位高手帮忙啊!!!
还有就是关于屏幕绘图,到底什么时候显示,怎么刷新才最合理啊!!
下面是一些代码,我觉得主要问题是不是在storeDCOne那个地方啊?
void CMapView::SetStretchMap(CDC *pDC, CGPSDoc *pDoc)
{
if(!pDoc->IsHaveMap())
return;
CBitmap* pBitmap=pDoc->GetBitmap();
if(pBitmap!=NULL)
{
int nWidth, nHeight;
CPalette* pOldPalette;
CPalette* pPalette=pDoc->GetPalette();
if(pPalette!=NULL)
{
pOldPalette=pDC->SelectPalette(pPalette,FALSE);
pDC->RealizePalette();
}
BITMAP bm;
pBitmap->GetBitmap(&bm);
if(storeDC.CreateCompatibleDC(pDC))
storeDC.SelectObject(pBitmap);
nWidth = bm.bmWidth/2;
nHeight = bm.bmHeight/2;
if(storeDCOne.CreateCompatibleDC(pDC)) //storeDCOne存储另一个尺寸的图片
{
if(storeBitmapOne.CreateCompatibleBitmap(pDC, nWidth, nHeight))
{
storeDCOne.SelectObject(&storeBitmapOne);
storeDCOne.SetStretchBltMode(COLORONCOLOR);
storeDCOne.StretchBlt(0, 0, nWidth, nHeight, &storeDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
}
int left = 0;
int top = 0;
SetMapPosition(bm.bmWidth, bm.bmHeight, left, top);
pDC->BitBlt(left,top,bm.bmWidth,bm.bmHeight,&storeDC,0,0,SRCCOPY);
SetScrollSizes(MM_TEXT, CSize(bm.bmWidth,bm.bmHeight));
if(pPalette!=NULL)
pDC->SelectPalette(pOldPalette,FALSE);
}
}
解决方案 »
- 组合框ComboBox或者是拓展组合框 能不能让不同的行显示不同的字体?
- 如何绑定类的非静态函数,到一个C api回调函数?
- char*转_bstr_t时的调试问题
- CListCtrl 第一列 checkbox 第二列加图片问题
- 为什么调用的CapCreateCaptureWindows()函数会返回值为NULL的窗口句柄
- 急问求救:include 一个库头文件,编译后此文件报错,原因为何?
- 大家帮忙!!
- 请看~~~中间层是odbc api,前端开发工具除了vc++,还有其他的吗?哪个好呢?
- strtoint函数的头文件是什么?
- 还是在VC中如何用OpenGL的简单问题!!!
- CreateFileMapping/OpenFileMapping/MapViewOfFile代码求助
- 如何用系统调用来构造SYN数据包?
storeBitmapOne.CreateCompatibleBitmap(pDC, nWidth, nHeight))
我把nWidth 和nHeight设置成数字
但是就是不能大过1400 和2001,哎怎么弄的啊?
storeDC里面有东西,我可以显示出来~
关键是这个sotreDCOne控制不了
我在onDraw中是这样显示的
switch(m_nScaleLevel)
{
case 0://这个是原形,可以正常显示
width = pDoc->GetWidth();
height = pDoc->GetHeight();
SetMapPosition(width, height, left, top);
pDC->BitBlt(left, top, width, height, &storeDC, 0, 0, SRCCOPY);
break;
case 1://这个缩小后的就不可以了?
if(storeBitmapOne.GetSafeHandle())
{
storeBitmapOne.GetBitmap(&bm);
storeDCOne.SelectObject(&storeBitmapOne);
SetMapPosition(bm.bmWidth,bm.bmHeight, left, top);
pDC->BitBlt(left, top, bm.bmWidth, bm.bmHeight, &storeDCOne, 0, 0, SRCCOPY);
}
break;
}
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
POINT pt1, pt2;
pt1 = dmWcToSc(DmLogicalWin.xmin, DmLogicalWin.ymax, 0.0);
pt2 = dmWcToSc(DmLogicalWin.xmax, DmLogicalWin.ymin, 0.0); //在MemDC里面绘图 pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
把这个变量改成类的成员试试
memDC中有东西吗?
我把BITMAP 改为类成员就好了~
可能就是这个变量的问题哦!
谢谢了啊!呵呵真好~
大橘子,我明白的哦~
谢谢指教!