CStatic的派生类画图怎么传递CBitmap数据进去呢?

wesleyluo 2011-03-15 05:27:02
我从CStatic派生了一个MyStatic类,并且定义了一个存储CBitmap数据的指针;
MyStatic.h中
public:
HBITMAP m_hbitmap;
CBitmap *m_bitmap;
void NextPic(CBitmap &bitmap);//我想通过这个方法实现显示下面一张图片
void NextPic(CBitmap &bitmap)代码:

m_bitmap = &bitmap;
Invalidate();

构造函数:

MyStatic::MyStatic()
{
m_bitmap = new CBitmap;
m_hbitmap = (HBITMAP)LoadImage(NULL, _T("d:/123.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bitmap->Attach(m_hbitmap);
if (NULL == m_bitmap->m_hObject)
{
MessageBox(_T("Load image fail."), _T("fail"), MB_OK);
}

}
void MyStatic::MyCreate(CRect &rect, CWnd *pWnd, int ID)
{
CStatic::Create(_T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP, rect, pWnd, ID);
}

然后在 OnPaint()里面画图;

CPaintDC dc(this);
CRect rect;
GetClientRect(rect);

CDC memDC;
memDC.CreateCompatibleDC(NULL);
memDC.SelectObject(m_bitmap);
//dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
dc.StretchBlt(0, 0, rect.Width()-2, rect.Height()-2, &memDC, 0, 0, rect.Width(), rect.Height(), SRCCOPY);


然后在对话框的OK按钮上new一个MyStatic对象出来,并创建;

void CCStaticBMPDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
CRect rect;
GetClientRect(rect);
CRect rect1(rect.left+3, rect.top + 3, rect.right -3, rect.bottom -40);
m_mystatic = new MyStatic();
m_mystatic->MyCreate(rect1, this, 0x1100);
}

现在我在Cancel按钮上重新加载一副图片;

void CCStaticBMPDlg::OnBnClickedCancel()
{
// TODO: Add your control notification handler code here
CBitmap m_bitmap;
HBITMAP m_hmap;
m_hmap = (HBITMAP)LoadImage(NULL, _T("d:/share/122.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bitmap.Attach(m_hmap);

m_mystatic->NextPic(m_bitmap);
//OnCancel();
}

点击OK按钮,第一幅图片显示出来了,但是点击Cancel按钮第二副图片没有显示????

我要怎么把CBitmap的数据传递到MyStatic里去并且通知它重画呢???
...全文
120 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
duguxianchen 2012-01-13
  • 打赏
  • 举报
回复
搞定了我
duguxianchen 2012-01-12
  • 打赏
  • 举报
回复
自己看看这个,或许有用:
StrFileName="data\\11.bmp";//我用的是全局变量。 data文件夹
CDC *pDC=GetDC();
CBitmap Bitmap;
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,StrFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
Bitmap.Attach(hBitmap);
CDC DCCompatible;
DCCompatible.CreateCompatibleDC(pDC);
DCCompatible.SelectObject(&Bitmap);
BITMAP bmInfo;
Bitmap.GetObject(sizeof(bmInfo),&bmInfo);
pDC->BitBlt(0,0,bmInfo.bmWidth,bmInfo.bmHeight, &DCCompatible, 0,0,SRCCOPY);
信阳毛尖 2011-04-08
  • 打赏
  • 举报
回复
在Onpaint绘图函数里面一次绘制完之后m_bitmap和设备上下文CDC都要释放掉

memDC.DeleteDC();
m_bitmap.DeleteObject();

GNU之歌 2011-04-08
  • 打赏
  • 举报
回复
应该第一次图片attach了之后没有detach,所以就这样的情况了

// Do we have a valid handle for the loaded image?
if (hBitmap)
{
// Delete the current bitmap
if (m_bmpBitmap.DeleteObject())
// If there was a bitmap, detach it
m_bmpBitmap.Detach();
// Attach the currently loaded bitmap to the bitmap object
m_bmpBitmap.Attach(hBitmap);
}
wesleyluo 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]
OnPaint的时候BitBlt出来即可。
[/Quote]
我上面那个代码已经可以把一张图片显示出来,但是这张图片是在MyStatic的构造函数里面加载的;

现在我想在外面获取一个CBitmap的数据,然后让MyStatic类画出来,也就是怎么把它传递给MyStatic类呢?
我上面的是在MyStatic里面定义一个CBitmap的指针,然后赋值给这个指针,但是不能显示出来啊.
我调试了下,到OnPaint函数里面,m_bitmap的值就变了,也就不是NextPic函数中传进去的值了???
healer_kx 2011-03-15
  • 打赏
  • 举报
回复
OnPaint的时候BitBlt出来即可。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