红色纪念品批发:用C语言写聊天工具,类似于QQ

来源:百度文库 编辑:中财网 时间:2024/04/29 05:19:51
特战队贡献

C 语言究竟能干什么 序言 鉴于现在已经大三了,很多同学很迷茫,自己学的东西到底能做什么,将来自己到底能干什么?我不想看着同学迷茫 的面孔, 特别是几个好兄弟,有几个想学习编程,但又苦苦找不到门路的兄弟,所以想写点东西,希望对大家又点略微的帮助, 以尽兄弟我的微薄之力。 很多同学学了 C 语言之后,可能难免会有所感叹:这就是 C 语言!总是感觉 C 语言竟然能写出 Windows、Linux?为 了解除同学们 的疑惑,也愿为同学们指点编程之道吧。我写的这些东西采用 C 语言,计划通过编程实例来讲解 C 编程的一些知识, 让大家对 C 能又更深一层的理解和认识。当然,大家不要指望看了这些之后会写出一个操作系统来,但是我想,如果你认真看了 的话,写 一个类似与 QQ 的聊天程序应该不难。 本来书是假期里照顾妈妈时写的,原想是 1、不让自己的水平停滞不前,温故知新(两个月的假期是很 长的) 2. 帮助一些同学,解决编程上的困惑 3.希望妈妈快点康复 4.让母亲和家里人知道自己一直都很努力,我是好样的 但现在母亲已经能够不在了,所以第三点,就改为原母亲在天之灵得到慰藉,早日放下烦恼,不用惦记 我们。
C 语言的基本语法我是不打算再提了,很多 C 语言编程的书,就是将一些基本的数据类型、数据结构、语法,然后就 是一些数值 计算的实例,大多数都是雷同的,难免有抄袭之嫌,而且页没有多少实用价值。 本书以实用实例作为编程指导,指引大家编写真正实用的程序。了解到大家对黑客程序、病毒、窗口类程序比较感兴 趣,因此我就拿这些实例进行讲解。基于大家基本都用 Windows XP SP3,我也就在这个系统上把程序调试成功后再给 大家讲解。编程环境,我还是喜欢 Visual C 6.0
本书计划从四个大的方面来讲,这四个方面是:窗口类、文件操作类、网络类、数据库类。 都是时下流行的编程必备技术,也是软件开发者,必须掌握的技术。中间以实例讲解,逐步学习,相信大家看完后 会有很大的提高的。
第一章 窗口类程序的编写
这一章就先来讲解下窗口类程序的编写。因为现在程序没有界面,就像人没有脸面一样,而且好的界面更能吸引人。 从基本的界面开始, 相信能给大家指明出一条路的, 使大家很容易地掌握窗口序的编写。 其实界面设计利用 VC 6.0 的 MFC,很容易地制作出来。这里从底层开始写代码来写界面程序,使大家知道一些底层的东西,为以后学习打下好的 基础,相信您学了这些,再用 VC 的 MFC 会得心应手的。
1.1 用 C 写的第一个一个窗口程序 作为编程的开始,我们还是以一个 Hello World 来

