预编译头
F5 调试
F10 一步
shift+F5 结束调试
cl /c 文件名 - 产生.obj文件
二.Windows编程基础
1.Window程序的类型
1)控制台程序(console),DOS程序,在控制台窗口中运行,以字符方式与用户交互。
2)窗口程序,拥有自己的窗口,该窗口要 程序创建,通过图形化的界面元素与用户交互。
3)库程序
A.静态库 : 扩展名 .lib, 在编译链接程序时被嵌入到可执行代码中,
B.动态库 : 扩展名 .dll, 在可执行程序运行过程中动态的从库中获取函数代码
2.Windows开发工具和库
1)集成开发环境(IDE)
C/C++、VC、Visual Studio
2)工具链
编译器 : cl.exe
链接器 : link.exe
资源编译器 : rc.exe
源文件(.C/CPP) - cl -> 目标文件(.obj) \
资源脚本(.rc) - rc -> 资源文件(.res) + link -> 可执行 (.exe\.dll)
静态库/导入库(.lib) /
3.Win32 SDK = 库+头文件+文档, platform SDK
A.库 : 封装了Windows API --- 非常庞大
user32.dll - 管理窗口、消息、资源
gdi32.dll - 绘图相关
kernel32.dll - 进程、线程、内存管理
以上三个动态库在系统目录下: system32
对应的导入库在VC环境的lib目录下 :
导入库 :
user32.lib
gdi32.lib
kernel32.lib
B.头文件: VC环境下的include目录下。
windef.h - windows的数据类型
winuser.h - 声明user32.dll的API
wingdi.h - 声明gdi32.dll的API
winbase.h - 声明kernel32.dll的API
winnt.h - UNICODE字符集相关
windows.h - 所有windows头文件集合
C.文档:MSDN
3.不使用IDE编写windows程序
1)入口函数
int WINAPI WinMain (
HINSTANCE hInstance,//应用程序实例句柄
HINSTANCE hPreInstance,//应用程序的上一个实例句柄
LPSTR lpCmdLine,//命令行
int nCmdShow //窗口的显示方式
);
在windef.h中:
#define WINAPI __stdcall //被调用者清理堆栈
#define APIENTRY __stdcall
#define CALLBACK __stdcall
#define PASCAL __stdcall
#define WINAPIV __cdecl //调用者清理堆栈
__cdecl
函数的调用者清理栈
__stdcall
自己清理栈
所有的窗口都是对象
HINSTANCE 就是标识对象
一切皆对象
所有的H开头的都是句柄
INSTANCE 实例
HINSTANCE hPreInstance 在16位的时候能用,在32位不会用了,一般返回为0
LPSTR
LP P 都是指针
2)消息框函数
MessageBox
MessageBoxIndirect
3)构建过程
A.编辑源代码HelloBox.c
B.绘制图标: HelloBox.ico
C.编辑资源脚本:HelloBox.rc
rc HelloBox.rc
D.编译源代码: cl /c HelloBox.c,得到目标文件 HelloBox.obj
E.编译资源脚本: rc HelloBox.rc,得到资源文件 HelloBox.res
F.链接: link HelloBox.obj HelloBox.res user32.lib, 得到可执行程序 HelloBox.exe
三、编写一个窗口程序
1.定义WinMain函数,程序的入口
2.定义窗口过程函数,处理消息
LRESULT 就是 long int
LRESULT CALLBACK WindowProc
(
HWND hWnd, //窗口句柄
UINT uMsg, //消息标识
WPARAM wParam, //消息参数
LPARAM lParam //消息参数 (都是4个字节,都是长整形)
);
消息标识 - 通过这个可以知道他具体的操作
这个函数需要自己来定义的
3.缺省窗口过程函数,处理那些自己不处理的消息
简单的说就是不想处理的函数接口
LRESULT CALLBACK DefWindowsProc
(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
WNDPROC 窗口过程函数类型
4.注册窗口类
1)窗口类
typedef struct {
UINT style; //窗口类的风格
WNDPROC lpfnWndProc; //窗口过程函数指针
int cbClsExtra; //窗口类附加数据缓冲区字节数
int cbWndExtra; //窗口附加数据缓冲区字节数
HINSTANCE hInstance; //应用程序实例句柄
HICON hIcon; //窗口图标句柄(窗口左上角的图标)
HBRUSH hBrush; //刷子句柄(窗口背景的颜色)
HCURSOR hCursor; //光标句柄
LPCTSTR lpszMenuName; //菜单资源名(左上角)
LPCTSTR lpszClassName; //窗口类名
}WNDCLASS, *PWNDCLASS;
2)注册窗口类
ATOM 为 unsigned short
ATOM RegisterClass (
const WNDCLASS* lpWndClass;
);
成功返回窗口类的唯一标识,失败返回0
5.创建窗口,在内存中创建窗口对象,并不可见
HWND CreateWindow (
LPCTSTR lpClassName; //窗口类名
LPCTSTR lpWindowName; //窗口标题 (窗口标题)
DWORD dwStyle, //窗口风格
int x,
int y,
int nWidth,
int nHeight, //位置大小
HWND hWndParent, //父窗口句柄
HMENU hMenu, //菜单句柄
HINSTANCE hInstance, //应用程序实例句柄
LPVOID lpParam //附加数据
);
可以为窗口类指定特定的东西,都在这个里创建(在这里和窗口类相同的选项)
成功返回窗口句柄,失败返回NULL
6.显示窗口,在屏幕上把窗口画出来
1)显示
BOOL ShowWindow (
HWND hWnd, //窗口句柄
int nCmdShow //显示方式(最大化,最小化)
);
成功返回TRUE,失败返回FALSE
2)刷新
BOOL UpdateWindow (
HWND hWnd, //窗口句柄
);
成功返回TRUE,失败返回FALSE
7.消息循环,重复执行提取消息、翻译消息、派发消息
1)提取消息
BOOL GetMessage (
LPMSG lpMsg, //消息结构体
HWND hWnd, //窗口句柄(为了获取特定窗口定制的,一般为NULL)
UINT wMsgFilterMin, //起始消息
UINT wMsgFilterMax //终止消息(消息的范围)
);
LPMSG 消息结构体
收到WM_QUIT 消息返回FALSE,其他情况一律返回TRUE
2)翻译消息
BOOL TravslateMessage (
const MSG* lpMsg //消息结构
);
有消息被翻译返回TRUE,否则返回FALSE
3)派发消息
LRESULT DispatchMessage (
const MSG* lpMsg //消息结构体
);
派发给窗口过程函数
返回窗口过程函数的返回值。
8.处理消息
F5 调试
F10 一步
shift+F5 结束调试
cl /c 文件名 - 产生.obj文件
二.Windows编程基础
1.Window程序的类型
1)控制台程序(console),DOS程序,在控制台窗口中运行,以字符方式与用户交互。
2)窗口程序,拥有自己的窗口,该窗口要 程序创建,通过图形化的界面元素与用户交互。
3)库程序
A.静态库 : 扩展名 .lib, 在编译链接程序时被嵌入到可执行代码中,
B.动态库 : 扩展名 .dll, 在可执行程序运行过程中动态的从库中获取函数代码
2.Windows开发工具和库
1)集成开发环境(IDE)
C/C++、VC、Visual Studio
2)工具链
编译器 : cl.exe
链接器 : link.exe
资源编译器 : rc.exe
源文件(.C/CPP) - cl -> 目标文件(.obj) \
资源脚本(.rc) - rc -> 资源文件(.res) + link -> 可执行 (.exe\.dll)
静态库/导入库(.lib) /
3.Win32 SDK = 库+头文件+文档, platform SDK
A.库 : 封装了Windows API --- 非常庞大
user32.dll - 管理窗口、消息、资源
gdi32.dll - 绘图相关
kernel32.dll - 进程、线程、内存管理
以上三个动态库在系统目录下: system32
对应的导入库在VC环境的lib目录下 :
导入库 :
user32.lib
gdi32.lib
kernel32.lib
B.头文件: VC环境下的include目录下。
windef.h - windows的数据类型
winuser.h - 声明user32.dll的API
wingdi.h - 声明gdi32.dll的API
winbase.h - 声明kernel32.dll的API
winnt.h - UNICODE字符集相关
windows.h - 所有windows头文件集合
C.文档:MSDN
3.不使用IDE编写windows程序
1)入口函数
int WINAPI WinMain (
HINSTANCE hInstance,//应用程序实例句柄
HINSTANCE hPreInstance,//应用程序的上一个实例句柄
LPSTR lpCmdLine,//命令行
int nCmdShow //窗口的显示方式
);
在windef.h中:
#define WINAPI __stdcall //被调用者清理堆栈
#define APIENTRY __stdcall
#define CALLBACK __stdcall
#define PASCAL __stdcall
#define WINAPIV __cdecl //调用者清理堆栈
__cdecl
函数的调用者清理栈
__stdcall
自己清理栈
所有的窗口都是对象
HINSTANCE 就是标识对象
一切皆对象
所有的H开头的都是句柄
INSTANCE 实例
HINSTANCE hPreInstance 在16位的时候能用,在32位不会用了,一般返回为0
LPSTR
LP P 都是指针
2)消息框函数
MessageBox
MessageBoxIndirect
3)构建过程
A.编辑源代码HelloBox.c
B.绘制图标: HelloBox.ico
C.编辑资源脚本:HelloBox.rc
rc HelloBox.rc
D.编译源代码: cl /c HelloBox.c,得到目标文件 HelloBox.obj
E.编译资源脚本: rc HelloBox.rc,得到资源文件 HelloBox.res
F.链接: link HelloBox.obj HelloBox.res user32.lib, 得到可执行程序 HelloBox.exe
三、编写一个窗口程序
1.定义WinMain函数,程序的入口
2.定义窗口过程函数,处理消息
LRESULT 就是 long int
LRESULT CALLBACK WindowProc
(
HWND hWnd, //窗口句柄
UINT uMsg, //消息标识
WPARAM wParam, //消息参数
LPARAM lParam //消息参数 (都是4个字节,都是长整形)
);
消息标识 - 通过这个可以知道他具体的操作
这个函数需要自己来定义的
3.缺省窗口过程函数,处理那些自己不处理的消息
简单的说就是不想处理的函数接口
LRESULT CALLBACK DefWindowsProc
(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
WNDPROC 窗口过程函数类型
4.注册窗口类
1)窗口类
typedef struct {
UINT style; //窗口类的风格
WNDPROC lpfnWndProc; //窗口过程函数指针
int cbClsExtra; //窗口类附加数据缓冲区字节数
int cbWndExtra; //窗口附加数据缓冲区字节数
HINSTANCE hInstance; //应用程序实例句柄
HICON hIcon; //窗口图标句柄(窗口左上角的图标)
HBRUSH hBrush; //刷子句柄(窗口背景的颜色)
HCURSOR hCursor; //光标句柄
LPCTSTR lpszMenuName; //菜单资源名(左上角)
LPCTSTR lpszClassName; //窗口类名
}WNDCLASS, *PWNDCLASS;
2)注册窗口类
ATOM 为 unsigned short
ATOM RegisterClass (
const WNDCLASS* lpWndClass;
);
成功返回窗口类的唯一标识,失败返回0
5.创建窗口,在内存中创建窗口对象,并不可见
HWND CreateWindow (
LPCTSTR lpClassName; //窗口类名
LPCTSTR lpWindowName; //窗口标题 (窗口标题)
DWORD dwStyle, //窗口风格
int x,
int y,
int nWidth,
int nHeight, //位置大小
HWND hWndParent, //父窗口句柄
HMENU hMenu, //菜单句柄
HINSTANCE hInstance, //应用程序实例句柄
LPVOID lpParam //附加数据
);
可以为窗口类指定特定的东西,都在这个里创建(在这里和窗口类相同的选项)
成功返回窗口句柄,失败返回NULL
6.显示窗口,在屏幕上把窗口画出来
1)显示
BOOL ShowWindow (
HWND hWnd, //窗口句柄
int nCmdShow //显示方式(最大化,最小化)
);
成功返回TRUE,失败返回FALSE
2)刷新
BOOL UpdateWindow (
HWND hWnd, //窗口句柄
);
成功返回TRUE,失败返回FALSE
7.消息循环,重复执行提取消息、翻译消息、派发消息
1)提取消息
BOOL GetMessage (
LPMSG lpMsg, //消息结构体
HWND hWnd, //窗口句柄(为了获取特定窗口定制的,一般为NULL)
UINT wMsgFilterMin, //起始消息
UINT wMsgFilterMax //终止消息(消息的范围)
);
LPMSG 消息结构体
收到WM_QUIT 消息返回FALSE,其他情况一律返回TRUE
2)翻译消息
BOOL TravslateMessage (
const MSG* lpMsg //消息结构
);
有消息被翻译返回TRUE,否则返回FALSE
3)派发消息
LRESULT DispatchMessage (
const MSG* lpMsg //消息结构体
);
派发给窗口过程函数
返回窗口过程函数的返回值。
8.处理消息