void CMyDlg::OnButton1(CPaintDC& dc) 
{
// TODO: Add your control notification handler code here
HBITMAP bitmap;
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
"SAMPLE.BMP",IMAGE_BITMAP,0,0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
ASSERT(bitmap);
HBITMAP OldBitmap;
CDC MemDC;CRect rect;
MemDC.CreateCompatibleDC(&dc);
GetClientRect(rect);
OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
dc.BitBlt(20,20,rect.Width() -20,rect.Height() -20,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
}
上面这段程序,我是在一个对话框上添加了一个按钮消息处理函数,写入上面的代码,想显示图片
运行没错,但是一点按钮就出错,叫我重试,或者停止,或者忽略.
请问是怎么回事啊?哪里错了吗?
void CMyDlg::OnButton1(CPaintDC& dc)中起先没有(CPaintDC& dc)的,
是我后来加进去的.

解决方案 »

  1.   

    在对话框上.请问上面的代码是"点按钮,然后打开浏览,然后选择需要的图片,然后就显示在对话框上"
    请问是实现这个功能吗?还是其他的什么?
    bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(), 
    "SAMPLE.BMP",IMAGE_BITMAP,0,0, 
    LR_LOADFROMFILE  ¦ LR_CREATEDIBSECTION); 
    这段代码中的"SAMPLE.BMP",IMAGE_BITMAP是什么意思,是装载进来的资源位图?
      

  2.   

    HANDLE LoadImage(          HINSTANCE hinst,
        LPCTSTR lpszName,
        UINT uType,
        int cxDesired,
        int cyDesired,
        UINT fuLoad
    );lpszName:Specifies the image to load. 
    uType:Specifies the type of image to be loaded. 具体信息参看MSDN
      

  3.   

    看MSDN上的
    A CPaintDC object can only be used when responding to aWM_PAINT message, usually in your OnPaint message-handler member function.
      

  4.   

    这程序是我从书上抄的
    书上就是这样写的
    不会看MSDN,上面都是英文,看不懂.
    请问:1."void CMyDlg::OnButton1(CPaintDC& dc)中起先没有(CPaintDC& dc)的, 
           是我后来加进去的."
           对于这句话,如果(CPaintDC& dc)不是加进去的,那么怎么在开始对OnButton1
           编程的时候把(CPaintDC& dc)设置好,在哪里设置呢?2.bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(), 
     "SAMPLE.BMP",IMAGE_BITMAP,0,0, 
     LR_LOADFROMFILE  ¦ LR_CREATEDIBSECTION); 
     这段代码中的"SAMPLE.BMP",IMAGE_BITMAP是什么意思,是已经引入的资源位图?
      

  5.   

    可以用下面的方法:
    class CMyDlg : public CDialog
    {
        ...
        HDC m_hMemDC;
        HBITMAP m_hBitmap, m_hOldBitmap;
        ...
    };CMyDlg::CMyDlg()
    {
        ...
        m_hMemDC = NULL;
        m_hBitmap = NULL;
        m_hOldBitmap == NULL;
        ...
    }void CMyDlg::OnButton1()
    {
        if( m_hBitmap != NULL )
        {
            DeleteObject(m_hBitmap);
            m_hBitmap == NULL;
        }
        if( m_hMemDC != NULL )
        {
            ReleaseDC(m_hMemDC);
            m_hMemDC = NULL;
        }
        m_hBitmap = (HBITMAP)LoadImage(AfxGetInstancehandle(), _T("Sample.bmp"),
            IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
        ASSERT(m_hBitmap);
        m_hMemDC = CreateCompatibleDC(::GetDC(m_hWnd));
        ASSERT(m_hMemDC);
        m_hOldBitmap = (HBITMAP)SelectObject(m_hBitmap);
    }
    然后在OnPaint或OnEraseBkgnd调用BitBlt.
    最后记得释放m_hBitmap和m_hMemDC."Sample.bmp"的意思是图片从文件加载.(用了LR_LOADFROMFILE)
    至于IMAGE_BITMAP是加载位图,其他的是IMAGE_ICON, IMAGE_CURSOR.它们是图标和光标.
      

  6.   

    不怕不会,就怕装会。你都没搞明白怎么回事儿就乱改,出错也是必然的。很简单,按钮响应函数中只需要进行加载(LoadImage)和刷新(Invalidate)的操作,绘图放在OnPaint()中进行。加载的位图句柄保存在类的成员变量中,如果要重复使用在加载前先销毁:
    class CMyDlg : public CDialog
    {
        CBitmap m_Bitmap;
    ...
    }
    void CMyDlg::OnBnClickedButton1() // 向导添加的按钮消息应该是这样的,显然你自己乱改过了

        // TODO: Add your control notification handler code here
        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, _T("SAMPLE.BMP"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ¦ LR_CREATEDIBSECTION); 
        ASSERT(hBitmap); 
        if (hBitmap)
        {
            m_Bitmap.DeleteObject();
            m_Bitmap.Attach(hBitmap);
            Invalidate();
        }
    }void CMyDlg::OnPaint()
    {
        if (...)
        {
        }
        else
        {
            CPaintDC dc(this);
            if (m_Bitmap.GetSafeHandle())
            {
                CDC MemDC;
                MemDC.CreateCompatibleDC(&dc);
                CBitmap* pOldBmp = MemDC.SelectObject(&m_Bitmap);
                BITMAP bmp;
                m_Bitmap.GetBitmap(&bmp); // BitBlt的参数必须不能超过位图原有大小,因此有必要获取位图的大小;要缩放使用StretchBlt函数。
                dc.BitBlt(20, 20, bmp.bmWidth, bmp.bmHeight, &MemDC, 0, 0, SRCCOPY);
                MemDC.SelectObject(pOldBmp);
            }
        }