C语言项目(windows编程)_第1页
C语言项目(windows编程)_第2页
C语言项目(windows编程)_第3页
C语言项目(windows编程)_第4页
C语言项目(windows编程)_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一课、1.新建工程---->创建Windows窗口应用程序-->一个简单的窗口程序表示显示ok按钮真正我自己输入的内容表示显示ok按钮真正我自己输入的内容MessageBox(NULL,TEXT(“正文”),TEXT(“标题”),显示板按钮);在开发windows程序中,几乎所有的字符串都要用TEXT(“”)函数包起来将MB_OK换成MB_YESNO,就可以显示两个按钮。MB_YESNOCANCEL则显示三个按钮这里的MB_其实是Windows已经宏定义的常量,MB表示MessageBox。有如下的值:一、可以设置在对话框中显示的按钮MB_OKMB_OKCANCELMB_YESNOMB_YESNOCANCELMB_ABORTRETRYIGNORE(abort、retry、ignore)MB_RETRYCANCEL可以设置在对话框中显示的图标MB_ICONHAND出现一个叉MB_ICONQUESTION变成下图MB_ICONEXCLAMATION出现感叹号表示警告MB_ICONASTERISK出现信息提示的感叹号重要:将函数代码换成(加一条竖线)MessageBox(NULL,TEXT(“正文”),TEXT(“标题”),MB_YESNO|MB_ICONQUESTION)就可以既显示图标,有显示yes/no,其他效果类同。效果如下:“|”是位运算中的“或”运算MessageBox的返回值为int,通过MessageBox来判断用户是点了YES还是NO的按钮具体代码如下: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); }不同按钮对应的返回值宏定义如下:IDYES、IDNOIDOK、IDCANCELIDABORT、IDRETRY、IDIGNORE第二课1.exe程序debug版本和release版本的区别:Debug版本是用来调试用的,在别人的电脑上若他没装c-free或者vc++,则有可能程序无法运行,此外debug版本的程序运行效率较低最好给别人release版本的程序选中这个对话框,其他什么都不选然后右侧选择menu,就会出现上图的效果另外,在“文件”后面加上“&F”就会出现右图的效果不同操作最好都取一个名字在菜单之间设置分隔符(这操作....我也是醉了)不同操作最好都取一个名字注意:在resed中操作时,中文的字体最好别去修改,容易出现乱码(尤其是反复操作时),尽量选择neutral字体第三节一、修改程序图标可以下载使用restorater(资源修改器)来修改图标,用ico格式的图片(回去再看视频)2.在以前编写控制台程序(即黑屏白字程序)的时候,一切代码有先后顺序。但在windows编程中不可以这样。为了解决这个问题,windows引入了消息机制,即把用户的操作抽象成一个个的事件,编写的程序只要响应这些事件就可以了。就是说告诉windows,当事件A发生时,调用我写的相应的代码。类似于“程序中断”的概念,当发生某件事的时候告诉我。3.在工程的main.c文件中,Main_OnCommand函数被Main_Proc函数中的HANDLE_MSG函数调用:HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);这里HANDLE_MSG的意思就是告诉windows当发生WM_COMMAND消息时,请通知Main_OnCommand函数voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify);这里的id参数是这里的id参数是windows给我们的,id就表示哪个按钮被按下了等消息。那么这个id到底指的是什么呢?打开dialogs.h文件就可以看到不同控件的id宏定义。也可以在dialogs.dlg文件下打开资源编辑器,在里面修改(注意Name和Caption的区别)不同的控件要有一个Name唯一的id,我们只需要知道控件的Name就好。ID值等于多少cfree会自动定义。Windows中控件的名字一般默认以IDC_开头。二、下面来看一段Main_OnCommand函数的代码voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){caseIDC_OK:好习惯:最好case好习惯:最好case后面加上{},虽然自带是没有的EndDialog(hwnd,id);break;caseIDC_CANCEL:{MessageBox(hwnd,TEXT("你选择了Cancel!"),TEXT("111"),MB_OK);EndDialog(hwnd,id);}还记得吗?以前是NULL还记得吗?以前是NULL现在是hwnd。(Handleofwindow)的缩写default:break;}}当参数是hwnd时,后面的窗口是不能运行的,当参数是NULL时,后面窗口是可以拖动的这是什么意思呢?就是说MessageBox第一个参数意味着要阻止哪个对话框窗口运行,当为NULL时,不阻止任何一个。hwnd表示当前的按钮所在的窗口的句柄(windows传过来的),句柄就是把柄,操作一个东西要先抓住把柄。通过句柄就可以操作这个对象。第一个参数为hwnd就表示挡住当前按钮所在的窗口。字符串指针字符串指针三、自己编写计算器程序1.0版本(1)得到控件中用户输入的文本用GetDlgItemText函数来完成:指针指向区域的大小第二个参数:要取得内容的控件的ID名称第一个参数表示窗口的句柄GetDlgItemText(hwnd,IDC_EDITNAME,str,sizeof(str));指针指向区域的大小第二个参数:要取得内容的控件的ID名称第一个参数表示窗口的句柄注意:在资源编辑器中编好窗口之后,要把ID的宏定义全部放到dialogs.h文件中,不要放在dialogs.dlg文件中。例如编写一个输入名字后点击确定按钮跳出“名字+你好”的窗口的程序:voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){caseIDC_OK:注意这里的操作,回想以前的TEXT(“”注意这里的操作,回想以前的TEXT(“”)操作可知,这里只要字符串即可,字符串数组的话只要写数组名 charname[256];在windows编程中一般都用TCHAR在windows编程中一般都用TCHAR代替,可以解决Unicode和中文编码的问题 /*思考为什么不用strlen,而是用sizeof?*/ MessageBox(hwnd,name,name,MB_OK);//EndDialog(hwnd,id);}break;caseIDC_CANCEL:MessageBox(hwnd,TEXT("YouclickedCancel!"),TEXT("121212"),MB_OK);EndDialog(hwnd,id);break;default:break;}}改变上述程序代码为:voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){caseIDC_OK:{ TCHARname[256]; GetDlgItemText(hwnd,IDC_EDITNAME,name,sizeof(name)); /*思考为什么不用strlen,而是用sizeof?*/ TCHARmsg[256]; //sprintf(msg,"%s你好",name);//把数据写到字符串里面/* printf是打印到屏幕上,而sprintf是打印到字符串中 相当于C#、java里的字符串相加 sprintf的格式是sprintf(字符串,"..",a1,a2,a3...);*//*C语言开发windows程序时用wsprintf代替sprintf,解决中文等问题,用法和sprintf没多大区别*/ wsprintf(msg,"%s你好",name); MessageBox(hwnd,msg,name,MB_OK);//EndDialog(hwnd,id);}break;caseIDC_CANCEL:MessageBox(hwnd,TEXT("YouclickedCancel!"),TEXT("121212"),MB_OK);EndDialog(hwnd,id);break;default:break;}}(2)向控件中输出文本例如编写程序,当点击确定按钮时,输入框中自动出现文字使用SetDlgItemText函数你要设置的字符串的值SetDlgItemText(hwnd,ID_EDITNAME,“…”);你要设置的字符串的值参数:第一个—>窗口句柄第二个---->控件的ID第三个--->字符串的值(3)接下来可以自己编写简易计算器程序了voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){caseIDC_OK:{ TCHARstr1[20],str2[20],str3[20];//不能梦想着直接定义两个int类型的参数让windows运行,因为在文本框控件中输入的计算机默认是字符串 GetDlgItemText(hwnd,IDC_EDT1,str1,sizeof(str1)); GetDlgItemText(hwnd,IDC_EDT2,str2,sizeof(str2)); //两个字符串不能直接相加,要先转换成int类型 //C语言的标准库函数atoi函数,a:ascii码,to就是英文to,i:integer既然有atoi,那肯定有atof,转化为浮点数 //不用死记硬背 inti1=atoi(str1),i2=atoi(str2); inti3=i1+i2; wsprintf(str3,"%d",i3);//可以不用wsprintf二用itoa函数(字符串转换为整数):str3=itoa(i3,str3,10) SetDlgItemText(hwnd,IDC_EDT3,str3);表示多少进制//EndDialog(hwnd,id);表示多少进制}break;caseIDC_CANCEL:MessageBox(hwnd,TEXT("YouclickedCancel!"),TEXT("0020"),MB_OK);EndDialog(hwnd,id);break;default:break;}}最统一能解决问题的方法是自己编写函数,采用循环遍历字符串的每一个字符判断它是不是属于‘最统一能解决问题的方法是自己编写函数,采用循环遍历字符串的每一个字符判断它是不是属于‘0’~‘9’调试的技巧:断点:执行到程序的时候程序暂停(用来找错)在调试行上按F9问题解决:如何防止用户在输入框中输入不是数字的字符不会报错?怎么判断数字字符?voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)将str1将str1中的字符串转化为数字,再将数字转化为字符串str1_temp,比较这两个字符串是否相等,不相等则报错这种方法对于浮点数的比较,是不可行的switch(id){caseIDC_OK:{ TCHARstr1[20],str2[20],str3[20]; GetDlgItemText(hwnd,IDC_EDT1,str1,sizeof(str1)); GetDlgItemText(hwnd,IDC_EDT2,str2,sizeof(str2)); inti1=atoi(str1),i2=atoi(str2);TCHARstr1_temp[20],str2_temp[20];wsprintf(str1_temp,”%d”,i1);wsprintf(str2_temp,”%d”,i2);if(strcmp(str1,str1_temp)==0&&strcmp(str2,str2_temp)==0){ inti3=i1+i2; wsprintf(str3,"%d",i3); SetDlgItemText(hwnd,IDC_EDT3,str3);}ElseMessageBox(hwnd,TEXT(“警告”),TEXT(“请输入正确数字”),MB_OK|MB_ICONINFORMATION);//EndDialog(hwnd,id);}break;caseIDC_CANCEL:MessageBox(hwnd,TEXT("YouclickedCancel!"),TEXT("0020"),MB_OK);EndDialog(hwnd,id);break;default:break;}}可以把一个重复的代码编写成函数进行调用第四节一、ComboBox控件的操作(下拉列表控件)(1)向下拉列表中加内容最简单的办法是使用ComboBox_AddString“函数”,它其实是一个宏ComboBox_AddString(hwndCtrl,str);要加的字符串的内容ComboBox要加的字符串的内容ComboBox控件的句柄控件句柄和控件ID的区别:控件句柄在程序每次运行时是不一样的,而控件ID则是确定的。ComboBox_AddString等几乎所有的控件函数可以对整个windows中的控件进行控制。(就是说,在A程序中的控件函数可以控制B程序中的控件,有一些游戏外挂就是这样的原理)在跨程序调用时,在同一个对话框内,控件的ID是不能重复的,但对话框之间的ID是有可能重复的。所以,需要在全windows之内不重复的句柄来表示控件。两个不同的程序,哪怕是同一个程序启动的两个不同的实例(就好比同时开两个记事本程序),他们的句柄也是不一样的在windows下,由对话框的句柄+ID就能明确的找到这个控件使用GetDlgItem函数:例1:BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam){HWNDhwnd_Combo1=GetDlgItem(hwnd,IDC_CBO1);//得到控件的句柄,定义为HWND类型,getdlgitem函数中的hwnd表示当前窗口的句柄,IDC_CBO1表示下拉列表的ID。这里获得下拉列表的句柄是为了下面给它Add_String ComboBox_AddString(hwnd_Combo1,TEXT("北京市")); ComboBox_AddString(hwnd_Combo1,TEXT("杭州市")); ComboBox_AddString(hwnd_Combo1,TEXT("绍兴市"));returnTRUE;}放在Main_OnInitDialog函数里面Main_OnInitDialog对话框初始化的时候被调用Main_OnCommand函数告诉我们哪一个按钮被按下(2)确定目前的索引,就是确定在下拉列表中选定了哪一项IntCombox_GetCurSel(HWNDhwndCtrl)就是getcurrentselection,它返回的值是当前选项的索引(编号,从0开始),不是“北京市”这样的字符串。如果当前没有任何项被选择,那么从函数中传回的iIndex就是CB_ERR在例1的基础上写以下代码:voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){caseIDC_OK:{ HWNDhwnd_Combo1=GetDlgItem(hwnd,IDC_CBO1);//这里获得下拉列表句柄,是为了判断获得的索引 intcursel=ComboBox_GetCurSel(hwnd_Combo1); TCHAR*shi[]={"北京市","杭州市","绍兴市"}; inti; for(i=0;i<3;i++) { if(cursel==i) MessageBox(hwnd,shi[i],TEXT("提示"),MB_OK); }//EndDialog(hwnd,id);注意字符串数组的使用}注意字符串数组的使用break;caseIDC_CANCEL:MessageBox(hwnd,TEXT("YouclickedCancel!"),TEXT("2121212121"),MB_OK);EndDialog(hwnd,id);break;default:break;}要删除掉的索引的编号(注意:从零开始)要删除掉的索引的编号(注意:从零开始)(3)删除项IntComboBox_DeleteString(HWNDhwndCtrl,intindex)(4)取得有多少项,就是到底combobox里面有多少内容。IntCombobox_GetCount(HWNDhwndCtrl)返回的值是个数inta=ComboBox_GetCount(hwnd_Combo1); charstr[256]; itoa(a,str,10); SetDlgItemText(hwnd,IDC_EDT1,str);(5)设定当前选择项IntCombobox_SetCurSel(HWNDhwndCtrl,intindex)(一般用于最开始设定一个值)通过程序选定某一项最常见的情形是qq登录的时候的界面字符串的缓冲区将index设定为-1,取消所有选择字符串的缓冲区(6)得到某一项索引的字符串的值。IntComboBox_GetLBText(HWNDhwndCtrl,intindex,LPCTSTRlpszBuffer)例如以下代码: TCHAR*name[]={"zhonghuadong","shouyingxin"}; HWNDhwnd_Combo1=GetDlgItem(hwnd,IDC_CBO1); TCHARstr[256]; ComboBox_GetLBText(hwnd_Combo1,0,str); SetDlgItemText(hwnd,IDC_EDT1,str);关于combobox的更多新的用法,可以去msdn网站上看作业:改进计算器程序,并实现BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam){HWNDhwnd_combo=GetDlgItem(hwnd,IDC_CBO1);ComboBox_AddString(hwnd_combo,TEXT("+"));ComboBox_AddString(hwnd_combo,TEXT("-"));ComboBox_AddString(hwnd_combo,TEXT("*"));ComboBox_AddString(hwnd_combo,TEXT("/"));returnTRUE;}/********************************************************************************/BOOLstr_is_num(TCHARconststr[]){自己编写函数来判断文本框中输入的字符串,到底是不是数字。(包括浮点数形式的数字)自己编写函数来判断文本框中输入的字符串,到底是不是数字。(包括浮点数形式的数字) intcount_num=0,count_point=0; for(i=0;i<strlen(str);i++) { if(str[i]=='.')count_point+=1;elseif(!(str[i]>='0'&&str[i]<='9'))count_num+=1; } if(count_num==0&&count_point<=1) returnTRUE; else returnFALSE;}voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){switch(id){caseIDC_OK:{TCHARstr1[256],str2[256],str3[256];GetDlgItemText(hwnd,IDC_EDT1,str1,sizeof(str1));GetDlgItemText(hwnd,IDC_EDT2,str2,sizeof(str2));if(str_is_num(str1)==FALSE){这个return使得函数立即返回,不再执行下面的if判断这个return使得函数立即返回,不再执行下面的if判断 return;}if(str_is_num(str2)==FALSE){ Me

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论