VC++编程技巧20法
- 格式:doc
- 大小:92.00 KB
- 文档页数:52
coding技巧
在编程中,有很多技巧可以提高效率,减少错误,并使代码更加整洁和易于理解。
以下是一些常见的编码技巧:
1. 注释:适当地在代码中添加注释可以帮助其他人理解你的代码是如何工作的。
同时,注释也可以帮助你在回顾代码时更好地理解你当时是如何思考的。
2. 变量命名:使用有意义的变量名可以使代码更易于理解。
避免使用单个字母或无意义的缩写。
3. 函数和方法:将代码分解为函数和方法可以使代码更易于管理和重用。
每个函数或方法应该有一个清晰定义的任务。
4. 错误处理:在代码中添加错误处理可以帮助你更好地理解可能出现的问题,并使你的程序更健壮。
5. 代码复用:避免重复的代码。
如果一段代码在多个地方被使用,考虑将其提取为一个函数或方法。
6. 数据结构和算法:了解和使用适当的数据结构和算法可以使你的代码更高效。
7. 测试:编写单元测试可以帮助你确保你的代码按预期工作,并在修改代码时不会破坏现有功能。
8. 版本控制:使用版本控制系统(如Git)可以帮助你跟踪代码的更改,并回滚到以前的版本,如果需要的话。
9. 文档:编写清晰的文档可以帮助其他人理解你的代码,并知道如何使用它。
10. 简洁性:尽量使代码简洁,避免不必要的复杂性。
如果一段代码可以被简化,那么就简化它。
以上是一些基本的编程技巧,但还有很多其他的技巧和工具可以帮助你成为一个更好的程序员。
最重要的是不断学习和实践,通过不断地编写代码来提高你的技能。
C语言程序设计主讲教师:马驰Email:teacher_ma@本课程讲述如何使用C语言进行真正的编程。
C 语言是目前软件开发者们最主要的编程语言。
这也是它受到广泛传播并且成为标准的原因。
本课程将侧重学习一个具体问题的算法化的过程。
本课程还将学习在实际编程过程中应该掌握的基本技巧。
以及用C编程的风格和艺术。
要写出一个好的程序,不仅仅是敲一些代码,功能正确。
还应该简单易读。
在学习的示例中,我们强调的是简单、实用的原则。
本课程是如何组织的?第一部分基础第二部分简单程序设计第三部分高级程序设计算法概念、编程原理、编程风格、基本数据类型定义、算术运算符及表达式顺序结构、选择结构、循环结构、数组的定义及应用、程序设计过程函数、变量的存储类别、指针、结构体与共用体、文件·计算机与程序·计算机中的数据·程序设计由程序控制计算机完成人们想做的工作。
由0/1代码组成的二进制数,也可以表示为十六进制数和八进制数。
在20世纪80年代,结构化的程序设计是最主要、最通用的程序设计方法。
程序=数据结构+算法在编写一个程序中,需要对两个方面进行描述:(1)对数据的描述(数据流):指定数据的类型和数据的结构。
(不同的语言对数据的定义不同,我们将学习C语言的数据类型和数据结构)(2)对操作的描述(控制流):要指定操作的步骤,既算法。
(算法具有通用性,脱离于语言之外,是程序设计的灵魂)什么是算法(Algorithm)?就是为了解决一个特定的问题而采取的确定的、有限的、按照一定次序进行的、缺一不可的执行步骤。
在计算机能执行的算法就是计算机算法。
计算机算法可以分成两大类:数值运算算法和非数值运算算法。
注意:为了有效地利用计算机解决实际问题,在设计算法时不仅要保证计算机执行算法的正确性,还要考虑算法的质量,选择适合于具体问题的算法。
例1:猴子吃桃问题。
有一堆桃子不知数目,猴子第一天吃掉一半并多吃了一个,第二天照此方法,吃掉剩下桃子的一半加一个,天天如此,到第十天早上,猴子发现只剩一只桃子了,问这堆桃子原来有多少个?算法写成:(1)a1=1{第10天的桃子数,A1的初始值};i=9{计数器的初值为9};(2)a0=2*(A1+1){计算当天的桃子数};(3)a1=a0;{将当天的桃子数作为下一次计算的初值};(4)i=i-1;(5)若i>=1,继续循环执行(2);(6)输出A0的值。
用Visual C++显示位图的原理与方法(同名26600)一、介绍在VC++环境下显示位图并不是什么新技术,但本文仍然在此“老调重弹”的原因是:(1)这一技术十分重要,它是图像编程的基础,掌握不了这些基本原理也就很难独立开发出符合实际需要的应用程序;(2)许多关于VC++编程的资料都提供了显示位图(Bitmap)的实例,但遗憾的是,由于侧重点的不同使得有关调色板、设备上下文(DC)以及图形设备接口(GDI)等与位图密切相关的知识要么是很少提到,要么就是很不全面、一代而过,或者部分内容被放到了别处,显得支离破碎。
这使得许多读者在模仿这些例子“克隆”出自己的应用程序后,仍感到有许多不解之处存在;(3)为了显示位图,Windows 及MFC提供了一些类和函数供我们利用,熟悉它们的作用对我们编程很有帮助。
二、基本概念与原理调色板:调色板的概念必须首先介绍,它在除24位真彩色显示系统的其它系统中都要用到。
尽管多媒体技术的发展令计算机所能显示的色彩越来越绚丽缤纷,但实际上,自然界无限种类的颜色目前仍无法在计算机上完全表达出来。
现在最高级的所谓24位“真彩色”的显示系统也只能显示既16,777,216种颜色,当然,这已经完全够用了,因为人眼还没有能力区分真彩色系统表现出的颜色与大自然中实际颜色的区别。
在这种系统中,每一个像素的值都用红(R)、绿(G)、蓝(B)三色,每色8位共24位来表示,“24位”显示系统的名字也由此而来,所以,其像素值就是要显示的颜色值,显然,此时只需要直接显示就行了,而不需要调色板。
但对于目前许多4位(16色)或8位(256色)显示系统来说,其像素值与颜色值并不一一对应,此时,调色板技术被派上了用场。
调色板的定义如下:它是在16色或256色显示系统中,由图像中出现最频繁的16或256种颜色组成的颜色表。
它依靠有限种颜色通过组合来实现其它颜色。
若某幅图像是使用调色板的话,那它的像素值就表示颜色在调色板查找表中的索引号,而不是颜色值。
VC++是微软公司开发的一个集成开发环境,换句话说,就是使用c++的一个开发平台.VC++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性,并且还要掌握MFC、ATL、COM等的知识,难度比较大。
Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC是一个主流的开发平台,VC++不是一门语言,可以把C++看作为一种“工业标准”,而VC++则是某种操作系统平台下的“厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。
VC++是在Windows平台下开发VC++应用程序,VC++应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC 相对于WIN API开发更具备效率优势,但为了对WINDOWS开发有一个较为全面细致的认识,笔者在这里还是以讲解WIN API的相关内容为主线。
首先VC是一个软件(IDE集成开发环境)(编译、编辑、调试)WindowsSDK(软件开发工具)VC的灵魂:MFC(微软基础类库)ATL(ActiveX模板类库)其他的SDK,如OpenGL,DirectX,ActiveMoive,DrawDib(WinG)VC需要掌握的东西:1、养成一种严谨的软件开发习惯,熟悉软件工程的基本原则。
2、C语言基础3、C++最基本内容:类、继承性、封装性、多态性的概念4、如何用向导建立一个程序框架5、设计菜单6、设计工具条7、设计和使用对话框,熟悉最常用的对话框控件:按钮、静态文本、编辑框等8、知道怎样新建类、成员函数、成员变量、消息处理函数。
9、了解最常用的Windows消息:如WM_PAINT(重绘窗口),鼠标按下、弹起、移动,初始化对话框等。
用VC++编写USB接口通讯程序摘要:详细介绍Visual C++ 6.0环境下利用Windows API(Application Program Interface)函数来实现与符合HID设备类的USB接口通讯,并给出了通信程序的部分代码。
关键词:通用串行总线人际接口设备API VisualC++1 引言在USB出现之前,计算机的典型接口有并行口(打印口)、串行口、鼠标口、键盘口、显示器口、游戏口及各种卡式接口(如声卡、网卡)等,与这些接口对应的有各种不同的电缆。
在传输速度方面,这些接口都存在速度偏低的问题;在技术方面,这种设计容易产生I/O冲突。
中断(IRQ)不够用,以及对于每一种新的外设都必须设计新的接口卡等缺点。
当今的计算机外部设备,都在追求高速度和高通用型。
USB接口适应了这种要求,并以其速度快,使用方便,成本低等优点,迅速得到了众多PC厂商和半导体厂商的大力支持,外设向USB过渡称为必然的趋势。
但如果主机PC不知道如何与USB外设通信,那么这个USB外设一点用处都没有,人机接口设备(HID)类是Windows完全支持的第一批USB设备类型中的一种。
在运行Windows98或更高版本的PC机上,应用程序可以使用操作系统内置的驱动与HID通信,但与HID通信不像打开一个端口,设定几个参数,然后就可以读写数据那么简单。
在应用程序能与HID交换数据之前,它先要找到设备,获取有关它的报告信息,为做到这些,应用程序必须通过访问通信API函数,使位于上层的应用程序与位于下层的设备驱动程序进行数据交换。
应用程序可以使用任何能访问API函数的编程语言,C++是一种能访问API函数的功能强大的语言,本文将在VisualC++6.0环境下编写与USB设备通信的Windows程序。
2 USB简介USB是由Intel,Compaq,Digital,IBM,Microsoft,NEC,Northern Telecom等七家世界著名的计算机和通信公司共同推出的新一代接口标准,全称为Universal Serial Bus(通用串行总线)。
匈牙利命名法是一种编程时的命名规范。
基本原则是:变量名=属性+类型+对象描述。
其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。
命名要基于容易记忆容易理解的原则。
目前在Windows程序开发和MFC程序开发中常用的命名规则是匈牙利命名法。
下面就是HN命名法的一般规则。
属性部分全局变量g_const常量c_c++类成员变量m_静态变量s_类型部分指针p函数fn无效v句柄h长整型l布尔b浮点型(有时也指文件) f双字dw字符串sz短整型n双精度浮点d计数c(通常用cnt)字符ch(通常用c)整型i(通常用n)字节by字w实型r无符号u描述部分最大Max最小Min初始化Init临时变量T(或Temp)源对象Src目的对象Dest这里顺便写几个例子:(1) hwnd :h 是类型描述,表示句柄,wnd 是变量对象描述,表示窗口,所以hwnd 表示窗口句柄;(2) pfnEatApple :pfn 是类型描述,表示指向函数的指针,EatApple 是变量对象描述,所以它表示指向EatApple 函数的函数指针变量。
(3) g_cch :g_ 是属性描述,表示全局变量,c 和ch 分别是计数类型和字符类型,一起表示变量类型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。
小结:匈牙利命名法MFC、句柄、控件及结构的命名规范Windows类型样本变量MFC类样本变量HWND hWnd;CWnd* pWnd;HDLG hDlg;CDialog* pDlg;HDC hDC;CDC* pDC;HGDIOBJ hGdiObj;CGdiObject* pGdiObj;HPEN hPen;CPen* pPen;HBRUSH hBrush;CBrush* pBrush;HFONT hFont;CFont* pFont;HBITMAP hBitmap;CBitmap* pBitmap;HPALETTE hPaltte;CPalette* pPalette;HRGN hRgn;CRgn* pRgn;HMENU hMenu;CMenu* pMenu;HWND hCtl;CState* pState;HWND hCtl;CButton* pButton;HWND hCtl;CEdit* pEdit;HWND hCtl;CListBox* pListBox;HWND hCtl;CComboBox* pComboBox;HWND hCtl;CScrollBar* pScrollBar;HSZ hszStr;CString pStr;POINT pt;CPoint pt;SIZE size;CSize size;RECT rect;CRect rect;一般前缀命名规范前缀类型实例C 类或结构CDocument,CPrintInfom_ 成员变量m_pDoc,m_nCustomers变量命名规范前缀类型描述实例ch char 8位字符chGradech TCHAR 如果_UNICODE定义,则为16位字符chNameb BOOL 布尔值bEnablen int 整型(其大小依赖于操作系统)nLengthn UINT 无符号值(其大小依赖于操作系统)nHeightw WORD 16位无符号值wPosl LONG 32位有符号整型lOffsetdw DWORD 32位无符号整型dwRangep * 指针pDoclp FAR* 远指针lpszNamelpsz LPSTR 32位字符串指针lpszNamelpsz LPCSTR 32位常量字符串指针lpszNamelpsz LPCTSTR 如果_UNICODE定义,则为32位常量字符串指针lpszName h handle Windows对象句柄hWndlpfn callback 指向CALLBACK函数的远指针资源类型命名规范前缀符号类型实例范围IDR_ 不同类型的多个资源共享标识IDR_MAIINFRAME 1~0x6FFFIDD_ 对话框资源IDD_SPELL_CHECK 1~0x6FFFHIDD_ 对话框资源的Help上下文HIDD_SPELL_CHECK 0x20001~0x26FF IDB_ 位图资源IDB_COMPANY_LOGO 1~0x6FFFIDC_ 光标资源IDC_PENCIL 1~0x6FFFIDI_ 图标资源IDI_NOTEPAD 1~0x6FFFID_ 来自菜单项或工具栏的命令ID_TOOLS_SPELLING 0x8000~0xDFFF HID_ 命令Help上下文HID_TOOLS_SPELLING 0x18000~0x1DFFFIDP_ 消息框提示IDP_INVALID_PARTNO 8~0xDEEFHIDP_ 消息框Help上下文HIDP_INVALID_PARTNO 0x30008~0x3DEFF IDS_ 串资源IDS_COPYRIGHT 1~0x7EEFIDC_ 对话框内的控件IDC_RECALC 8~0xDEEFMicrosoft MFC宏命名规范名称类型_AFXDLL 唯一的动态连接库(Dynamic Link Library,DLL)版本_ALPHA 仅编译DEC Alpha处理器_DEBUG 包括诊断的调试版本_MBCS 编译多字节字符集_UNICODE 在一个应用程序中打开UnicodeAFXAPI MFC提供的函数CALLBACK 通过指针回调的函数库标识符命名法标识符值和含义u ANSI(N)或Unicode(U)d 调试或发行:D = 调试;忽略标识符为发行。
VC6讲座一VC简介与安装“到底是学VC,还是学VB呢?”相信不少朋友在学习Windows编程之前都曾经想过这个问题,并一度感到难以取舍。
心铃认为,Visual C++和Visual Basic都是非常优秀的可视化编程工具,刚刚涉及Windows编程的朋友选择VB可以很快上手,而有一定C/C++和Windows编程基础的朋友可能会更喜欢VC一些。
虽然学习和使用VC需要付出更大一些的工作量,但是掌握了VC 编程后,可以加深我们对Windows系统及其使用的各种技术的理解,所以心铃决定继VB和VFP 讲座之后,再次带领有兴趣学习VC的朋友开始一趟VC之旅。
在出发之前,心铃建议朋友们准备一点干粮和水(事先应掌握一些C/C++和Windows编程方面的基础知识),不过即使带少了或者路途中间出现什么问题也没有关系,相信在VC这个大家庭中处处都有温情在,《软件报》事先已经向大家介绍了很多可以休息和加油的VC驿站,另外心铃信箱也已经准备好了为大家提供必要的帮助。
·VC简介大家是否知道,作为一种C/C++语言的集成开发环境(IDE),产生VC的最早的根源其实要追溯到DOS时代的Borland公司,当初Borland公司开发的Turbo Pascal和Turbo C让程序员们深刻感受到了把编辑器和编译器集成在一起的IDE是多么的方便,微软也看到了这一优点,于是相继开发了Quick C和Microsoft C/C++等多个DOS版本的C/C++集成开发工具。
随着Windows的不断成熟,微软决定放弃DOS下的开发工作,正式推出了Windows下的V isual C++ 1.0,早期的VC功能并不什么强大,使用起来也不方便,1.0版和1.5版都是16位编程工具。
VC的革命性改变得益于Windows 95的推出,从VC 2.0开始,微软又放弃了16位编程,以后的VC都只用于32位编程开发,为了与MFC类库的版本号保持一致,微软跳过了版本3,直接推出VC 4.0,这个版本及修订版4.2的部分界面风格一直被保留到最新的VC 6.0中。
VC++编程技巧20法 1. 如何激活当前屏幕保护程序 // 激活当前屏幕保护程序, jingzhou xu PostMessage(WM_SYSCOMMAND,SC_SCREENSAVE,0);
2. 如何禁止/启用屏幕保护及电源管理 static UINT dss_GetList[] = {SPI_GETLOWPOWERTIMEOUT, SPI_GETPOWEROFFTIMEOUT, SPI_GETSCREENSAVETIMEOUT};
static UINT dss_SetList[] = {SPI_SETLOWPOWERTIMEOUT, SPI_SETPOWEROFFTIMEOUT, SPI_SETSCREENSAVETIMEOUT};
static const int dss_ListCount = _countof(dss_GetList); 禁止屏幕保护及电源管理 { m_pValue = new int[dss_ListCount]; for (int x=0;x{ // 禁止屏幕保护及电源管理 VERIFY(SystemParametersInfo (dss_SetList[x], 0, NULL, 0)); } delete[] m_pValue; }
启用屏幕保护及电源管理 { m_pValue = new int[dss_ListCount]; for (int x=0;x{ //启用屏幕保护及电源管理 VERIFY(SystemParametersInfo (dss_SetList[x], m_pValue[x], NULL, 0)); } delete[] m_pValue; }
3. 如何激活和关闭IE浏览器 //激活并打开IE void lounchIE() { HWND h=FindWindowEx(NULL,NULL,NULL, "Microsoft Internet Explorer") ; ShellExecute(h,"open","C:\\simple.html", NULL,NULL,SW_SHOWNORMAL);
} //关闭IE及其它应用 void CloseIE() { int app=BSM_APPLICATIONS; unsigned long bsm_app=(unsigned long )app; BroadcastSystemMessage(BSF_POSTMESSAGE,&bsm_app, WM_CLOSE,NULL,NULL); }
4. 如何给树控件加入工具提示 首先给树控件加入TVS_INFOTIP属性风格,如下所示: if (!m_ctrlTree.Create(WS_CHILD|WS_VISIBLE| TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_INFOTIP, //加入提示TVS_INFOTIP,jingzhou xu(树控件ID:100) CRect(0, 0, 0, 0), &m_wndTreeBar, 100)) { TRACE0("Failed to create instant bar child\n"); return -1; } 其次加入映射消息声明,如下所示: afx_msg void OnGetInfoTip(NMHDR* pNMHDR,LRESULT* pResult); //树控件上加入提示消息,jingzhou xu
ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip) //树控件条目上加入提示,jingzhou xu 最后加入呼应涵数处理: void CCreateTreeDlg::OnGetInfoTip(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR; LPARAM itemData = (DWORD) pTVTipInfo->lParam; //对应每个条目的数据 HTREEITEM hItem = pTVTipInfo->hItem; CString tip; HTREEITEM hRootItem = m_chassisTree.GetRootItem(); if (hRootItem != pTVTipInfo->hItem) { tip = "树结点的提示"; } else { tip = "树根上的提示"; } strcpy(pTVTipInfo->pszText, (LPCTSTR) tip); }
5. 如何获取系统信息框的路径 #include
#define IDS_REG_KEY_MSINFO_PATH1 _T( "Software\\Microsoft\\Shared Tools\\MSInfo" ) #define IDS_REG_KEY_MSINFO_PATH2 _T( "Software\\Microsoft\\Shared Tools Location" ) #define IDS_REG_VAL_MSINFO_PATH1 _T( "Path" ) #define IDS_REG_VAL_MSINFO_PATH2 _T( "MSInfo" ) #define IDS_MSINFO_EXE_NAME _T( "MSInfo32.exe" )
//... BOOL GetSysInfoPath( CString& strPath ) { strPath.Empty(); LPTSTR pszPath = strPath.GetBuffer( MAX_PATH );
CRegKey reg; DWORD dwSize = MAX_PATH; LONG nRet = reg.Open( HKEY_LOCAL_MACHINE, IDS_REG_KEY_MSINFO_PATH1, KEY_READ );
// 在注册表中寻找第一个"MSInfo32.exe" 位置 if ( nRet == ERROR_SUCCESS ) { #if ( _MFC_VER >= 0x0700 ) nRet = reg.QueryStringValue( IDS_REG_VAL_MSINFO_PATH1, pszPath, &dwSize ); #else nRet = reg.QueryValue( pszPath, IDS_REG_VAL_MSINFO_PATH1, &dwSize ); #endif reg.Close(); }
// 如果第一次寻找失败,则进行第二次寻找 if ( nRet != ERROR_SUCCESS ) { nRet = reg.Open( HKEY_LOCAL_MACHINE, IDS_REG_KEY_MSINFO_PATH2, KEY_READ );
if ( nRet == ERROR_SUCCESS ) { #if ( _MFC_VER >= 0x0700 ) reg.QueryStringValue( IDS_REG_VAL_MSINFO_PATH2, pszPath, &dwSize ); #else reg.QueryValue( pszPath, IDS_REG_VAL_MSINFO_PATH2, &dwSize ); #endif
// 路径名不包括EXE文件名 if ( nRet == ERROR_SUCCESS ) VERIFY( ::PathAppend( pszPath, IDS_MSINFO_EXE_NAME ) ); reg.Close(); } }
strPath.ReleaseBuffer(); strPath.FreeExtra();
// 检查文件是否有效. return ::PathFileExists( strPath ); }
6. 如何直接运行一个资源中的程序 bool Run() { CFile f; char* pFileName = "Execution.exe"; if( !f.Open( pFileName, CFile::modeCreate | CFile::modeWrite, NULL ) ) { AfxMessageBox("Can not create file!"); return 0; } CString path = f.GetFilePath(); HGLOBAL hRes; HRSRC hResInfo; //获取应用实例