想实现,将一张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();
}

解决方案 »

  1.   

    DrawMem你在哪调用的呢?传入的参数怎么取的?
      

  2.   

    DrawMem是在OnPaint()里调用的啊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();
    }
      

  3.   

    DC错了?
    我DC是CClientDC dc(this);
    就是想直接画在对话框上
    哪里错了呢?
      

  4.   

    你把CDialog::OnPaint();去了试试?
      

  5.   

    看下AfxGetInstanceHandle()返回什么
    LoadImage返回什么,
    如果都没问题,检查DC
      

  6.   

    都没问题啊
    DC怎么检查啊
    我的DC就是对话框的啊CClientDC dc(this); 
    根本没什么噱头
      

  7.   

    那你再把CDialog::OnPaint();放到OnPaint的一开始试试?
      

  8.   

    我改了下
    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();
    }
    但还是一样。
      

  9.   

    在你的DrawMem函数中,你的参数memDC已经是一个内存DC了,你还再创建一个hTempDC干毛用的?
    我超级晕。
    你把参数直接改成你的dc试试
      

  10.   


    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();
    }
      

  11.   

    还是直接DrawMem里面的那段代码换放到OnPaint里,hTempDC换成m_dcMem,memDC 换成dc
      

  12.   


    那你用一个内存DC也就足够了啊,你在一个内存DC里面移动,都移好了,再一次性bitblt出来不就可以了么。
    感觉你的代码好别扭。
      

  13.   

    怎么移动?
    难道不需要BitBlt么?
      

  14.   

    SIZE CScrollBmpTestDlg::DrawMem(CDC *pDC)
    {
        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();
    }
    这样子呢?没有源代码,否则应该能简单调试通过
      

  15.   

    现在出来了吗?
    问题出在这里:
     m_dcMem.CreateCompatibleDC( pDC );
            CBitmap tempBitmap;
        tempBitmap.CreateCompatibleBitmap(pDC,bmSize.cx,bmSize.cy);
        m_dcMem.SelectObject(&tempBitmap);
    要给内存DC选入位图才行。
      

  16.   

    楼主,你再把你的OnPaint函数改成这样试试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();
    }
      

  17.   

    按照happyparrot的方法是可以实现的了!