代码改变世界

Visual C++ 2011-4-15

  Clingingboy  阅读(700)  评论(0编辑  收藏  举报

 

一.对话框创建步骤

  1. 创建一个资源对话框
  2. 创建一个继承自CDialog的类,关联资源对话框ID
  3. 借助Class Wizard来添加控件ID与实例关联,事件等

参考Visual c++ .net 第七章

二.CBitmapButton的用法

参考:http://www.cnblogs.com/qqingmu/archive/2007/09/06/884840.html

http://www.vckbase.com/document/viewdoc/?id=1834

两步:

  1. 设置控件属性Owner Draw为true
  2. 加载资源并关联控件
//CBitmapButton对象m_bmpBtn的LoadBitmaps函数加载程序内bmp资源。
m_bmpBtn.LoadBitmaps(IDB_BITMAP4,IDB_BITMAP5);
m_bmpBtn.SubclassDlgItem(IDC_TEST,this);//关联控件
m_bmpBtn.SizeToContent();

三.LoadImage

Loads an icon, cursor, animated cursor, or bitmap.

示例:

    hbm = (HBITMAP) ::LoadImage (NULL, "E:\\bt_down_center.bmp", IMAGE_BITMAP, 0, 0,
        LR_LOADFROMFILE|LR_CREATEDIBSECTION);//动态加载磁盘bmp文件

四.关联CBitmap和外部位图资源

CBitmap默认只能使用内部位图资源,太多的话,则会导致dll文件太大,如果要用外部资源的话则先用LoadImage 载入资源,然后用CGdiObject::Attach方法,把CBitmap与GDI对象HBITMAP关联起来,这样就可以用CBitmap对象来操作了.
使用完后记得用Detach方法释放关联

如下:

HBITMAP hBitmap;
hBitmap = (HBITMAP) ::LoadImage (NULL, lpszPathName,
    IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

if (hBitmap == NULL) {
    CString string;
    string.Format (_T ("%s does not contain a DIB"), lpszPathName);
    AfxMessageBox (string);
    return FALSE;
}

m_bitmap.Attach (hBitmap);

五.Owner draw

是有限定的,并非所有控件都可以,其还规定了Owner draw的行为和状态,CustomDraw则不同,想怎么样话就怎么画,不必遵守Owner draw的规则

/*
 * Owner draw control types
 */
#define ODT_MENU        1
#define ODT_LISTBOX     2
#define ODT_COMBOBOX    3
#define ODT_BUTTON      4
#if(WINVER >= 0x0400)
#define ODT_STATIC      5
#endif /* WINVER >= 0x0400 */

/*
 * Owner draw actions
 */
#define ODA_DRAWENTIRE  0x0001
#define ODA_SELECT      0x0002
#define ODA_FOCUS       0x0004

/*
 * Owner draw state
 */
#define ODS_SELECTED    0x0001
#define ODS_GRAYED      0x0002
#define ODS_DISABLED    0x0004
#define ODS_CHECKED     0x0008
#define ODS_FOCUS       0x0010

六.LRESULT,LPARAM,WPARAM

WPARAM表示16位,LPARAM和LRESULT均表示32位整型

参考:http://topic.csdn.net/t/20020529/20/763145.html

七.GDI的双缓冲(CreateCompatibleDC)

使用了CreateCompatibleDC(即拷贝原有DC的参数)、CreateCompatibleBitmap和BitBlt这几个函数,即创建一个DC,然后在DC中创建一个画板,画板创建好就开始画图,完成以后再将这个DC的数据拷贝到屏幕上显示.
双缓冲就是为了防止屏幕闪烁,去除没有必要的刷新,拥有2个DC,一个在前台呈现,一个在后台绘画,一直交互

参考:http://blog.csdn.net/livedeal/archive/2007/05/07/1598763.aspx

http://zhidao.baidu.com/question/149613341.html

http://blog.csdn.net/axes/archive/2005/04/19/353867.aspx

八.Visual C++ Control Demo

http://blog.csdn.net/axes/archive/2005/04/21/357691.aspx

九.动态链接库

即封装成dll给别的程序调用,没有.net这么简单.下面总结下.
导出方法有两种:
参考:http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792099.html
导出c++类的方法http://wenku.baidu.com/view/c216fa2c7375a417866f8f24.html

DLL有入口点DllMain函数

参考:http://blog.csdn.net/formerman/archive/2009/07/12/4341632.aspx

具体可参考书籍:Windows核心编程,Visual C++ for .net(第六版),Windows程序设计---基于Visual C++实现

十.MFC CBitmapButton+文字写入

当Button用了CBitmapButton后,文字将被盖住,所以要想办法重写文字

参考:http://blog.csdn.net/iceiilin/archive/2011/04/11/6316717.aspx

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2007-04-16 数据库连接方案比拼
2006-04-16 使用XmlSchemaSet验证
2006-04-16 学习Professional ASP.NET 2.0 XML(二)
2006-04-16 学习Professional ASP.NET 2.0 XML(一)
2006-04-16 asp.net2.0快速入门教程下载
点击右上角即可分享
微信分享提示