始我们的学习之旅。代码如下: #include void main() { printf("Hello World!"); } 这是一个再简单不过的 C 程序了, 只要有点 C 语言的知识就能够懂的, 不过这里估计还有些人, 到现在还不知道#include 中的头文件 stdio.h 到底是什么东西,我就来说下了,stdio.h 是一个文本文件,存在于磁盘上的,已 VC 为例 它的位置如下图:
也许你听说过 printf()函数是在 stdio.h 中预定义的,但是你见过其定义的形式没有,没有且看下图
其定义形式,就如图中所示,也许你并不懂前面那些东西是什么,不用担心,以后我会慢慢解释给大家的。函数是先定义才能使 用的,所以 stdio.h 中定义 printf 函数,我我们在引用了 stdio.h 头文件后就可以在程序中调用 printf 函数了。 上面是在命令行中显示一个“Hello World!”,没什么意思,下面我写一个窗口程序,显示个 Hello World! #include void main() { MessageBox(NULL," Hello World!","我的第一个窗口程序",MB_OK); } 编译运行后如下图:
弹出的是一个对话框,上面有 Hello World,还有一个标题和一个“确定”按钮。 当然你会说这对话框也算个窗口吗?这里肯定的告诉你:是的,对话框是窗口程序的一个子集。你可能还会这样问,这样一个简 单的窗口有啥用呢,其实这样的窗口非常有用,我们在操作计算机的时候,会出现一些警告或提示的对话框,都是基本是这种方 法写出来的。就算是这个很简单,学习本来不就是有易向难,有浅显深奥去的过程吗。 整个效果几乎就是靠一个函数 MessageBox 的功劳。这里也先不介绍这个函数了,说些其他的。 其实用 C 编写一些恶程序,就是把编程环境中所提供的一些函数熟悉了基本就可以了。用 VC 来写成序,其中的头文件有很多, 定义了很多 Windows API 函数 、 数据结构、 可以让我们大家运用, 宏, 通过它们, 我们可以快速开发出使用的程序。 这些 Windows API 在微软的 MSDN 上查,上面有很多说明,部分还有代码示例。不会是可以输入函数名,查找相关信息,建议大家用英文版的 Library,因为其内容比中文版的全面,英语不好的同学呢,就先看中文了 中文 MSDN:http://msdn.microsoft.com/library/zh-cn/ 英文 MSDN:http://msen.micorsoft.com/library/en-us/ 到这里,我们就完成第一个有界面程序的编写,你感觉写有界面的程序难吗?显然不难。
下面看一个向锋和波波感兴趣的程序:九九乘法 采用命令行形式 #include “stdio.h” int i=0,j=0; for(i=1;i<10;i )="" for(j="">
,这一节就这样吧,大家先各自了解下微软的 MSDN,对以后的学习会有很大的帮助的。
1.2
第一个真正的窗口程序
上一节中,我们用 MessageBox 函数轻松地实现了一个对话框窗口,可能你会说,那仅仅是个没有用的对话框而已,是的,只是 我们继续。今天来编写一个真正的窗口程序。 下面就该罗嗦一段了,由于大家以前并没有写过什么窗口程序,写的都是命令行下的,我们知道在命令行下的程序都有一个主函 数 main,这个函数也就是程序的入口函数。我们现在用 VC 6.0 来写,而且要写窗口类程序,VC 6.0 给我们提供了一个专门用作 窗口类程序的入口函数 WinMain() 这个函数原型是这样的 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTRlpCmdLine, int nCmdShow ); 大家是不是感觉这个函数挺复杂的,有这么几个参数,而像 main 好像就没有参数。其实 main 是有参数,这个向 锋和小四是知道了的。但是 main 函数的参数是可以省略的,而 WinMain 是不可以省的。这里也要对 VC 6.0 的编译模 式改下 看下图
对话框而已。 我之所以以一个对话框为例呢, 是因为我只是想让你知道写一个有界面的程序并不是件难办的事。 明白了这一点后,
依次 是“工程”→“设置”→“连接”,在“工程选项”里把 console 改为 windows 就可以了。如果认真学了汇编, 或是手写命令编译连接过 C 程序,就会知道这是干什么的。Console 是控制台的意思,以前我们用 mian 函数写的程序 都是以控制台模式连接的,所以很少会有界面的。现在我们要写有界面的程序,所以要选 Windows(窗口)模式了。 我们写入以下代码,并按照上面说的方法去做,看看结果 #include "windows.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nShowCmd) { MessageBox(NULL,"WinMain 创建的窗口程序","WinMain",MB_OK); return 0; } 结果如下图:
与第一节中的这段代码代码比较下 #include “windows.h” void main() { MessageBox(NULL," Hello World!","我的第一个窗口程序",MB_OK); }
两者比较下, 后者多了个 cmd 窗口。 可见用 main 写的并没有完全脱离命令行呀。 所以以后我们写窗口程序就用 winmain 了。
好了,转过来,我们来看看 WinMain()函数,其中有 4 个参数 先看下解释(看不明白得先看完): hInstance:应用程序当前事例的句柄。 hPrelnstance: 应用 程序 的 先事 例的 句柄 。对 于同 一个 程序 打开 两次 ,出 现两 个窗 口第 一次 打开 的窗 口就 是先 前实 例 的窗口。对于一个 32 的位程序,该参数总为 NULL。 lpCmdLine:指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看 GetCommandLine。 nCmdS

