windows程序设计.docx
- 文档编号:4919506
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:11
- 大小:117.35KB
windows程序设计.docx
《windows程序设计.docx》由会员分享,可在线阅读,更多相关《windows程序设计.docx(11页珍藏版)》请在冰豆网上搜索。
windows程序设计
1.创建对话框程序
第一步,新建一个Win32 Application工程(工程名为dialog),一个简单的win32程序
第二步,点击"文件--新建--资源脚本",文件名就取resource.rc
第三步,右击下图resource.rc的文件夹图标,选择"插入",在插入资源中选择"Dialog”,点击"新建",此时就进入了对话框的图形编辑界面了。
第四步,双击打开dialog.cpp文件,里面有一个WinMain函数,它是程序的入口。
在WinMain函数中添加一行代码
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Main_Proc);
第五步,在WinMain函数下方定义下面四个函数:
BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
}
returnFALSE;
}
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
returnTRUE;
}
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDOK:
{
}
break;
default:
break;
}
}
voidMain_OnClose(HWNDhwnd)
{
EndDialog(hwnd,0);
}
第六步:
在文件开头处添上这四个函数的声明
BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam);
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify);
voidMain_OnClose(HWNDhwnd);
第七步:
添加如下头文件
#include"resource.h"
#include
第八步:
运行程序,观察窗体界面
2.深入研究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_OK0x00000000L
#defineMB_OKCANCEL0x00000001L
#defineMB_ABORTRETRYIGNORE0x00000002L
#defineMB_YESNOCANCEL0x00000003L
#defineMB_YESNO0x00000004L
#defineMB_RETRYCANCEL0x00000005L
也可以设置对话框中显示的图标:
#defineMB_ICONHAND0x00000010L
#defineMB_ICONQUESTION0x00000020L
#defineMB_ICONEXCLAMATION0x00000030L
#defineMB_ICONASTERISK0x00000040L
比如:
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”组的数值进行或运算后能分别保留各自的部分,也就是在结果值中同时体现两组的取值。
(4)返回值
MessageBox是有返回值的,返回值为用户点击的按钮:
#defineIDOK1
#defineIDCANCEL2
#defineIDABORT3
#defineIDRETRY4
#defineIDIGNORE5
#defineIDYES6
#defineIDNO7
代码:
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);
(5)如果想弹出的副窗口挡住主窗口,可以将MessageBox函数的第一个参数改为主窗口的句柄Hwnd。
简单的说,句柄就是把柄,操作一个东西,要先抓住他的把柄!
通过句柄就可以操作这个对象。
3.编写一个计算器程序
(1)、得到控件中用户输入的文本
GetDlgItemText(hwnd,IDC_EDTNAME,str,sizeof(str));
第一个参数是对话框的句柄;第二参数就是要取得文本的控件的id(name);第三个参数就是字符串的指针;第四个参数是指针指向区域的大小;
疑问:
为什么不能像MessageBox一样把字符串做为返回值返回呢?
?
?
这就涉及到C语言中函数返回指针的问题了
在函数内部返回函数内构建的指针有可能出现数据混乱.
当f1函数在执行的时候,这段内存是被占用的,一旦函数返回,那么内存就标记为可以被其他人、函数占用。
如果你把这段内存中的指针返回了,那么一旦其他地方用了这段内存,那么你引用的就是错误的数据了。
(2)c语言中字符串连接:
wsprintf(str,”….”,a1,a2);
还有sprintf,但是在编写windows程序的时候最好使用wsprintf。
形式为:
sprintf(字符串,"...",a1,a2,a3....);如:
TCHARmsg[256];
wsprintf(msg,"%s你好",name);
在C语言开发Windows程序的时候用wsprintf代替sprintf以解决中文等问题。
(3)向用户问好
TCHARname[256];
GetDlgItemText(hwnd,IDC_EDITNAME,name,sizeof(name));
TCHARmsg[256];
wsprintf(msg,"%s您好!
",name);
MessageBox(hwnd,msg,msg,MB_OKCANCEL);
(4)设置对话框的值用SetDlgItemText:
如:
SetDlgItemText(hwnd,IDC_EDITNAME,”用户欢迎您!
”);
(5)C语言里边字符串转换为数字:
atoi:
asciitoint
从编辑框中得到的数字是一个字符串,所以我们对它计算就要先进行转换,从字符串转换为数字。
如下面程序,将编辑框里的数字乘以2:
TCHARname[256];
GetDlgItemText(hwnd,IDC_EDITNAME,name,sizeof(name)/sizeof(TCHAR));
inti=atoi(name);//#include
intj=i*2;
TCHARresult[256];
itoa(j,result,10);
MessageBox(hwnd,result,TEXT("问好"),MB_OK);(6)编写一个加法计算器,界面如下:
(6)ComboBox控件的操作
1)添加项:
填入Combo最简单的方法是借助ComboBox_AddString“函数”:
ComboBox_AddString(hwndCtrl,str);
如:
ComboBox_AddString(HwndCombo1,TEXT("西安市"));
第一个参数是combo控件的句柄,第二个参数是要添加的字符串。
每个控件也有自己的句柄。
控件句柄和控件id的区别:
控件句柄在每次运行的时候都是不一样的,而控件id则是确定的。
ComboBox_AddString等几乎所有控件函数都可以对整个Windows中的控件进行控制(有的游戏外挂的原理),在一个对话框内id不能重复,但是在不同的对话框内则可以重复,因此需要一个全局的不重复的句柄来表示控件,通过对话框+id联合确定。
获得控件的句柄:
HWNDHwndCombo1=GetDlgItem(hwnd,IDC_COMBO1);
Main_OnInitDialog对话框初始化的时候被调用。
如果希望对话框一出现的时候ComboBox控件就加载上了若干项,只需要将代码拷贝到这个函数体里即可。
另一个类似功能的函数为:
ComboBox_InsertString,使用如下:
ComboBox_InsertString(HwndCombo1,0,TEXT("+"));
ComboBox_InsertString(HwndCombo1,1,TEXT("-"));
ComboBox_InsertString(HwndCombo1,2,TEXT("*"));
ComboBox_InsertString(HwndCombo1,3,TEXT("/"));
2)确定目前选项的索引:
intComboBox_GetCurSel(HWNDhwndCtl);返回值是当前项的编号,从0开始。
得到的不是“西安市”这样的字符串,而是索引(编号)如果没有项目被选中,那么从函数返回值为CB_ERR。
如下例:
HWNDHwndCombo1=GetDlgItem(hwnd,IDC_COMBO1);
intcurSel=ComboBox_GetCurSel(HwndCombo1);
if(0==curSel)
MessageBox(hwnd,TEXT("你选择的是西安市!
"),TEXT("消息"),MB_OK);
3)删除项:
intComboBox_DeleteString(HWNDhwndCtl,intindex);
4)取得有多少项:
intComboBox_GetCount(HWNDhwndCtl);返回值是个数。
5)选定某一项,让窗体加载时ComboBox控件显示这一项
intComboBox_SetCurSel(HWNDhwndCtl,intindex);将index设定为-1则取消所有选择
6)得到某项的值
intComboBox_GetLBText(HWNDhwndCtl, intindex, LPCTSTRlpszBuffer);
如下例:
HWNDHwndCombo1=GetDlgItem(hwnd,IDC_COMBO1);
TCHARstr[256];
ComboBox_GetLBText(HwndCombo1,1,str);
MessageBox(hwnd,str,TEXT("消息"),MB_OK);
更多ComboBox的用法
(7)编写简单的计算器,界面如下:
关键代码如下:
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
HWNDHwndCombo1=GetDlgItem(hwnd,IDC_COMBO1);
ComboBox_InsertString(HwndCombo1,0,TEXT("+"));
ComboBox_InsertString(HwndCombo1,1,TEXT("-"));
ComboBox_InsertString(HwndCombo1,2,TEXT("*"));
ComboBox_InsertString(HwndCombo1,3,TEXT("/"));
returnTRUE;
}
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDOK:
{
TCHARstr1[256],str2[256];
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
inti1=atoi(str1);
inti2=atoi(str2);
inti3=0;
HWNDHwndCombo1=GetDlgItem(hwnd,IDC_COMBO1);
intcurIndex=ComboBox_GetCurSel(HwndCombo1);
switch(curIndex)
{
case0:
i3=i1+i2;break;
case1:
i3=i1-i2;break;
case2:
i3=i1*i2;break;
case3:
i3=i1/i2;break;
}
TCHARstr3[256];
itoa(i3,str3,10);
SetDlgItemText(hwnd,IDC_EDIT3,str3);
}
break;
default:
break;
}
}
4.制作一个简单的登陆程序
要求:
当用户名或密码不正确时,弹出“您的用户名或密码输入错误”提示并清空用户名和密码框。
如果输入正确则弹出“欢迎您”提示。
点击“取消”按钮则清空输入框。
界面如下:
程序主要代码如下:
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDOK:
{
TCHARstr1[256],str2[256];
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
inti1=strcmp(str1,"张三");
inti2=strcmp(str2,"zhangsan");
if(i1!
=0||i2!
=0){
MessageBox(hwnd,TEXT("您的用户名或密码输入错误"),TEXT("错误"),MB_OK|MB_ICONQUESTION);
SetDlgItemText(hwnd,IDC_EDIT1,TEXT(""));
SetDlgItemText(hwnd,IDC_EDIT2,TEXT(""));
}
else
{
TCHARmsg[256];
wsprintf(msg,"%s,欢迎您!
",str1);
MessageBox(hwnd,msg,TEXT("祝贺"),MB_OK);
}
}
break;
caseIDCANCEL:
{
SetDlgItemText(hwnd,IDC_EDIT1,TEXT(""));
SetDlgItemText(hwnd,IDC_EDIT2,TEXT(""));
}
break;
default:
break;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windows 程序设计