我现在学习CStatic控件,我在对话框的OK按钮里写了如下代码,生成一个CStatic显示图片; CStatic *pStatic = new CStatic;
pStatic->Create(_T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, 100, 100), this, 0x1100); CBitmap m_bitmap;
HBITMAP m_hmap;
m_hmap = (HBITMAP)LoadImage(NULL, _T("d:/123.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bitmap.Attach(m_hmap); CWnd *pWnd = GetDlgItem(0x1100);
CDC *pdc = pWnd->GetDC();
CDC memdc;
memdc.CreateCompatibleDC(NULL); memdc.SelectObject(&m_bitmap); pdc->BitBlt(0, 0, 95, 95, &memdc, 0, 0, SRCCOPY);但问题是 我一点击OK按钮,图片是显示出来了,同时确使对话框重画了,也就是onpaint()函数被执行了,瞬间图片就被刷新掉了。
请问我要怎么样处理,图片才会一直显示在对话框上呢?
pStatic->Create(_T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, 100, 100), this, 0x1100); CBitmap m_bitmap;
HBITMAP m_hmap;
m_hmap = (HBITMAP)LoadImage(NULL, _T("d:/123.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bitmap.Attach(m_hmap); CWnd *pWnd = GetDlgItem(0x1100);
CDC *pdc = pWnd->GetDC();
CDC memdc;
memdc.CreateCompatibleDC(NULL); memdc.SelectObject(&m_bitmap); pdc->BitBlt(0, 0, 95, 95, &memdc, 0, 0, SRCCOPY);但问题是 我一点击OK按钮,图片是显示出来了,同时确使对话框重画了,也就是onpaint()函数被执行了,瞬间图片就被刷新掉了。
请问我要怎么样处理,图片才会一直显示在对话框上呢?
不明白啊。
另外:
GetDC()后必须ReleaseDC否则会有内存泄漏
那就分开放,创建的部分放到OK按钮中,画图的部分放到OnPaint中
具体可以参阅此篇文章
http://blog.csdn.net/xianglitian/archive/2010/12/14/6075653.aspx
我如果把这句加上CDialog::OnPaint();就看不到图片;
如果把它去掉,图片就一直闪烁。
CStatic *pStatic = NULL; // 最后记得delete掉void CXXXDlg::OnOK()
{
// TODO: Add extra validation here
if(NULL == pStatic)
{
pStatic = new CStatic;
pStatic->Create(_T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, 100, 100), this, 0x1100);
}
}void CXXXDlg::OnPaint()
{
CPaintDC dc(this); // 下面的LoadImage完全可以放到OnInitDialog中去做,没有必要放到OnPaint中
CBitmap m_bitmap;
HBITMAP m_hmap;
m_hmap = (HBITMAP)LoadImage(NULL, _T("F:\\11.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bitmap.Attach(m_hmap);
CWnd *pWnd = GetDlgItem(0x1100);
if(pWnd && pWnd->GetSafeHwnd())
{
CDC *pdc = pWnd->GetDC();
CDC memdc;
memdc.CreateCompatibleDC(pdc);
CBitmap* pOldBitmap = (CBitmap*)memdc.SelectObject(&m_bitmap);
pdc->BitBlt(0, 0, 95, 95, &memdc, 0, 0, SRCCOPY);
memdc.SelectObject(pOldBitmap);
m_bitmap.DeleteObject();
memdc.DeleteDC();
pWnd->ReleaseDC(pdc);
}
}
1.继承CStatic类,自己重写OnPaint方法,在新继承类的OnPaint方法里面处理图片显示
2.在Dialog的OnPaint方法中处理图片显示,但要用CStatic窗口的DC来画。
CStatic *pStatic = new CStatic;
pStatic->Create(_T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, 100, 100), this, 0x1100);HBITMAP m_hmap = (HBITMAP)LoadImage(NULL, _T("d:/123.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
pStatic->SetBitmap(m_hmap);