想实现,将一张150*150的BMP图片拼成10行10列,成为一个1500*1500的图,然后一次性的画到屏幕上
刚才坛子里一个朋友教了我一个方法
但图却画不来了,一片白。怎么回事呢?SIZE CScrollBmpTestDlg::DrawMem(CDC *memDC)
{
SIZE bmSize;
CDC hTempDC;
hTempDC.CreateCompatibleDC( memDC );
HBITMAP hBmpNew = (HBITMAP)LoadImage(AfxGetInstanceHandle(), "E:\\tablen.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if( hBmpNew != NULL )
{
HBITMAP hBmpOld = (HBITMAP)SelectObject(hTempDC, hBmpNew);
BITMAP bmInfo;
GetObject( hBmpNew , sizeof(BITMAP), &bmInfo );
bmSize.cx = bmInfo.bmWidth * 10;
bmSize.cy = bmInfo.bmHeight * 10;
int iX = 0;
int iY = 0;
for (int iRowIndex = 0; iRowIndex < 10; iRowIndex++)
{
for (int iColIndex = 0; iColIndex < 10; iColIndex++)
{
memDC->BitBlt(iX, iY, bmInfo.bmWidth, bmInfo.bmHeight, &hTempDC, 0, 0, SRCCOPY); iX += bmInfo.bmWidth;
} iX = 0;
iY += bmInfo.bmHeight;
} DeleteObject(hBmpNew);
hTempDC.DeleteDC();
}
return bmSize;
}void CScrollBmpTestDlg::OnPaint()
{
CClientDC dc(this);
m_dcMem.CreateCompatibleDC( &dc );
SIZE bmSize = DrawMem(&m_dcMem);
dc.BitBlt( 0, 0, bmSize.cx, bmSize.cy, &m_dcMem, 0, 0, SRCCOPY); CDialog::OnPaint();
}
刚才坛子里一个朋友教了我一个方法
但图却画不来了,一片白。怎么回事呢?SIZE CScrollBmpTestDlg::DrawMem(CDC *memDC)
{
SIZE bmSize;
CDC hTempDC;
hTempDC.CreateCompatibleDC( memDC );
HBITMAP hBmpNew = (HBITMAP)LoadImage(AfxGetInstanceHandle(), "E:\\tablen.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if( hBmpNew != NULL )
{
HBITMAP hBmpOld = (HBITMAP)SelectObject(hTempDC, hBmpNew);
BITMAP bmInfo;
GetObject( hBmpNew , sizeof(BITMAP), &bmInfo );
bmSize.cx = bmInfo.bmWidth * 10;
bmSize.cy = bmInfo.bmHeight * 10;
int iX = 0;
int iY = 0;
for (int iRowIndex = 0; iRowIndex < 10; iRowIndex++)
{
for (int iColIndex = 0; iColIndex < 10; iColIndex++)
{
memDC->BitBlt(iX, iY, bmInfo.bmWidth, bmInfo.bmHeight, &hTempDC, 0, 0, SRCCOPY); iX += bmInfo.bmWidth;
} iX = 0;
iY += bmInfo.bmHeight;
} DeleteObject(hBmpNew);
hTempDC.DeleteDC();
}
return bmSize;
}void CScrollBmpTestDlg::OnPaint()
{
CClientDC dc(this);
m_dcMem.CreateCompatibleDC( &dc );
SIZE bmSize = DrawMem(&m_dcMem);
dc.BitBlt( 0, 0, bmSize.cx, bmSize.cy, &m_dcMem, 0, 0, SRCCOPY); CDialog::OnPaint();
}
{
CClientDC dc(this);
m_dcMem.CreateCompatibleDC( &dc );
SIZE bmSize = DrawMem(&m_dcMem);
dc.BitBlt( 0, 0, bmSize.cx, bmSize.cy, &m_dcMem, 0, 0, SRCCOPY); CDialog::OnPaint();
}
我DC是CClientDC dc(this);
就是想直接画在对话框上
哪里错了呢?
LoadImage返回什么,
如果都没问题,检查DC
DC怎么检查啊
我的DC就是对话框的啊CClientDC dc(this);
根本没什么噱头
void CScrollBmpTestDlg::OnPaint()
{
CDC * pDC = pDC = this->GetDC(); //得到对话框的DC
if ( NULL == pDC )
return;
m_dcMem.CreateCompatibleDC( pDC );
SIZE bmSize = DrawMem(&m_dcMem);
pDC->BitBlt( 0, 0, bmSize.cx, bmSize.cy, &m_dcMem, 0, 0, SRCCOPY); CDialog::OnPaint();
}
但还是一样。
我超级晕。
你把参数直接改成你的dc试试
void CScrollBmpTestDlg::OnPaint()
{
CClientDC dc(this);
SIZE bmSize = DrawMem(&dc);
dc.BitBlt( 0, 0, bmSize.cx, bmSize.cy, &m_dcMem, 0, 0, SRCCOPY);
CDialog::OnPaint();
}
那你用一个内存DC也就足够了啊,你在一个内存DC里面移动,都移好了,再一次性bitblt出来不就可以了么。
感觉你的代码好别扭。
难道不需要BitBlt么?
{
SIZE bmSize; CDC hTempDC;
hTempDC.CreateCompatibleDC( pDC);
HBITMAP hBmpNew = (HBITMAP)LoadImage(AfxGetInstanceHandle(), "E:\\tablen.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if( hBmpNew != NULL )
{
HBITMAP hBmpOld = (HBITMAP)SelectObject(hTempDC, hBmpNew);
BITMAP bmInfo;
GetObject( hBmpNew , sizeof(BITMAP), &bmInfo );
bmSize.cx = bmInfo.bmWidth * 10;
bmSize.cy = bmInfo.bmHeight * 10; m_dcMem.CreateCompatibleDC( pDC );
CBitmap tempBitmap;
tempBitmap.CreateCompatibleBitmap(pDC,bmSize.cx,bmSize.cy);
m_dcMem.SelectObject(&tempBitmap);
int iX = 0;
int iY = 0;
for (int iRowIndex = 0; iRowIndex < 10; iRowIndex++)
{
for (int iColIndex = 0; iColIndex < 10; iColIndex++)
{
m_dcMem.BitBlt(iX, iY, bmInfo.bmWidth, bmInfo.bmHeight, &hTempDC, 0, 0, SRCCOPY); iX += bmInfo.bmWidth;
} iX = 0;
iY += bmInfo.bmHeight;
} DeleteObject(hBmpNew);
hTempDC.DeleteDC();
}
return bmSize;
}void CScrollBmpTestDlg::OnPaint()
{
CClientDC dc(this);
SIZE bmSize = DrawMem(&dc);
dc.BitBlt( 0, 0, bmSize.cx, bmSize.cy, &m_dcMem, 0, 0, SRCCOPY); CDialog::OnPaint();
}
这样子呢?没有源代码,否则应该能简单调试通过
问题出在这里:
m_dcMem.CreateCompatibleDC( pDC );
CBitmap tempBitmap;
tempBitmap.CreateCompatibleBitmap(pDC,bmSize.cx,bmSize.cy);
m_dcMem.SelectObject(&tempBitmap);
要给内存DC选入位图才行。
{
CClientDC dc(this);
m_dcMem.CreateCompatibleDC( &dc );
SIZE bmSize = DrawMem(&m_dcMem);
dc.BitBlt( 0, 0, bmSize.cx, bmSize.cy, &m_dcMem, 0, 0, SRCCOPY); CDialog::OnPaint();
}