hur.cn - 华软网

 热门搜索

两种动态加载位图的区别

  作者:未知    来源:网络    更新时间:2011/9/19
第一种:

对话框上放一个Picture控件,用类向导,将这个控件与CStatic m_bitmap关联起来



调用代码如下:


HBITMAP hOldBmp= m_bitmap.SetBitmap((HBITMAP)::LoadImage(NULL,"bitmap1.bmp",IMAGE_BITMAP, 0,0, LR_LOADFROMFILE));

DeleteObject(hOldBmp);


LoadImage函数的第一个参数 ,是NULL!!!



第二种:



没有用类向导,而是直接往对话框类中添加一个私有变量 m_static。

然后在对话框的OnInitDialog函数中 m_static.Create(....);



再SetBitmap以下

代码如下:


m_static.Create(_T(""),WS_CHILD|SS_BITMAP, CRect(0,0,100,100),this);

//创建之后,需要SetBitmap一下

HBITMAP hOldBmp=::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));


m_static.SetBitmap(hOldBmp );

m_static.ShowWindow(SW_SHOW);



注意LoadBitmap函数,这次没有用LoadImage函数,而是用LoadBitmap了,第一个参数是实例句柄,当我传NULL的时候,是无法显示位图的!1


???



再看最后一行代码,为什么不能再这里加上???



最重要的就是第二个问题 


为什么对于第二种,我加上 DeleteObject,果然么有显示,,,, 我郁闷死了

第一种却可以,SetBitmap后,立即DeleteObject
---华软 网友回答---
 第三个问题:




CStatic::Create

BOOL Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );


函数参数一共五个



CStatic是继承CWnd类的


CWnd的Create函数的超过五个!!!

CWnd::Create

virtual BOOL Create(
             LPCTSTR lpszClassName,
             LPCTSTR lpszWindowName,
             DWORD dwStyle,
             const RECT& rect,
             CWnd* pParentWnd,
             UINT nID,
             CCreateContext* pContext = NULL
             );

也就说说CStaic重载了Create了。。。。。。


为什么CStatic只能调用重载后,只有五个参数的Create函数,而不能调用继承的Create????


劳累大神解答一下 ,谢谢了啊



---华软网友回复---
  class="deleted_message"> 该回复于2011-09-19 12:27:35被版主删除
---华软网友回复---
没人啊 
---华软网友回复---
大牛呢
---华软网友回复---
LoadBitmap是从资源中加载位图,故需要实例句柄,而LoadImage是根据文件路径加载位图;


关联变量,采用的是DDX/DDV机制,在对话显示之前会调用UpdateData()更新数据。


这样用试试
m_static.CWnd::Create 

---华软网友回复---
用ddx/ddv机制的, 我SetBitmap后就 DeleteObject,毫无问题


而第二种: 定义变量,不采用ddx/ddv机制, 为什么我也模仿着第一种,SetBitmap后。立即DeleteObject

会导致出问题:; 无法看到图像

是不是对于动态,非ddx/ddv机制, 不能DeleteObject,或者说,不能再SetBitmap后,就DeleteObject


---华软网友回复---
DeleteObject 是api函数,而SetBitmap是 CStatic的 成员函数
---华软网友回复---
HBITMAP hOldBmp=::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
_static.SetBitmap(hOldBmp );

这里的hOldBmp是你正使用的位图句柄;


HBITMAP hOldBmp= m_bitmap.SetBitmap((HBITMAP)::LoadImage(NULL,"bitmap1.bmp",IMAGE_BITMAP, 0,0, LR_LOADFROMFILE));

DeleteObject(hOldBmp);
这里的hOldBmp是你以前使用的位图句柄,删除了当然没事.      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。