how:指明窗口如何显示(是隐藏还是显示,有没有最大化按钮之类的) 。取值可以参考 MSDN 这里我相信有一个词大家好应该比较陌生,句柄(HANDLE)是吧。下面我就来简单的说下 句柄其实就是 Windows 系统中一个东西的唯一标识。就是系统中有很多运行的程序或者资源之类的,为了更好的管理 使用,Windows 系统给它们每人一个 ID 一样。懂得网页制作的人应该知道网页中各个元素的 ID 吧,网页的 ID 如果重 复话可能出现错误。 那么系 统的句柄会不会有相 同的, 那是肯定不会有的了 ,就和 我们的学号一样,系 统自动 分配每 一个模块的句柄,是不会相同的了。 对于句柄大家可以先这样理解着,不用一下子搞懂得。以后学着学着就明白了。 估计大家对那几个参数的类型改犯迷糊了吧。其实那几个类型,并不是什么新类型,都是 Windows 开发人员为了自己 和他人编程方便,同过基本的 C 语言语法定义一种新的结构体,或者是共同体,再者就是枚举类型。我知道结构体、 共同体和枚举类型,很多老师是没有讲到的,因为在书的后边,很多教 C 的,又是很垃圾的老师,所以不会讲那么快 的。其实结构体这些 数据类 型,就是通过我们常 用的字 符、整型、浮点等数 据类型 构造一个比较复杂的 类型而 已,举 个例子,就是我们知道 C 没有一个数据类型可以描述一个人吧,那么我构造一个是不是很方便我们编程呢。我们可以 这样构造一个 struct People { int age;//年龄 char sex[2];//性别 int height;//身高 …… } 我们这样定义以后就可以在我们以后的程序中利用这个数据类型了,People zhangsan;把 zhangsan 的身高 172 放到 zhangsan.height 中。这样可以方便完成很多工作。所以结构体是很简单的,还有其他的复杂数据类型也是很简单的, 都是有常用的简单的类型来结合到一起构造一个复杂的而已。这和 JAVA 定义类是很相似的,java 定义个人类,不是 可以这样的 public class People { public int age; public string sex; public height; …… } 看起来都差不多,而 且用法 也很相像。唯一的差 别其实 就是类可以有方法, 而结构 体是没有的(经过特 殊处理 也是可 以的,这里不用考虑)。 上面是为了让大家了解下复杂数据类型的定义,罗嗦了一大堆。下面来看下 WinMain 中第一个参数的类型 HINSTANCE 这个只是个结构体而已,实际上和 HANDLE 这个类型差不多,但是有一点差别,而 HANDLE
是这样 typedef PVOID HANDLE;定义的, PVOID 是什么呢, 我们来看下 typedef void *PVOID;说明 PVOID 是一个指针, 初始指向空(void)。因此可以知道句柄也是个指针而已。看着这么复杂原来也只是指针。 这些都可以在微软的
,而且很详细的 那个第二个 LPSTR 根据字面上的意思就知道是字符串类型了。查一查果然是。 大家一定要利用好 msdn,很有用的。 本节就到此结束了,主要是说明了一个 WinMain 函数和结构体的事情,东西也不算太多,大家应该能接受得了吧。下 节就来点复杂点深点的东西,希望大家做好心理准备。
1.3
窗口程序的编写
在来啰嗦之前,希望大家能够做好准备,这一节知识有点多,内容有点长。但愿大家能够一口气读完,如果一口 气读不完,那就换口气接着读。 上节中我们用 MessageBox()就实现了一个真正的窗口。MessageBox()中的原型如下: Int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT 参数解释 hWnd lpText 所属对话框所属窗口的句柄,如果是 NULL,则此对话框不属于任何一个窗口。 对话框窗口的显示内容。 对话框窗口的标题。 对话框的样式和动作(像是确定按钮,还是取消按钮就是设置这里的) uType);
lpCaption uType
关于这个函数的细节可以看这里 http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx 到此为止,你也算是会了窗口程序的编写,但只是一个开始,不过这已经很好,可能会让你感觉到了 C 的魅 力,也可能会稍微解点 C 语言能干什么的疑惑。在开始写代码之前,我有必要把细节和原理先说明下。 Windows 下一个窗口创建的过程有以下几个步骤: 程序创建一个窗口,首先要向 Windows 系统注册一个窗口类 wndclassex,其实就是定义一个变量,变量的 类 型 是 WNDCLASSEX( 结 构 体 ) 。 该 结 构 体 的 定 义 与 介 绍 看 这 里
1.
(http://msdn.microsoft.com/en-us/library/ms633577(VS.85).aspx), typedef struct { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra;
int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; HICON hIconSm; } WNDCLASSEX, *PWNDCLASSEX;
成员介绍 cbSize 值为 sizeof(WNDCLASSEX),在调用 GetClassInfoEx 前必须要先设置它值。
style
窗口类的样式,它的值可以是窗口样式值的任意组合。 可以有以下的值 指向窗口处 理函数(回调函数)。处理 窗口事件,像单击鼠标会怎 样,右击鼠标会怎样,都 为窗口类的额外信息做记录,系统初始化为 0。
lpfnWndProc
是由此函数控制的。 cbClsExtra cbWndExtra 记录窗口实例的额外信息, 系统初始为 0.如果程序使用 WNDCLASSEX 注册一个从资源文件里 创建的对话框,则此参数必须设置为 DLGWINDOWEXTRA hIcon 窗口类的图标,为资源句柄,如果设置为 NULL,系统将为窗口提供一个默认的图标。 hCursor 窗口类的鼠标样式,为鼠标样式资源的句柄,如果设置为 NULL,系统提供一个默认的鼠标样式。 h
ound 窗口类的背景刷,为背景刷句柄,也可以为系统颜色值,如果颜色值已给出,则必须转化为 以下的 HBRUSH 的值

COLOR_ACTIVEBORDER COLOR_ACTIVECAPTION COLOR_APPWORKSPACE COLOR_BACKGROUND COLOR_BTNFACE COLOR_BTNSHADOW COLOR_BTNTEXT COLOR_CAPTIONTEXT COLOR_GRAYTEXT

COLOR_HIGHLIGHT COLOR_HIGHLIGHTTEXT COLOR_INACTIVEBORDER COLOR_INACTIVECAPTION COLOR_MENU COLOR_MENUTEXT COLOR_SCROLLBAR COLOR_WINDOW COLOR_WINDOWFRAME COLOR_WINDOWTEXT 指向一个以 NULL 结尾的字符床,同目录资源的名字一样。如果使用整型 id 表示菜单,可 窗口类的名字,字符串类型。
lpszMenuName
以用 MAKEINTRESOURCE 定义一个宏。如果它的值为 NULL,那么该类创建的窗口将都没有默认的菜单。 lpszClassName hIconSm 小图标的句柄,在任务栏显示的图标,可以和上面的那个一样。
定义一个 WNDCLASSEX 类 型变量后,在给变量成员初始化后,我们就可以用 RegisterWindowEx(