OnPaint()
{
CPaintDC dc(this);
CRect rcClient ;
GetClientRect(&rcClient);
CDC mdc;
mdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
if (pDicomImg!=NULL)
{
if(data!=NULL)
{
delete data;
}
pDicomImg->createWindowsDIB(data, 0, 0, 24, 1, 1);//data是像素数据
if (dc!= 0)
{
BITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi);
bi.bmiHeader.biWidth = pDicomImg->getWidth();
bi.bmiHeader.biHeight = pDicomImg->getHeight();
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = 0;
HBITMAP hbmp = CreateDIBitmap(dc.m_hDC, &bi.bmiHeader, CBM_INIT, data, &bi, DIB_RGB_COLORS);
bitmap.Attach(hbmp);
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());//抛异常
mdc.SelectObject(bitmap);;
dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &mdc, 0, 0,SRCCOPY);
}
}
}
给位高手有没有办法,让data通过Cbitmap显示出来?
{
CPaintDC dc(this);
CRect rcClient ;
GetClientRect(&rcClient);
CDC mdc;
mdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
if (pDicomImg!=NULL)
{
if(data!=NULL)
{
delete data;
}
pDicomImg->createWindowsDIB(data, 0, 0, 24, 1, 1);//data是像素数据
if (dc!= 0)
{
BITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi);
bi.bmiHeader.biWidth = pDicomImg->getWidth();
bi.bmiHeader.biHeight = pDicomImg->getHeight();
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = 0;
HBITMAP hbmp = CreateDIBitmap(dc.m_hDC, &bi.bmiHeader, CBM_INIT, data, &bi, DIB_RGB_COLORS);
bitmap.Attach(hbmp);
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());//抛异常
mdc.SelectObject(bitmap);;
dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &mdc, 0, 0,SRCCOPY);
}
}
}
给位高手有没有办法,让data通过Cbitmap显示出来?
bitmap.Attach(hbmp);
mdc.SelectObject(&bitmap);
dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &mdc, 0, 0,SRCCOPY);
快乐鹦鹉,帮我看看这个问题啊。
CPaintDC dc(this); // device context for painting
CRect rcClient ;
GetClientRect(&rcClient);
CDC mdc;
mdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
mdc.SelectObject(&bitmap);
////内存绘制,这个代码要怎么写?
{
内存绘制
{
dc.BitBlt(0,0,rcClient.Width(), rcClient.Height(), &mdc, 0, 0,SRCCOPY);
}
CDC m1;
if ( pDicomImg!=NULL)
{
if(data!=NULL)
{
delete data;
}
pDicomImg->createWindowsDIB(data, 0, 0, 24, 1, 1);
if (dc!= 0)
{
BITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi);
bi.bmiHeader.biWidth = pDicomImg->getWidth();
bi.bmiHeader.biHeight = pDicomImg->getHeight();
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = 0;
HBITMAP hbmp = CreateDIBitmap(dc.m_hDC, &bi.bmiHeader, CBM_INIT, data, &bi, DIB_RGB_COLORS);
if (hbmp != NULL)
{
HDC memDC = CreateCompatibleDC(dc.m_hDC);
SelectObject(memDC, hbmp);
m1.Attach(memDC);
dc.SetStretchBltMode(HALFTONE);
dc.StretchBlt(m_rcImgPaint.left,m_rcImgPaint.top,iPWidth,iPHeight,&m1,0,0,bi.bmiHeader.biWidth,bi.bmiHeader.biHeight,SRCCOPY);
DeleteDC(memDC);
DeleteObject(hbmp);
}
}
}
}这个是我用stretchblt显示图像的代码,请问要如何改进,“把dc中的位图取出保存,下一次用BitBlt”要如何操作?
HBITMAP hBkBmp = SelectObject(dc,hBmp);//hBkBmp 进行保留,它应该就是放缩后的图片,假如窗口的宽高不变的话。如果宽高变化,则需要重新StretchBlt来形成新的HBITMAP修改后就是:
CPaintDC dc(this);
if(hBkBmp != NULL)
{
CDC mDC;
mDC.CreateCompatibleDC(&dc);
mDC.SelectObject(m_BkBmp);
dc.Bitblt(...);
}
else
{
//你上面的那一堆
}