前言
吕鑫的视频资源在bilibili上面有,当然,我并不指望全靠他的视频,但是,他的视频入门还是不错的,用的VC6.0,都是结合MSDN来讲解,这一点做的不错,我先打算跟着他视频走走,然后后面再转向Vs2012。本笔记不会手把手的记录,只是观看视频和书籍后,把一些必要的知识点简单总结一下,能入门即可。后续,再多多学习别人的代码,在实际中提高,不过这都是后话了。
第一个WIN32程序
事件和消息
鼠标的移动,单击等等任何一个操作都是一个事件。消息是操作系统将事件传递给用户程序的数据格式,是一种传递数据的通信协议(通信协议=类型+数据),消息的通信协议是由消息类型和相关数据组成的。比如说:消息=你执行了单击操作+你点击了具体哪一个按钮
当鼠标单击了一个按钮时候,应用程序会接收到一个消息,消息的类型是WM_COMMAND,而数据时一个按钮的ID,应用程序根据ID就可以判断用户单击的是哪一个按钮。
编写一个静态的对话框
总结:
代码:
以下是仅仅显示一个对话框,但是对话框实际并没有任何效果的代码。
// win32_first.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,DialogProc);
return 0;
}
通常,有的人会出现下面的错误,missing function header (old-stytle formal list?)
这一点要仔细检查你的代码,我发现我就是声明函数时候添加了;结果导致错误。通常错误都在提示错误的上一行。
上述代码中:DialogBox第一个参数hInstance,代表应用进程,必须把对话框加入我们windows的应用进程。
第二个参数,代表与对话框模块关联的对话框的ID,并且带入前要对数字ID进行强制类型转化成字符型
第三个参数代表句柄,由于对话框没有父窗口,所以可设置为NULL
第四个参数代表回调函数的地址,该参数是一个指定格式的回调函数的地址,该函数用于处理各类的窗口事件。
运行效果:
下面执行后,连关都没法关闭,无法执行鼠标,键盘操作。
win32数据类型
编写一个可执行的加法计算器
以上代表回调函数,也就是diglogBox的回调函数,用于返回对话框的消息,(比如你按了那个按钮,你的光标落在了那个位置)。
代码:
```c
// win32_first.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h" //包含对话框资源
#include "stdio.h"
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )//对话框回调函数
{
char s[256];
sprintf(s,"uMsg=0x%x,wParam=0x%x,lParam=0x%x\n",uMsg,wParam,lParam); //输出到数组中,也可以注释掉
OutputDebugString(s); //输出到调试窗口,可以注释掉
if (WM_COMMAND==uMsg) //返回的消息是命令(因为返回的消息有很多,包括鼠标挪动,但是仅仅对WM_COMMAND这一类消息做出响应)
{
if (LOWORD(wParam)==IDCANCEL) //如果返回的消息是按钮取消键的ID
{
EndDialog(hwndDlg,IDCANCEL); //就关闭对话框
}
if (LOWORD(wParam)==IDOK) //如果返回的消息是确定按钮的ID,就开始执行以下代码的计算
{
int left_number=GetDlgItemInt(hwndDlg,IDC_EDIT1,NULL,TRUE); //GetDlgItemInt这个函数是从按钮中取值
int right_number=GetDlgItemInt(hwndDlg,IDC_EDIT2,NULL,TRUE);
int add_result=left_number+right_number; //执行加法运算
SetDlgItemInt(hwndDlg,IDC_EDIT3,add_result,TRUE); //在对话框中设置值到响应的按钮中
}
}
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,DialogProc);
return 0;
}
```
实现效果:
代码图片版:
心得总结:
1、出现missing function header (old-stytle formal list?),多半是你的程序写得有问题,仔细检查你的分号等容易忽视的地方。
2、消息有很多种类,包括刷新对话框,移动鼠标等等,如果消息等于WM_COMMAND(点击了按钮,或者快捷键)这一类消息,那么就执行。
3、函数的使用:
sprintf
OutputDebugString
EndDialog
WM_COMMAND
GetDlgItemInt
SetDlgItemInt