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)的,
是我后来加进去的.
{
// 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)的,
是我后来加进去的.
请问是实现这个功能吗?还是其他的什么?
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
"SAMPLE.BMP",IMAGE_BITMAP,0,0,
LR_LOADFROMFILE ¦ LR_CREATEDIBSECTION);
这段代码中的"SAMPLE.BMP",IMAGE_BITMAP是什么意思,是装载进来的资源位图?
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
A CPaintDC object can only be used when responding to aWM_PAINT message, usually in your OnPaint message-handler member function.
书上就是这样写的
不会看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是什么意思,是已经引入的资源位图?
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.它们是图标和光标.
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);
}
}
}