没有合适的资源?快使用搜索试试~ 我知道了~
用c语言编写计算器.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 110 浏览量
2022-06-26
09:31:55
上传
评论
收藏 90KB DOC 举报
温馨提示
试读
26页
用c语言编写计算器.doc
资源推荐
资源详情
资源评论
板书:
1、在编写控制台程序的时候一切流程都是有先后关系、并行的,而且所有函数都是由我们
来调用的,比如下面的实例性代码:
printf("确定请输入 y,取消输入 n");
char c = getchar();
if(c=='y')
{
///
}
else if(c=='n')
{
///
}
我们可以用 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!
创建一个对话框程序,然后来分析代码。看 Main_OnCommand 方法,初探 windows 的消息
机制。
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_OK:
MessageBox(hwnd,"You click OK!","Test003",MB_OK);
EndDialog(hwnd, id);
break;
case IDC_CANCEL:
MessageBox(hwnd,"You click Cancel!","Test003",MB_OK);
EndDialog(hwnd, id);
break;
default:break;
}
}
按钮被按下的时候 Main_OnCommand 方法被调用,hwnd 是对话框句柄(什么是句柄后面
讲,通俗的说就是通过它能够操纵对话框),id 是控件的 id,后两个参数暂时不关心。
Main_OnCommand 方法中根据 id,也就是被点击按钮的名字来决定不同的动作,EndDialog
用来关闭对话框。
3、定制自己的对话框,向世界问好
首先打开资源编辑器并且打开对话框 IDD_MAIN,然后删除对话框上的两个按钮和标签,
同时删除 main.cpp 中的两个 Case 语句变成:
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
default:break;
}
}
然后重新添加一个自己的按钮,在属性中修改 Name 属性为 IDC_BTNHELLO。
控件名字的潜规则:所有控件的 Name 都以“IDC_”开头,然后后边跟着控件类型的简称
(按钮简称 BTN、文本框简称 EDT 等等),最后才是控件的真正的名字。修改按钮的
Caption 属性(也就是按钮上显示的文字)为“问好”。
在代码中怎么得到 IDC_BTNHELLO 呢?刚才被删掉的 IDC_OK 是什么东东呢?回忆配置
ResEd 的时候配置的“名称输出格式”和“默认输出文件名”以及“保存时自动输出”。每次保存
对话框的时候 ResEd 都会帮我们把控件的名字输出到 rsrc.inc 文件中,打开工程文件夹下的
rsrc.inc,内容如下:
#define IDC_BTNHELLO
1001
Dialog 编辑器会自动递增 id 的取值。然后生成 rsrc.inc,其实就是 h 头文件,取这些定义的
时候要先 include 这个 inc 文件。可以看到 rsrc.inc 文件中就是这些控件名字的定义,使用的
时候只要 include 这些文件就可以。“rsrc.inc”和头文件一样。因此首先在 main.cpp 中添加
“#include "rsrc.inc"”
编辑 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;
default:break;
}
}
运行程序,点击“问好”按钮,咱们第一个响应按钮动作的程序就做好了。
4、自己动手写计算器 1.0 版
(1)、得到控件中用户输入的文本
GetDlgItemText(hwnd,IDC_EDTNAME,str,sizeof(str));
第一个参数是对话框的句柄;第二参数就是控件的 id(name);第三个参数就是字符串数
组的指针;
疑问:为什么不能像 MessageBox 一样把字符串做为返回值返回呢???
这就涉及到 C 语言中函数返回指针的问题了
int i=20;
char cStr[3];
itoa(i,cStr,10);
char* f1()
{
return "adsfadsfasd";
}
在函数内部返回函数内构建的指针有可能出现数据混乱.
当 f1 函数在执行的时候,这段内存是被占用的,一旦函数返回,那么内存就标记为可以被
其他人、函数占用。
如果你把这段内存中的指针返回了,那么一旦其他地方用了这段内存,那么你引用的就是
错误的数据了。
用 GetWindowText、GetDlgItemText 的时候为什么要传数组名呢?复习:数组名就是指针,
函数只有得到指针,才能直接操作数组中的数据。
(2)c 语言中字符串连接:strcat(name,"你好");
但是在编写 windows 程序的时候最好使用 lstrcat 代替 strcat。
lstrcat(name,"你好");
同样代替的有:strlen→lstrlen;strcmp→lstrcmp
(3)向用户问好
TCHAR name[256];
GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));
lstrcat(name,"你好");
MessageBox(NULL,name,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;
剩余25页未读,继续阅读
资源评论
智慧安全方案
- 粉丝: 3730
- 资源: 59万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功