代码改变世界

Visual C++ 2011-4-15

2011-04-16 15:22  Clingingboy  阅读(696)  评论(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