C语言也能干大事.docx
- 文档编号:8496281
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:28.37KB
C语言也能干大事.docx
《C语言也能干大事.docx》由会员分享,可在线阅读,更多相关《C语言也能干大事.docx(17页珍藏版)》请在冰豆网上搜索。
C语言也能干大事
C语言也能干大事
第一课
1、
C语言不是只能开发黑底白字的控制台界面程序。
学习本课的基础:
本课程不讲C语言基础知识,C语言考及格,学的过程中配合复习,有不懂的回去翻书。
2、
学完本课程以后同学们做的一些作品赏析:
计算器、俄罗斯方块、音乐播放器、学生管理系统(),邮件客户端(),Web论坛()可以开发游戏、网络程序、网站程序等。
C语言什么都可以开发
3、
准备工作,安装VC6(在网上搜“VisualC++6”,找合适的地址下载)。
VC6在Vista、Windows下启动可能有兼容性提示。
3、开始做第一个C语言的程序
【文件】→【新建】,打开【工程】选项页,选择【Win32Application】(不要选错了),在“位置”中修改工程保存的路径。
(以前用TuborC的同学会问“什么叫工程?
”。
在以前大家用TurboC写的程序一般也就是一个文件,但是用C语言写大程序的时候不可能把所有的代码都写在一个文件中,肯定要写很多文件。
“工程(Project)”就是这些文件的一个集合。
)在“工程名”中写入你为这个工程取的名字,最好有一定意义。
下一步【一个简单的Windows程序】
4、向Windows的世界问好
MessageBox(NULL,TEXT("世界你好"),TEXT("问好"),MB_OK);
VC6在Vista、Windows下编译调试时可能有兼容性提示。
5、学本课程常见问题
(1)为什么不用TurboC?
TurboC(Win-TC)太老了,界面还是DOS界面,库也是DOS的库,没有网络开发包、没有Windows界面开发包。
TC只能用来学C的基础,要进行实际开发必须使用先进一点的工具。
还是让TurboC进博物馆吧。
(2)为什么不用更高版本的VC?
我们不使用高版本的VC主要是如下考虑:
VC6和高版本的VC没有本质区别(VC6是1998年的东西,大部分人、公司还是用VC6,市面上的书也都是用VC6),只不过是升级了一下C++的版本、STL的版本而已,对咱们这次学习没有什么影响;VC6的操作方式和VC2008非常相似,用熟了VC6再学高版本的VC只用半小时而已;高版本的VC体积太大,要五六百兆,而上面给出的VC6只有100MB。
VC2008下建立工程。
(3)学C语言还是学其他语言,用其他语言实现岂不是更好?
用最熟悉的语言深入编程的各个领域(网络、数据库、图形学、内核等),一通百通,一切语言都是纸老虎。
参考资料如鹏网首页。
6、深入研究MessageBox
(1)MessageBox(NULL,TEXT("世界你好"),TEXT("问好"),MB_OK);
第一个参数暂时不讲;第二个是正文;第三个是标题(Caption);第四个是类型。
MB_OK就是表示有一个OK按钮【确定】)
TEXT是一个宏,当字符串中有中文的时候最好用TEXT来包围这个字符串,虽然不使用TEXT在VC6中没问题,但是在VC7中有问题,而且微软也建议使用TEXT宏,因此在涉及到中文的场合要使用它。
他的作用就是把中文转化成不会乱码的格式。
(暂时这么认为)。
_T("问好"),其实_T只是TEXT的一个缩写而已。
而且_T在有的低版本里不识别。
TEXT()低版本也识别。
暂时不用关心TEXT的细节。
换个样子:
MessageBox(NULL,TEXT("世界你好"),TEXT("你好"),MB_OKCANCEL);
可从设置希望在对话框中显示的按钮:
#defineMB_OK
0x00000000L
#defineMB_OKCANCEL
0x00000001L
#defineMB_ABORTRETRYIGNORE
0x00000002L
#defineMB_YESNOCANCEL
0x00000003L
#defineMB_YESNO
0x00000004L
#defineMB_RETRYCANCEL
0x00000005L
也可以设置对话框中显示的图标:
#defineMB_ICONHAND
0x00000010L
#defineMB_ICONQUESTION
0x00000020L
#defineMB_ICONEXCLAMATION
0x00000030L
#defineMB_ICONASTERISK
0x00000040L
比如:
MessageBox(NULL,TEXT("世界你好"),TEXT("你好"),MB_ICONQUESTION);
(2)可是如果我想显示“确定、取消”按钮的时候同时使用问号图标呢?
MessageBox(NULL,TEXT("世界你好"),TEXT("你好"),MB_OKCANCEL|MB_ICONQUESTION);
MessageBox(NULL,TEXT("世界你好"),TEXT("你好"),
MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION);
(3)思考:
到这一步如果你只是在背诵“第一组和第二组中间放一个竖线就可以实现两种效果的组合形式”,那么你未来只会成为一个代码工人。
我们要思考一下其背后的原理。
“|”是什么意思?
“|”是位运算里的“或”运算,只有对应的两个二进位有一位为1时,结果位才为1,否则为0。
MB_OK、MB_OKCANCEL等的低四位不同,但是高位永远为0;MB_ICONHAND、MB_ICONQUESTION等的低5至第8位不同,而其他位永远为0。
这样“MB_OK、MB_OKCANCEL”组的数值与“MB_ICONHAND、MB_ICONQUESTION”组的数值进行或运算后能分别保留各自的部分,也就是在结果值中同时体现两组的取值。
这种风格叫“掩码”,在Windows编程中这种用法会经常用到。
(4)返回值
MessageBox是有返回值的,返回值为用户点击的按钮:
#defineIDOK
1
#defineIDCANCEL
2
#defineIDABORT
3
#defineIDRETRY
4
#defineIDIGNORE
5
#defineIDYES
6
#defineIDNO
7
代码:
intret=MessageBox(NULL,TEXT("你是人吗?
"),TEXT("火星人"),
MB_YESNO|MB_ICONQUESTION);
if(ret==IDYES)
{
MessageBox(NULL,TEXT("火星人你好"),TEXT("问好"),MB_OK);
}
else
{
MessageBox(NULL,TEXT("欢迎回家来"),TEXT("问好"),MB_OK);
}
6、课后作业:
自己动手写恶搞程序。
运行以后弹出询问对话框(有【是】、【否】两个按钮以及问号图标)“你是好人吗?
”,如果点击【是】,则弹出对话框(只有一个【确定】按钮以及一个警告图标)“你看你就不像好人,点击【确定】开始格式化C盘!
”;如果点击【否】,则弹出对话框(有【重试】、【取消】两个按钮)“尝试把你变成好人失败,是否重试?
”。
别把教学视频当电影看!
!
!
多练!
!
!
多写!
!
!
第二课
运行以后弹出询问对话框(有【是】、【否】两个按钮以及问号图标)“你是好人吗?
”,如果点击【是】,则弹出对话框(只有一个【确定】按钮以及一个警告图标)“你看你就不像好人,点击【确定】开始格式化C盘!
”;如果点击【否】,则弹出对话框(有【重试】、【取消】两个按钮)“尝试把你变成好人失败,是否重试?
”。
1、怎么生成exe程序。
怎么把做好的exe程序发给别人?
在我的电脑里直接进入工程文件夹。
工程目录下生成的debug/release文件就是生成好的可执行文件,发给别人就可以。
Debug和Release版本区别。
怎么生成Release版本。
1、对话框程序
VC6下安装Win32DialogBasedApplication
VC2008下安装Win32DialogBasedApplication
如鹏的Win32DialogBasedApplication没有做神奇的事情,只是简化了创建的过程,大家也可以手工创建,创建的代码可以在没有安装Win32DialogBasedApplicationWizard的机器上用。
演示在2008上从win32application创建一个Win32DialogBasedApplication。
在资源编辑器中编辑对话框界面并且拖放控件上去。
试试常用的那些控件
什么是属性。
作业:
开发一个注册界面。
2、常见问题
(1)开发Windows程序有什么前途?
不要急于求成,用自己最熟悉的语言探索编程的各个方面,内核级开发、数据库、网络、动态网站开发等。
学《C语言也能干大事》的目的并不是直接找开发Windows程序的工作,只要锻炼了动手能力和一通百通的数据库、网络、动态网站开发、面向对象等技能,学什么东西、找什么工作都很轻松。
(2)学MFC不是更好?
MFC乱七八糟的东西太多,隐藏了太多,隐藏不仅没有有利于初学者学习,反而使得更复杂。
MFC只是一个稍微封装的SDK,学会了这里的课程如果又需要再去学MFC的话会发现90%是相同的。
3、对话框中图片资源的应用在资源视图中,选择“引入”,然后文件过滤器选择“*.*”,找到bmp图片文件。
选中图片空间,要点击边缘。
拖一个IMAGE控件过来,并且修改IMAGE控件的Type属性为BitMap,在控件的Image属性中选择刚才添加的BITMAP资源。
jpg的格式怎么转换为bmp格式的呢?
用画图工具(mspaint)。
图片被编译到了程序中,不再依赖于源文件
4、菜单资源
制作好菜单资源后,在对话框的Menu属性中选择刚才制作好的对话框。
子菜单项(选中【弹出】)、快捷键(在要担当快捷键的字母前加&)、分隔符
5、只有控件、菜单,可以点击控件、菜单以后的动作怎么做呢?
就要写代码了。
后面会讲
第三课
1、怎么修改程序图标,引入一个ico文件(可以用一些工具制作ico图标,网上搜“制作ico”),然后命名ID为1,重新构建。
2、在编写控制台程序的时候一切流程都是有先后关系、并行的,而且所有函数都是由我们来调用的,比如下面的实例性代码:
printf("确定请输入y,取消输入n");
charc=getchar();//scanf
if(c=='y')
{
///
}
elseif(c=='n')
{
///
}
Voidfunc1()
{
MessageBox(NULL,TEXT(“按钮1被按下了”)….);
}
Voidfunc2()
{
MessageBox(NULL,TEXT(“按钮2被按下了”)….);
}
我们可以用getchar来等待用户输入一个值。
但是到了Windows编程中就不一样了,同一时刻用户即可能点击【OK】按钮,又可能点击【Cancel】按钮,又可能在文本框中输入几个字,还可能在窗口上双击几下,这样就无法同时等待用户的这些动作。
为了解决这个问题,Windows引入了消息机制(也可以叫做回调机制或者事件机制)。
在程序启动的时候把函数func1要响应【OK】按钮1的点击动作、函数func2要响应【Cancel】按钮的点击动作、函数func3要响应窗口的双击动作等等这些信息告诉Windows,然后当用户执行相应操作的时候Windows就会来主动调用你注册的函数,主动通知你。
不再是程序调用操作系统的函数,而是操作系统反过来调用你的函数。
Don'tcallme,I'llcallyou!
(也被人称为“好莱坞法则”)。
2、关于上面的这个问题要慢慢来理解,下面就来通过第一个例子来初步理解这个Don'tcallme,I'llcallyou!
//HANDLE_MSG的意思就是告诉Windows,当发生WM_COMMAND消息的时候,请
//通知Main_OnCommand函数
//id这个参数是Windows给咱们“送”过来的
看Main_OnCommand方法,初探windows的消息机制。
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDC_OK:
{
MessageBox(hwnd,TEXT("欢迎访问如鹏网www.RuP大学生计算机学习社区"),TEXT("问好"),MB_OK);
}
break;
default:
break;
}
}
不同的控件要有不同的id,控件的名字,在人类社会中名字有可能重名,但是在windows中id不能重复
按钮被按下的时候Main_OnCommand方法被调用,hwnd是对话框句柄(什么是句柄后面讲,通俗的说就是通过它能够操纵对话框),id是控件的id,后两个参数暂时不关心。
Main_OnCommand方法中根据id,也就是被点击按钮的名字来决定不同的动作。
Hwnd是当前窗口的句柄,句柄就是把柄!
操作一个东西,要先抓住他的把柄!
通过句柄就可以操作这个对象。
//不要忘了break//不要忘了case中用大括号
3、定制自己的对话框,不同的按钮不同的问好
然后重新添加一个自己的按钮,在属性中修改Name属性为IDC_BTNHELLO。
控件名字的潜规则:
所有控件的Name都以“IDC_”开头,然后后边跟着控件类型的简称(按钮简称BTN、文本框简称EDT等等),最后才是控件的真正的名字。
修改按钮的Caption属性(也就是按钮上显示的文字)为“问好”。
编辑Main_OnCommand方法:
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
………………………
caseIDC_BTNHELLO:
{
MessageBox(NULL,TEXT("世界你好"),TEXT("问好"),MB_OK);
}
break;//不要忘记break
default:
break;
}
}
运行程序,点击“问好”按钮,咱们第一个响应按钮动作的程序就做好了。
4、自己动手写计算器1.0版
(1)、得到控件中用户输入的文本
GetDlgItemText(hwnd,IDC_EDTNAME,str,sizeof(str));
第一个参数是对话框的句柄;第二参数就是控件的id(name);第三个参数就是字符串数组的指针;
疑问:
为什么不能像MessageBox一样把字符串做为返回值返回呢?
?
?
这就涉及到C语言中函数返回指针的问题了
在函数内部返回函数内构建的指针有可能出现数据混乱.
当f1函数在执行的时候,这段内存是被占用的,一旦函数返回,那么内存就标记为可以被其他人、函数占用。
如果你把这段内存中的指针返回了,那么一旦其他地方用了这段内存,那么你引用的就是错误的数据了。
用GetWindowText、GetDlgItemText的时候为什么要传数组名呢?
复习:
初学者可以认为数组名就是指针,函数只有得到指针,才能直接操作数组中的数据。
(2)c语言中字符串连接:
wsprintf(str,”….”,a1,a2);
还有sprintf,但是在编写windows程序的时候最好使用wsprintf。
//GetDlgItemText(hwnd,IDC_EDITNAME,str,sizeof(str));
//第一参数是窗口的句柄,第二个参数是要取得内容的控件的ID
//第三个参数就是字符串指针,第四个参数就是指针指向区域的大小
TCHARname[256];//为什么不用strlen,sizeof。
//如鹏网站内搜索搜“strlen,sizeof”区别
//Windows编程中一般都用TCHAR代替char。
TCHAR有时候就是char。
//解决Unicode、中文编码问题。
GetDlgItemText(hwnd,IDC_EDITNAME,name,sizeof(name));
//printf是打印到屏幕上
//printf("%s你好",name);
//sprintf是打印到字符串中
//相当于很多C#、Java语言里的字符串相加name+"你好"
//sprintf(字符串,"...",a1,a2,a3....);
TCHARmsg[256];
//sprintf(msg,"%s你好",name);
//wsprintf,C语言开发Windows程序的时候用wsprintf代替sprintf
//解决中文等问题
wsprintf(msg,"%s你好",name);
MessageBox(hwnd,msg,msg,MB_OK);
(3)向用户问好
TCHARname[256];
GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));
TCHARmsg[256];
wsprintf(msg,"%s你好",name);
MessageBox(hwnd,msg,TEXT("问好"),MB_OK);
(4)
C语言里边字符串转换为数字:
atoi:
asciitoint
(5)
编写windows程序的时候最好用TCHAR来代替char,可以避免中文的问题
caseIDC_BTNHELLO:
TCHARname[256];
GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));
inti=atoi(name);
intj=i*2;
TCHARresult[256];
itoa(j,result,10);
MessageBox(hwnd,result,TEXT("问好"),MB_OK);
(6)Get、Set:
配对的,设置对话框的值用SetDlgItemText:
代码:
caseIDC_BTNADD:
//取第一个文本框的字符串,然后得到整数表示
//取第二个文本框的字符串,然后得到整数表示
//计算两个整数的和
//把和重新转换成字符串,然后Messagebox出来。
TCHARcNumber1[256];
GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR));
intn1=atoi(cNumber1);
TCHARcNumber2[256];
GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR));
intn2=atoi(cNumber2);
intn3=n1+n2;
TCHARcResult[256];
itoa(n3,cResult,10);
SetDlgItemText(hwnd,IDC_EDTRESULT,cResult);
break;
//inti1;
//inti2;
//不能梦想着直接定义两个int类型的参数,就让windows告诉你两个数的值
TCHARstr1[256];
TCHARstr2[256];
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
//两个字符串不能直接相加,要先转换成int类型。
//C标准库函数:
atoi,a:
ascii
toi:
int理解了atoi的简写不用死记硬背了
inti1=atoi(str1);
inti2=atoi(str2);
inti3=i1+i2;
//printf("%i",i3);
TCHARstr3[256];
itoa(i3,str3,2);//字符串转换为整数,第三个参数就是进制。
//wsprintf(str3,"%i",i3);
SetDlgItemText(hwnd,IDC_EDIT3,str3);
(7)代码中有UINT、TCHAR、LRESULT、HWND之类的新的数据类型,其实它们只是一些类型的别名而已,可以通过宏定义看出来。
但是考虑到可移植性,尽量不要使用它们的真实类型。
TypedefC语言中声明类型别名。
(8)作业:
做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。
(10)作业:
用户输入十进制整数,在另外一个文本框中显示整数的二进制形式。
做一个十进制到二进制的转换小工具。
(10)作业:
计算两个数的差。
(11)思考:
这个计算两个数的和程序有什么缺陷?
没有阻止用户输入非数字。
怎么解决。
多练手,光听视频什么用都没有,浪费时间,必须练手,再简单的代码也要自己写,不要眼高手低!
!
!
你没有多牛X。
第四课
上节课作业
(8)作业:
做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。
(10)作业:
用户输入十进制整数,在另外一个文本框中显示整数的二进制形式。
做一个十进制到二进制的转换小工具。
(10)作业:
计算两个数的差。
不要总认为看很多书、学高深技术、看很多视频就是牛人,能把一个最简单的程序快速写出来的才是牛人!
!
!
(11)思考:
这个计算两个数的和程序有什么缺陷?
没有阻止用户输入非数字。
怎么解决。
调试的技巧,断点:
执行到断点的时候程序暂停住。
第五课
上节课的作业你自己写了吗?
比我快吗?
如果没有写的话别继续往下看,先回去自己写。
实现“自己动手写计算器2.0版”,允许选择运算符号。
ComboBox的操作
(1)添加项:
填入Combo最简单的方法是借助ComboBox_AddString“函数”(其实是宏):
ComboBox_AddString(hwndCtrl,str)
每个控件也有自己的句柄。
句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例、窗口、图片、图标等等。
控件句柄和控件id的区别:
控件句柄在每次运行的时候都是不一样的,而控件id则是确定的。
ComboBox_AddString等几乎所有控件函数都可以对整个Windows中的控件进行控制(有的游戏外挂的原理),在一个对话框内id不能重复,但是在不同的对话框内则可以重复,因此需要一个全局的不重复的句柄来表示控件,通过对话框+id联合确定。
两个不同
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 能干 大事