VC编程心得.pdf
《VC编程心得.pdf》由会员分享,可在线阅读,更多相关《VC编程心得.pdf(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、VC编程心得1 在视类里显示东西ONDRAW(),在文档里显示东西用ONPAINT;2 以 AFX_ 开头的注释对是 ClassWizard 添加并管理的,用户不要对其进行任何修改,即使是注释也不要删除它们;3 UpdateData(TRUE);/更新控件变量,TRUE-从“控件”到“变量”传递;UpdateData(False)/更新对话框,FALSE从变量到控件;4pView-IsKindOf(RUNTIME_CLASS(CTgtDRTView)/IsKindOf判断运行时是否为我们自己定义的视图;5str.MakeLower();/转换成小写字母,void MakeUpper()转换成大
2、写字母;6BMP 格式:(m_lWidth*8)+31)/32*4,要能被 4 整除;BMP文件格式组成:文件头(14 字节)+信息头(40 字节)+调色板+图像数据(按行存放)BMP 像的描述信息Typedef struct tagBITMAPINFOHEADER/bmih DWORD biSize;/数据结构的尺寸LONG biWidth;/位图以像素为单位的宽LONG biHeight;/位图以像素为单位的高WORD biPlanes;/目标设备的平面数,必须为1 WORD biBitCount;/每一个色平面像素位数1、4 DWORD biCompression;/压缩类型 BI_RG
3、B,BI_REL4 DWORD biSizeImage;/图象以字节为单位的尺寸LONG biXPelsPerMeter;/x方向的分辨率 dpm LONG biYPelsPerMeter;/y方向的分辨率 dpm DWORD biClrUsed;/实际使用色彩数DWORD biClrImportant;/重要色彩数 BITMAPINFOHEADER24 位真彩色图象存储格式24 位真彩色图象格式在16 位编辑器(例如VC 编辑器)中打开,可以看到图象的二进制数据。24 位真彩色的二进制数据为:包括位图文件头、位图信息头和位图阵列三部分。1、位图文件头位图文件头用来记录文件大小的一些信息,在文
4、件中占14 个字节,存储的内容如下:字节1 2 3 4 5 6 7 8 9 10 11 12 13 14 000000 42 4D CC B4 02 00 00 00 00 00 36 00 00 00 其中:42 4D 为位图的标志,即 ASCII 码 BM CC B4 02 表示 位图文件的总字节数,换算成十进制为(CCB402)H=(177356)10,即这副图象的大小为177356 字节。00 00 00 00 为保留字节,用来存储文件大小的数据;36 00 00 00 00 表示位图阵列的起始位置,(36)H=(54)10即 54 字节开始为位图阵列。2、位图信息头位图信息头记录和位
5、图相关的一些信息,在文件中占40 个字节,存储的内容为:字节1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 000000 28 00 000016 00 00 2C 01 00 00 C5 00 00 00 01 00 18 00 00 00 000032 00 00 00 00 00 00 12 0B 00 00 12 0B 00 00 00 00 000048 00 00 00 00 00 00 其中:28 00 00 00 表示信息头的长度,(28)H=(40)10,即信息头占40 个字节;2C 01 00 00 表示位图宽度,单位为像素。(012C)H=(
6、300)10,即位图的宽度为300 个像素。C5 00 00 00 表示位图高度,单位为像素。(C5)H=(197)10,即位图的高度为197 个像素。01 00 表示位图设备级别18 00 位图级别,(0018)H=(24)10,即 24 位真彩色;00 00 00 00 表示压缩类型,为零表示不压缩;00 00 00 00 保留字节;12 0B 00 00 表示水平分辨率12 0B 00 00 表示垂直分辨率00 00 00 00 表示位图实际使用的颜色表中的颜色变址数00 00 00 00 表示位图显示过程中被认为重要颜色变址数。3、位图阵列位图阵列,即像素表示部分,每个像素点由3 个字
7、节的数据组成,按照从左到右的顺序,分别表示蓝色、绿色、红色。在 VC+中的 WINGDI.h中对于位图的编码和格式有更加详细的定义,下面给出24 位真彩色位图格式在VC+中的定义。Typedef struct tagBITMAPFILEHEADER/位图文件头WORD bfType;/位图标志:BM DWORD bfSize;/位图文件总字节数WORD bfReseaved1;WORD bfReseaved2;DWORD bfOffBits;BITMAPFILEHEADER;Typedef struct tagBITMAPINFOHEADER/位图信息头格式定义DWORD biSize;/位图
8、信息头占用字节数LONG biWidth;/位图图象宽度(以像素为单位)LONG biHeight;/位图图象高度(以像素为单位)WORD biplanes;/位图设备级别WORD biBitCount;/位图级别设定,每个像素所需要的位数,必须是1(双色),/4(16 色),8(256 色)或 24(真彩色)之一DWORD biCompression;/压缩类型DWORD biSizeImage;/位图阵列表字节数LONG biXPelsPerMeter;/水平分辨率LONG biYPelsPerMeter;/垂直分辨率DWORD biClrUsed;/位图实际使用的颜色表中的颜色变址数DW
9、ORD biClrImportant;/位图显示过程中被认为重要颜色变址数BITMAPINFOHEADER;Typedef struct tagRGBTRIPLE/位图阵列格式定义BYTE rgbBlue;/定义蓝色BYTE rgbGreen;/定义绿色BYTE rgbRed;/定义红色RGBTRIPLE;/构成一个3 字节的 RGBTRIPLE 灰度位图存储格式typedef struct tagBITMAPINFO /bmi BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors1;BITMAPINFO;灰度位图比24 位真彩色位图增加了一部分:颜色索引表
10、(RGBQUAD)。因此,灰度位图的像素阵列的起始位置不是第(36)H=(54)10个字节,而是第(436)H=(1078)10个字节,同时灰度位图用一个字节表示一个像素。这样,灰度位图的像素阵列小了三分之二。颜色索引表定义为:typedef struct tagRGBQUAD BYTE red;BYTE green;BYTE blue;BYTE null;tagRGBQUAD;在实际的编程中,读取数据的方式发生了变化,除了要读取文件头,文件信息头外,还要设置变量读取颜色索引表。除此以外,灰度图象的编程读取显示方式与位真彩色位图的方式完全相同。7字符格式:.f 符点数表示方法,例如要表示:4.
11、0 符点数,可以表示成:4.f;还有,在进行除法运算,3/2 时,结果是 1,但若写成:3/2.f,这时结果是 1.5。8HWNDGetDlgItem(intnID)const;/返回指定子窗口的句柄;HWND GetDlgItem(HWND hDlg,/handle of dialog box int nIDDlgItem /identifier of control);/返回指定子窗口中某一控件的句柄;9 /选中当前黑色画笔,并保存以前的画笔CGdiObject*pOldPen=pDC-SelectObject(pPenBlack);10 SetBkColor(:GetSysColor(C
12、OLOR_APPWORKSPACE);这里“:”代表 Windows API 函数(是 SDK函数,不是 MFC 函数),全局作用域,全局变量。与绘图有关的操作或信息DC 11在 Windows程序中,所谓的“设备环境(DC:Device Context)”就是一种电子画布;电子画笔被称为“GDI 对象(GDI Object)”。除画笔之外,GDI 对象还包括画刷、字体、位图和调色板等。应该说,GDI 对象就是那些可以用来在设备环境上绘图的工具。在 Windows程序中,一个设备环境只能拥有一种画笔、一种画刷和一种字体,也就是说,一个设备环境不能同时拥有同一类型的多个GDI 对象。CDC 12
13、在 MFC中,CDC类实现了对设备环境的封装。所有的绘图操作都必须通过一个CDC类(或其派生类)的对象来完成。CDC类提供了许多函数,可以完成各种与设备环境有关的操作,如选择GDI 对象、使用颜色与调色板、绘制图形、显示字体、设置设备环境的属性和坐标转换等。CDC类的派生类包括:CPaintDC 类、CClientDC 类、CWindowDC 类和 CMetaFileDC类。CDC为我们提供了四个输出文本的函数:TextOut、ExtTextOut、TabbedTextOut、DrawOut,分别用于不同的场合。如果想要绘制的文本需要支持Tab 符,那么采用TabbedTextOut 函数,可
14、以使绘制出来的文本效果更佳;如果需要在一个矩形区域内绘制多行文本,那么采用DrawOut 函数,会更富于效率;如果文本和图形结合紧密,字符间隔不等,并要求有背景颜色或矩形裁剪特性,那么ExtTextOut函数就将是最好的选择。如果没有什么特殊要求,那使用TextOut函数就显得简练多了。GDI 13在 MFC中,CgdiObject类封装了 GDI 对象。但是,用户几乎不直接使用CgdiObject类,而是使用该类的派生类(包括:Cpen 类、Cbrush 类、Cfont类、Cbitmap 类、Cpalette类和 Crgn 类)。其中,Crgn 类封装了GDI 区域,区域是窗口中特定的一块,
15、通常用来指定操作的范围,以免干扰其他不需要修改的区域。显示位图资源CRect rect;CDC hMemDC;GetClientRect(&rect);/获得客户窗口的大小 BITMAP Bmp;HBITMAP hbitmap=LoadBitmap(:AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_VIEW);/装入位图资源 hMemDC.CreateCompatibleDC(NULL);/创建内存设备上下文 SelectObject(hMemDC,hbitmap);/位图选入上下文中 GetObject(hbitmap,sizeof(BIT
16、MAP),(LPSTR)&Bmp);/获得位图大小 StretchBlt(dc.m_hDC,0,0,rect.right,rect.bottom,hMemDC,0,0,Bmp.bmWidth,Bmp.bmHeight,SRCCOPY);/显示位图 DeleteDC(hMemDC);/删除内存设备上下文 DeleteObject(hbitmap);/删除位图资源14&-按为与操作符&逻辑与操作符15 OnMouseMove(UINT nFlags,CPoint point)函数的参数 nFlags中包含了一些当前输入设备的信息,该参数可能取的标志为:MK_CONTROL 键盘的“Ctrl”键被按
17、下MK_LBUTTON 鼠标的左键被按下MK_MBUTTON 鼠标的中键被按下MK_RBUTTOM 鼠标的右键被按下MK_SHIFT 键盘的“Shift”键被按下16SelectObject()函数返回设备环境原来使用的GDI对象,通常情况下都要将该设备对象保存起来,在使用新的对象结束之后,再将原 GDI对象选进设备环境。这样做的目的是尽量恢复原设备环境的情形,用户在使用自己定制的GDI对象时一定要这样做。17SelectStockObject()函数调用系统预定义的GDI对象,一般不需要用SelectObject(pOldBrush)函数恢复设备环境原先的设置。18MFC 使用 COLORR
18、EF类型保存颜色信息,实际上是一个 32 位的值,但用户直接使用该类型可能不太方便,因此提供了 RGB 宏由三原色分量合成COLORREF值。定义一 COLORREF类型的变量,具体得到颜色信息的代码如下:/使用颜色选择对话框CColorDialog dlg;If(dlg.DoModal=IDOK)m_CurColor=dlg.GetColor();19 /使用 CWnd 成员函数 ModifyStyle实现标题栏的显示与隐藏/BOOL ModifyStyle(DWORD dwRemove,DWORD dwAdd,UINT nFlags=0);/参数 dwRemove 为希望去掉的窗口风格,0
19、/WS_CAPTION/参数 dwAdd为希望加上的窗口风格,0/WS_CAPTION/参数 nFlags 用于确定窗口的大小与位置,SWP_FRAMECHANGED 有关屏幕保护程序的知识从 Windows95开始,系统提供了屏幕保护程序。当系统有比较长的一段时间没有接收到用户的键盘或鼠标输入时,就会调用屏幕保护程序。屏幕保护程序的作用一是避免屏幕的荧光物质在过长时间段内显示静止图象时被灼伤,二是当用户暂时离开计算机时,为用户的敏感数据提供保护。屏幕保护程序的后缀名必须是“.scr”;系统在调用屏幕保护程序的时候附带有特定的参数,程序必须能够分析这些参数并作出相应的反应。1 MFC 应用程序
20、也将自己的初始化信息保存在系统注册表中,SetRegisterKey()函数就指定了保存信息的位置。应用程序的信息在系统注册表中的位置一般为:HKEY_CURRENT_USERsoftware SetRegisterKey()函数指定的是键名,一般都使用公司的名称;就是程序名称;条目名(section name);值名(value name)在对系统注册表进行写入操作时指定。“_T”宏的作用是将字符串转换为Unicode 格式,这是为了程序国际化的需要。用 C+进行注册表编程一、注册表简介注册表分为六大部分,其各部分功能如下:1、HKEY_CLASSES_ROOT该主键中包含了文件的扩展名和应
21、用程序的关联信息,以及Windows Shell 和 OLE 用于存储注册类表的信息。主键下的子键决定了如何在资源管理器 和 桌 面 中 显 示 该 类 文 件 及 其 图 标。它 不 是 一 个 单 独 的 分 支,它 实 际 上 是 从HKEY_LOCAL_MACHINESOFTWAREClasses映射过来的。2、HKEY_CURRENT_USER该主键包含了指向主键中当前用户的信息,如当前用户窗口信息、桌面设置信息、远程网络地址信息等。3、HKEY_LOCAL_MACHINE该主键包含了本地计算机关于软件和硬件的安装和配置信息,其中的信息与特定的用户无关,可供所有用户在登陆系统时使用。
22、4、HKEY_USERS该主键记录了当前Windows登陆用户的设置信息。用户每次登陆系统时,就在该主键下生成一个用户登陆名的子键,在该子键下保存该用户的桌面设置、背景位图、应用程序快捷键、显示字体等信息。5、HKEY_CURRENT_CONFIG该 主 键 记 录 了 机 器 当 前 的 硬 件 配 置 信 息,它 指 向HKEY_LOCAL_MACHINECONFIG结构中的某个子键信息。Windows NT 没有该主键。6、HKEY_DYN_DA TA 该主键保存一些实时动态的数据信息。这些动态数据在系统启动时生成,包括各个设备子系统启动时的状态和运行情况。硬件驱动程序常常要对该主键进行
23、操作。另外,在 Windows NT 操作系统中,还存在着HKEY_PERFORMANCE_DATA 主键,他集中管理一些实时的数据信息,如网络驱动程序等。二、C+对注册表编程的支持Registry 和 RegistryKey用于对注册表操作,这两个类都是密封类,不允许被其他类继承。1、Registry类Registry类中提供了7 个公有的静态域,分别代表Windows 注册表中的7 个基本主键,它们是:(1)Registry.ClassesRoot,对应于HKEY_CLASSES_ROOT 主键。(2)Registry.CurrentUser,对应于HKEY_CURRENT_USER主键。
24、(3)Registry.LocalMachine,HKEY_LOCAL_MACHINE(4)Registry.Users,HKEY_USERS(5)Registry.CurrentConfig,HKEY_CURRENT_CONFIG(6)Registry.DynDta,HKEY_DYN_DA TA(7)Registry.PerformanceData,HKEY_PERFORMANCE_DATA2、RegistryKey 类RegistryKey 类封装了对Windows 注册表的基本操作。这些操作必须符合系统提供的权限,否则不能完成指定的操作,程序将抛出一个异常。(1)创建子键创建子键的成员方
25、法的原型为:public RegistryKey CreateSubKey(string subkey);其中,参数subkey 表示要创建的子键的名字或子键的全路径名。如果创建成功,返回值就是被创建的子键,否则为null。(2)打开子键打开子键的成员方法原型为:public RegistryKey OpenSubKey(string name);public RegistryKey OpenSubKey(string name,bool writable);name 参数表示要打开的子键名称或全路径名,writable 参数表示被打开的主键是否可以被修改。第一个防范对打开的子键默认是只读的,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 编程 心得
限制150内