我从本地文件中读取一幅图片,使用CPictureHolder在内存中绘制,完成后拷贝到界面中,这样实现可以减少屏幕的闪烁。
现在的问题是:
我从本地读取的图片文件需要做一个简单的修改,在上面加上个斜线,比如:我图片文件里画的是一个正方形,我想等显示到界面上的时候是,正方形中间有一条从左上角到右下角的横线,而加横线是在内存中完成的。不知道如何解决?
现在的问题是:
我从本地读取的图片文件需要做一个简单的修改,在上面加上个斜线,比如:我图片文件里画的是一个正方形,我想等显示到界面上的时候是,正方形中间有一条从左上角到右下角的横线,而加横线是在内存中完成的。不知道如何解决?
IStream *pIStream;
CPictureHolder m_pic;
CDC MemDC;
CBitmap bmpFace;
CBitmap *pOldBitmap;//读取图片数据到char型数组中
//使用char型数组创建Stream对象
OleLoadPicture(pIStream, picturebufferlength, TRUE, IID_IPicture,(LPVOID*)&m_pic.m_pPict);
//得到图片的宽度和高度
SIZE sizeInHiMetric, sizeInPix;
m_pic.m_pPict->get_Width(&sizeInHiMetric.cx);
m_pic.m_pPict->get_Height(&sizeInHiMetric.cy);//Calculate Its Size On a "Standard" (96 DPI) Device Context
sizeInPix.cx = MulDiv(sizeInHiMetric.cx, 96, HIMETRIC_INCH);
sizeInPix.cy = MulDiv(sizeInHiMetric.cy, 96, HIMETRIC_INCH);MemDC.CreateCompatibleDC(NULL);
bmpFace.CreateCompatibleBitmap(&MemDC, sizeInPix.cx, sizeInPix.cy);
//将这幅图片选入内存DC
pOldBitmap = MemDC.SelectObject(&bmpFace);m_pic.m_pPict->Render(MemDC.GetSafeHdc(), 0, 0, sizeInPix.cx, sizeInPix.cy,
0, sizeInHiMetric.cy, sizeInHiMetric.cx, -sizeInHiMetric.cy, &rcBounds);MemDC.SelectObject(MemDC,pOldBitmap ); CPen penRed(PS_SOLID, 10, RGB(255,0,0) );
CPen* pOldPen = MemDC->SelectObject(&penRed);
MemDC->MoveTo(0,0);
MemDC->LineTo(sizeInHiMetric.cx,sizeInHiMetric.cy);
MemDC->SelectObject(pOldPen);但是这样没有出现效果,不知道为什么
CPen penRed(PS_SOLID, 10, RGB(255,0,0) );
CPen* pOldPen = MemDC->SelectObject(&penRed);
MemDC->MoveTo(0,0);
MemDC->LineTo(sizeInHiMetric.cx,sizeInHiMetric.cy);
MemDC->SelectObject(pOldPen);
//再执行
m_pic.m_pPict->Render(MemDC.GetSafeHdc(), 0, 0, sizeInPix.cx, sizeInPix.cy,
0, sizeInHiMetric.cy, sizeInHiMetric.cx, -sizeInHiMetric.cy, &rcBounds);MemDC.SelectObject(MemDC,pOldBitmap );
实现双缓冲的具体步骤
http://www.cnblogs.com/songsu/articles/1340110.html
2、MemDC.CreateCompatibleDC(NULL); 为什么以NULL创建兼容DC,你只是想获得位图信息?如果你要在窗口显示你应该以窗口的DC作为参数
3、你在兼容DC绘制完直线、矩形后,应该将兼容DC的内容显示到窗口DC中,如下代码
pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 0, 0, SRCCOPY); //bmpInfo是BITMAP结构体,保存位图的信息
//pDC是显示窗口的DC指针
如果您真的能抽出时间来给我回帖,我非常感谢,如果您回复的时候少用一些问号,多给一些可行的方法,我将感激不尽
void OnDraw(CDC* pDC)
{
char chPicData[10240] = {0};
long nPicDataLen = 0; FILE *fp = NULL;
fp = fopen("C:\\123.gif", "rb");
if (fp == NULL)
{
fclose(fp);
fp = NULL;
}
fseek(fp, 0, SEEK_END);
nPicDataLen = ftell(fp);
fclose(fp);
fp = NULL; fp = fopen("C:\\123.gif", "rb");
if (fp == NULL)
{
fclose(fp);
fp = NULL;
}
fread(chPicData, nPicDataLen, 1, fp);
fclose(fp); IStream *pStm;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nPicDataLen);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
memcpy(pvData, chPicData, nPicDataLen);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
IPicture *pPic;
HRESULT hr = OleLoadPicture(pStm, nPicDataLen, TRUE, IID_IPicture, (LPVOID*)&pPic);
if (SUCCEEDED(hr) && pPic != NULL)
{
// get width and height of picture
VERIFY(SUCCEEDED(pPic->get_Width(&m_sizeInHiMetric.cx)));
VERIFY(SUCCEEDED(pPic->get_Height(&m_sizeInHiMetric.cy)));
const int HIMETRIC_PER_INCH = 2540;
const HDC hDCScreen = ::GetDC(NULL);
ASSERT(hDCScreen != NULL);
// Pixels per logical inch along width
const int nPixelsPerInchX = ::GetDeviceCaps(hDCScreen, LOGPIXELSX);
// Pixels per logical inch along height
const int nPixelsPerInchY = ::GetDeviceCaps(hDCScreen, LOGPIXELSY);
VERIFY(::ReleaseDC(NULL, hDCScreen) != 0);
// convert himetric to pixels
m_sizeInPix.cx = (nPixelsPerInchX * m_sizeInHiMetric.cx +
HIMETRIC_PER_INCH / 2) / HIMETRIC_PER_INCH;
m_sizeInPix.cy = (nPixelsPerInchY * m_sizeInHiMetric.cy +
HIMETRIC_PER_INCH / 2) / HIMETRIC_PER_INCH;
pStm->Release();
FreeResource(hGlobal);
//显示图像到内存DC
HDC hMemDC;
HBITMAP hOldBitmap;
CBitmap bitmap;
hMemDC = CreateCompatibleDC(pDC->GetSafeHdc());
hNewBitmap = CreateCompatibleBitmap(pDC->GetSafeHdc(), m_sizeInPix.cx, m_sizeInPix.cy);
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hNewBitmap); CPen penRed(PS_SOLID, 10, RGB(255,0,0) );
CPen* pOldPen = CDC::FromHandle(hMemDC)->SelectObject(&penRed);
CDC::FromHandle(hMemDC)->MoveTo(0, 0);
CDC::FromHandle(hMemDC)->LineTo(200, 200); pDC->BitBlt(200, 200, 200, 200, CDC::FromHandle(hMemDC), 0, 0, SRCCOPY);
CDC::FromHandle(hMemDC)->SelectObject(&pOldPen);
CDC::FromHandle(hMemDC)->SelectObject(hOldBitmap);
VERIFY(CDC::FromHandle(hMemDC)->DeleteDC());
pPic->Release();
pPic = NULL;
hNewBitmap = (HBITMAP)SelectObject(hMemDC,hOldBitmap);
}
}我现在的问题是:
hNewBitmap = CreateCompatibleBitmap(pDC->GetSafeHdc(), m_sizeInPix.cx, m_sizeInPix.cy);
执行效果不正确,怎么才能从二进制的图片数据得到CBitmap指针?
hNewBitmap = CreateCompatibleBitmap(pDC->GetSafeHdc(), m_sizeInPix.cx, m_sizeInPix.cy);这句可能会有问题,你窗口和图片大小一样?
hNewBitmap = CreateCompatibleBitmap(pDC->GetSafeHdc()); //可以写成这样,创建一个单色位图
CBitmap m_blackbmp;
m_pDc_.CreateCompatibleDC(NULL);
m_blackbmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(0,0,0));
CBrush brush(RGB(0,0,0));
m_pDc_.SelectObject(&pen);
m_pDc_.SelectObject(&brush);
m_pDc_.SelectObject(&m_blackbmp);
m_pDc_.FillRect(rc,&CBrush(RGB(255,255,255)));
//...
这里就可以绘制你想绘制的图了
//...
pDC->BitBlt(0,0,300,300,&m_pDc_,0,0,SRCCOPY);
m_blackbmp.DeleteObject();
m_pDc_.DeleteDC();