windows编程基础(一)
APIENTRY(WINAPI)也就是 _stacall(一种调用约定,让编译器知道以windows兼容的方式来产生机器指令)
_In_ _Out_ _In_opt_ _Out_opt_这些都是标识用的,给我们看的,可有可无
_In_ :用来提示该参数是一个输入值,调用该函数的时候应该给这个函数传一个值
_Out_ :用来提示该参数是一个输出值,函数结束后可能将结果返回到该参数中
_In_opt_ :可以选择,可以有输入值,也可以没有
Out_opt_:可以选择,可以有输出值,也可以没哟
句柄:句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows使用了大量的句柄来标志很多对象。
HINSTANCE hInstance:当前应用程序实例句柄
HINSTANCE hPrevInstance:上一个应用程序实例句柄,在Win32中永远为空
LPTSTR lpCmdLine:命令行参数,可以用命令提示符打开程序的时候输入对该参数赋值,也可以对该程序的.exe快捷方式右键选择属性->快捷方式->目标,在目标的后面输入
nCmdShow:窗口显示格式
LPARAM(long);
WPARAM(unsigned int);
这两个一般用于参数,并且一般用于回调函数的参数;
数据类型:
typedef int INT
typedef float FLOAT
typedef long LONG
typedef short SHORT
typedef char CHAR
typedef unsigned int UINT
typedef unsigned int UINT32
typedef signed int INT32
typedef unsigned long DWORD
typedef unsigned short WORD
CHAR(char);
WCHAR(wchar_t);
TCHAR(CHAR;WCHAR);
LPSTR(CHAR *);
LPWSTR(WCHAR *);
LPTSTR(LPSTR; LPWSTR);
LPCSTR(const CHAR *);
LPCWSTR(const WCHAR *);
LPCTSTR(LPCSTR, LPCWSTR);
因为微软有ASCLL和UNICODE两种字符形式,所以加T的类型是通用类型,根据设置的不同,代表的类型不同
窗口:窗口是windows系统和用户交互的接口,每一个应用程序都至少有一个窗口,称为主窗口,平常我们打开一个应用程序就可以看到一个窗口了,窗口一般包括:菜单栏,状态栏,工具栏,客户区。
windows程序是基于事件驱动的,程序和系统之间的通信是通过消息来进行的
事件:是由用户触发的动作
消息:是操作系统捕获用户的动作,然后生成消息,传给应用程序的消息队列中,让应用程序从消息队列中取出消息,做出响应;消息也可以由操作系统产生或者由另一个消息产生
在Windows编程中调出控制台程序的方法:
AllocConsole(); //申请一个控制台
freopen("conin$", "w", stdin);
freopen("conout$", "w", stdout);
FreeConsole(); //释放控制台
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,"r"表示"只读访问"、"w"表示"只写访问"、"a"表示"追加写入"。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。
Windows程序中消息的表现实现:MSG结构体
/*
typedef struct tagMSG {
HWND hwnd; //产生消息的窗口句柄
UINT message; //消息的类型,WM_开头的是消息类型
WPARAM wParam; //参数,消息的扩展的信息
LPARAM lParam; //参数,消息的扩展的信息 不同的消息,这个信息可能不一样,代表的意义也不一样
DWORD time; //消息投递的时间
POINT pt; //消息投递时鼠标的坐标
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG,
*/
窗口的创建:设计窗口,
注册窗口:RegisterClassEx(const WNDCLASSEX*)
创建窗口:CreateWindows(…);
显示窗口:ShowWindows(HWND, int nCmdShow)
更新窗口: UpdateWindow(HWND);
注销窗口,
消息循环:
//消息循环
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //将虚拟键消息转化为字符消息
DispatchMessage(&msg); //分布一个消息给窗口程序
}
消息过程函数除了上面那种写法
还有一个种写法
while (msg.message!=WM_QUIT)
{
if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//在没有消息处理的时候,程序所作出的响应。
}
}
消息处理:主要由窗口类中的WNDPROC lpfnWndProc处理;
窗口类:WNDCLASSEX
typedef struct tagWNDCLASSEXW {
UINT cbSize; //结构体的大小
UINT style; //窗口的风格样式
WNDPROC lpfnWndProc; //函数指针,窗口过程函数(消息处理)
int cbClsExtra; //窗口类的附加内存(一般为0)
int cbWndExtra; //窗口附加内存(一般为0)
HINSTANCE hInstance; //程序实例句柄
HICON hIcon; //图标句柄
HCURSOR hCursor; //光标句柄
HBRUSH hbrBackground; //背景画刷句柄
LPCWSTR lpszMenuName; //菜单资源名句柄
LPCWSTR lpszClassName; //窗口类的名字(自定义的)
HICON hIconSm; //小图标句柄(托盘图标)
} WNDCLASSEX
GetStockObject,Windows API函数。该函式检索预定义的备用笔、刷子、字体或者调色板的句柄。
LoadCursor,是一个函数功能,该函数从一个与应用事例相关的可执行文件(EXE文件)中载入指定的光标资源。
DefWindowProc函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。
LRESULT DefWindowProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
PostQuitMessage,函数名。该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息,PostQuitMessage寄送一个WM_QUIT消息给线程的消息队列并立即返回;此函数向系统表明有个线程请求在随后的某一时间终止。
函数GetMessage 是 从调用线程的消息队列里取得一个消息并将其放于指定的结构,函数会一直等待直到有消息到来才有返回值,如果消息为WM_QUIT,返回值为0,退出循环
当需要去掉一个有多个属性的变量名需要去掉一个属性的时候,做与运算,与上这个属性的取反,例如WS_OVERLAPPEDWINDOW&~WS_THICKFRAME