1、怎么修改程序图标
引入一个ico 文件(可以用一些工具制作ico 图标,网上搜“制作ico”)
然后命名ID 为1
重新构建
2、在dos下我们可以用getchar来等待用户输入一个值。但是到了Windows编程中就不一样 了,同一时刻用户即可能点击【OK】按钮,又可能点击【Cancel】按钮,又可能在文本框中输入几个字,还可能在窗口上双击几下,这样就无法同时等待用户的这些动作。
为了解决这个问题,Windows引入了消息机制(也可以叫做回调机制 或者事件机制)。
在程序启动的时候把函数func1要响应【OK】按钮1的点击动作、函数func2要响应【Cancel】按钮的点击动作、函数func3要响应窗口的双击动作等等这些信息告诉Windows,然后当用户执行相应操作的时候Windows就 会来主动调用你注册的函数,主动通知你。不再是程序调用操作系统的函数而 是操作系统反过来调用你的函数。Don't call me ,I'll call you!(也被人称 为“好莱坞法则”)。
3、
//HANDLE_MSG的意思就是告诉Windows,当发生WM_COMMAND消息的时候,请
//通知Main_OnCommand函数
4、
//id这个参数是Windows给咱们“送”过来的
不同的控件要有不同的id,控件的名字,在人类社会中名字有可能重名, 但是在windows中id不能重复
按钮被按下的时候Main_OnCommand方法被调用
hwnd是对话框句柄
Hwnd是当前窗口的句柄,句柄就是把柄!操作一个东西,要先抓住他的把 柄!通过句柄就可以操作这个对象。
Main_OnCommand方法中根据id,也就是被点击按钮的名字来决定不同的动作。
//不要忘了每个case后面都有break
//不要忘了case中用大括号
5、 定制自己的对话框,不同的按钮不同的问好
然后重新添加一个自己的按钮,在属性中修改Name属性为IDC_BTNHELLO。
控件名字的潜规则:所有控件的Name都以“IDC_”开头,然后后边跟着控
件类型的简称(按钮简称BTN、文本框简称EDT等等),最后才是控件的真正的
名字。修改按钮的Caption属性(也就是按钮上显示的文字)为“问好”。
编辑Main_OnCommand方法:
.................................................................................................................
..................................................................................................................
6、得到控件中用户输入的文本
GetDlgItemText(hwnd, IDC_EDTNAME, str, sizeof(str));
第一个参数是对话框的句柄;第二参数就是控件的id(name);第三个参数就是字符串数组的指针;
疑问:为什么不能像MessageBox 一样把字符串做为返回值返回呢???
这就涉及到C 语言中函数返回指针的问题了
在函数内部返回函数内构建的指针有可能出现数据混乱.
当f1 函数在执行的时候,这段内存是被占用的,一旦函数返回,那么内存
就标记为可以被其他人、函数占用。如果你把这段内存中的指针返回了,那么一旦其他
地方用了这段内存,那么 你引用的就是错误的数据了。
用GetWindowText、GetDlgItemText 的时候为什么要传数组名呢?
复习:初学者可以认为数组名就是指针,函数只有得到指针,才能直接操作数组中的
数据。
7、
c 语言中字符串连接:wsprintf(str,”….”,a1,a2); (用于window编程的时候)
还有sprintf,但是在编写windows程序的时候最好使用wsprintf。
//GetDlgItemText(hwnd, IDC_EDITNAME ,str, sizeof(str));
//第一参数是窗口的句柄,第二个参数是要取得内容的控件的ID
//第三个参数就是字符串指针,第四个参数就是指针指向区域的大小
//为什么不用strlen而用sizeof。
//如鹏网站内搜索搜“strlen,sizeof”区别
TCHAR str1[265]
//Windows编程中一般都用TCHAR代替char。TCHAR有时候就是char。
//解决Unicode、中文编码问题。
GetDlgItemText(hwnd,IDC_EDITNAME,name,sizeof(name));
//printf是打印到屏幕上
//printf("%s你好",name);
//sprintf是打印到字符串中
//sprintf(字符串,"...",a1,a2,a3....);
TCHAR name[256]
····
TCHAR msg[256];
sprintf(msg,"%s你好",name);
//相当于很多C#、Java语言里的字符串相加 name+"你好" 及“····你好”
//wsprintf,C语言开发Windows程序的时候用wsprintf代替sprintf
//解决Unicode、中文编码问题
wsprintf(msg,"%s你好",name);
8、
TCHAR name[256];
GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)));
TCHAR msg[256];
wsprintf (msg,"%s你好",name);
MessageBox(hwnd, msg,TEXT("问好"),MB_OK);
9、
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_OK:
{
TCHAR str1[265];
TCHAR str2[256];
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
int i1=atoi(str1);//字符串转换为数字atoi:ascii to int
//数字转换为字符串itoa:int to ascii itoa(int,char,int(进制)) 第三个参数就是进制。
//使用itoa和atoi时添加#include 头文件
int i2=atoi(str2);
//取第一、二个文本框的字符串,然后得到整数表示
int i3=i1+i2;
TCHAR str3[265];
itoa(i3,str3,10);
SetDlgItemText(hwnd,IDC_EDIT3,str3);
}
break;
default:
break;
}
}
C语言里边字符串转换为数字:atoi:ascii to int
Eg:int i2=atoi(str1);
Itoa(i2,str1,10);itoa(int,char,int);//字符串转换为整数,第三个参数就是进制。
10、Get、Set:配对的,设置对话框的值用SetDlgItemText:
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));(获得对话框的字符)
SetDlgItemText(hwnd,IDC_EDIT3,str3); (向对话框输出字符)