C语言也能干大事板书(三)
2012-08-01 19:49
323 查看
1、怎么修改程序图标,引入一个ico文件(可以用一些工具***ico图标,网上搜“***ico”),然后命名ID为1,重新构建。
2、在编写控制台程序的时候一切流程都是有先后关系、并行的,而且所有函数都是由我们来调用的,比如下面的实例性代码:
printf("确定请输入y,取消输入n");
char c = getchar();//scanf
if(c=='y')
{
///
}
else if(c=='n')
{
///
}
Void func1()
{
MessageBox(NULL,TEXT(“按钮1被按下了”)….);
}
Void func2()
{
MessageBox(NULL,TEXT(“按钮2被按下了”)….);
}
我们可以用getchar来等待用户输入一个值。但是到了Windows编程中就不一样了,同一时刻用户即可能点击【OK】按钮,又可能点击【Cancel】按钮,又可能在文本框中输入几个字,还可能在窗口上双击几下,这样就无法同时等待用户的这些动作。为了解决这个问题,Windows引入了消息机制(也可以叫做回调机制或者事件机制)。在程序启动的时候把函数func1要响应【OK】按钮1的点击动作、函数func2要响应【Cancel】按钮的点击动作、函数func3要响应窗口的双击动作等等这些信息告诉Windows,然后当用户执行相应操作的时候Windows就会来主动调用你注册的函数,主动通知你。不再是程序调用操作系统的函数,而是操作系统反过来调用你的函数。Don't call me ,I'll call you!(也被人称为“好莱坞法则”)。
2、关于上面的这个问题要慢慢来理解,下面就来通过第一个例子来初步理解这个Don't call me ,I'll call you!
//HANDLE_MSG的意思就是告诉Windows,当发生WM_COMMAND消息的时候,请
//通知Main_OnCommand函数
//id这个参数是Windows给咱们“送”过来的
看Main_OnCommand方法,初探windows的消息机制。
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_OK:
{
MessageBox(hwnd,TEXT("欢迎访问如鹏网 www.RuPeng.com 大学生计算机学习社区"),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方法:
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
………………………
case IDC_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
//第三个参数就是字符串指针,第四个参数就是指针指向区域的大小
TCHAR name[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....);
TCHAR msg[256];
//sprintf(msg,"%s你好",name);
//wsprintf,C语言开发Windows程序的时候用wsprintf代替sprintf
//解决中文等问题
wsprintf(msg,"%s你好",name);
MessageBox(hwnd,msg,msg,MB_OK);
(3)向用户问好
TCHAR name[256];
GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));
TCHAR msg[256];
wsprintf (msg,"%s你好",name);
MessageBox(hwnd, msg,TEXT("问好"),MB_OK);
(4)
C语言里边字符串转换为数字:atoi:ascii to int
(5)
编写windows程序的时候最好用TCHAR来代替char,可以避免中文的问题
case IDC_BTNHELLO:
TCHAR name[256];
GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));
int i = atoi(name);
int j=i*2;
TCHAR result[256];
itoa(j,result,10);
MessageBox(hwnd,result,TEXT("问好"),MB_OK);
(6)Get、Set:配对的,设置对话框的值用SetDlgItemText:
代码:
case IDC_BTNADD:
//取第一个文本框的字符串,然后得到整数表示
// 取第二个文本框的字符串,然后得到整数表示
//计算两个整数的和
//把和重新转换成字符串,然后Messagebox出来。
TCHAR cNumber1[256];
GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR));
int n1 = atoi(cNumber1);
TCHAR cNumber2[256];
GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR));
int n2 = atoi(cNumber2);
int n3 = n1+n2;
TCHAR cResult[256];
itoa(n3,cResult,10);
SetDlgItemText(hwnd,IDC_EDTRESULT, cResult);
break;
//int i1;
//int i2;
//不能梦想着直接定义两个int类型的参数,就让windows告诉你两个数的值
TCHAR str1[256];
TCHAR str2[256];
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
//两个字符串不能直接相加,要先转换成int类型。
//C标准库函数:atoi,a:ascii
to i:int 理解了atoi的简写不用死记硬背了
int i1=atoi(str1);
int i2=atoi(str2);
int i3=i1+i2;
//printf("%i",i3);
TCHAR str3[256];
itoa(i3,str3,2);//字符串转换为整数,第三个参数就是进制。
//wsprintf(str3,"%i",i3);
SetDlgItemText(hwnd,IDC_EDIT3,str3);
(7)代码中有UINT、TCHAR、LRESULT、HWND之类的新的数据类型,其实它们只是一些类型的别名而已,可以通过宏定义看出来。但是考虑到可移植性,尽量不要使用它们的真实类型。Typedef C语言中声明类型别名。
(8)作业:做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。
(10)作业:用户输入十进制整数,在另外一个文本框中显示整数的二进制形式。做一个十进制到二进制的转换小工具。
(10)作业:计算两个数的差。
(11)思考:这个计算两个数的和程序有什么缺陷?没有阻止用户输入非数字。怎么解决。
多练手,光听视频什么用都没有,浪费时间,必须练手,再简单的代码也要自己写,不要眼高手低!!!你没有多牛X。
2、在编写控制台程序的时候一切流程都是有先后关系、并行的,而且所有函数都是由我们来调用的,比如下面的实例性代码:
printf("确定请输入y,取消输入n");
char c = getchar();//scanf
if(c=='y')
{
///
}
else if(c=='n')
{
///
}
Void func1()
{
MessageBox(NULL,TEXT(“按钮1被按下了”)….);
}
Void func2()
{
MessageBox(NULL,TEXT(“按钮2被按下了”)….);
}
我们可以用getchar来等待用户输入一个值。但是到了Windows编程中就不一样了,同一时刻用户即可能点击【OK】按钮,又可能点击【Cancel】按钮,又可能在文本框中输入几个字,还可能在窗口上双击几下,这样就无法同时等待用户的这些动作。为了解决这个问题,Windows引入了消息机制(也可以叫做回调机制或者事件机制)。在程序启动的时候把函数func1要响应【OK】按钮1的点击动作、函数func2要响应【Cancel】按钮的点击动作、函数func3要响应窗口的双击动作等等这些信息告诉Windows,然后当用户执行相应操作的时候Windows就会来主动调用你注册的函数,主动通知你。不再是程序调用操作系统的函数,而是操作系统反过来调用你的函数。Don't call me ,I'll call you!(也被人称为“好莱坞法则”)。
2、关于上面的这个问题要慢慢来理解,下面就来通过第一个例子来初步理解这个Don't call me ,I'll call you!
//HANDLE_MSG的意思就是告诉Windows,当发生WM_COMMAND消息的时候,请
//通知Main_OnCommand函数
//id这个参数是Windows给咱们“送”过来的
看Main_OnCommand方法,初探windows的消息机制。
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_OK:
{
MessageBox(hwnd,TEXT("欢迎访问如鹏网 www.RuPeng.com 大学生计算机学习社区"),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方法:
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
………………………
case IDC_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
//第三个参数就是字符串指针,第四个参数就是指针指向区域的大小
TCHAR name[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....);
TCHAR msg[256];
//sprintf(msg,"%s你好",name);
//wsprintf,C语言开发Windows程序的时候用wsprintf代替sprintf
//解决中文等问题
wsprintf(msg,"%s你好",name);
MessageBox(hwnd,msg,msg,MB_OK);
(3)向用户问好
TCHAR name[256];
GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));
TCHAR msg[256];
wsprintf (msg,"%s你好",name);
MessageBox(hwnd, msg,TEXT("问好"),MB_OK);
(4)
C语言里边字符串转换为数字:atoi:ascii to int
(5)
编写windows程序的时候最好用TCHAR来代替char,可以避免中文的问题
case IDC_BTNHELLO:
TCHAR name[256];
GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));
int i = atoi(name);
int j=i*2;
TCHAR result[256];
itoa(j,result,10);
MessageBox(hwnd,result,TEXT("问好"),MB_OK);
(6)Get、Set:配对的,设置对话框的值用SetDlgItemText:
代码:
case IDC_BTNADD:
//取第一个文本框的字符串,然后得到整数表示
// 取第二个文本框的字符串,然后得到整数表示
//计算两个整数的和
//把和重新转换成字符串,然后Messagebox出来。
TCHAR cNumber1[256];
GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR));
int n1 = atoi(cNumber1);
TCHAR cNumber2[256];
GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR));
int n2 = atoi(cNumber2);
int n3 = n1+n2;
TCHAR cResult[256];
itoa(n3,cResult,10);
SetDlgItemText(hwnd,IDC_EDTRESULT, cResult);
break;
//int i1;
//int i2;
//不能梦想着直接定义两个int类型的参数,就让windows告诉你两个数的值
TCHAR str1[256];
TCHAR str2[256];
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
//两个字符串不能直接相加,要先转换成int类型。
//C标准库函数:atoi,a:ascii
to i:int 理解了atoi的简写不用死记硬背了
int i1=atoi(str1);
int i2=atoi(str2);
int i3=i1+i2;
//printf("%i",i3);
TCHAR str3[256];
itoa(i3,str3,2);//字符串转换为整数,第三个参数就是进制。
//wsprintf(str3,"%i",i3);
SetDlgItemText(hwnd,IDC_EDIT3,str3);
(7)代码中有UINT、TCHAR、LRESULT、HWND之类的新的数据类型,其实它们只是一些类型的别名而已,可以通过宏定义看出来。但是考虑到可移植性,尽量不要使用它们的真实类型。Typedef C语言中声明类型别名。
(8)作业:做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。
(10)作业:用户输入十进制整数,在另外一个文本框中显示整数的二进制形式。做一个十进制到二进制的转换小工具。
(10)作业:计算两个数的差。
(11)思考:这个计算两个数的和程序有什么缺陷?没有阻止用户输入非数字。怎么解决。
多练手,光听视频什么用都没有,浪费时间,必须练手,再简单的代码也要自己写,不要眼高手低!!!你没有多牛X。
相关文章推荐
- C语言也能干大事板书(一)
- C语言也能干大事板书(二)
- C语言也能干大事板书(四)
- C语言也能干大事板书(五)
- C语言也能干大事板书(六)
- 1,C语言也能干大事系列--第一个C语言项目的建立
- C语言也能干大事第八节(如鹏基础)
- c语言也能干大事
- 《C语言也能干大事》第二十节:多线程开发
- 【C语言也能干大事】第十一讲:Socket网络编程
- C语言也能干大事第九节(如鹏基础)
- 【C语言也能干大事】第二讲:对话框程序
- 【C语言也能干大事】第六讲:定时器控件
- C语言也能干大事第十节(如鹏基础)
- 《C语言也能干大事》学习笔记一
- C语言也能干大事--定时关机程序
- C语言也能干大事 第三节
- C语言也能干大事 第七节 笔记
- 【对话框编程】C语言也能干大事系列课程源代码
- 【C语言也能干大事】第七讲:自己动手写记事本及打开对话框的使用(上)