初学C++时,控制台会给我们提供一个黑窗口,而这篇文章所做的就是:创建一个属于图形界面窗口,而不是使用控制台黑窗口
如图,这是一个标题为XSZY的窗口
这都是自定义的
所有有关视窗的基本函数和类型都定义在头文件 <windows.h> 中
我们只需要引用就好了
//引用头文件 windows.h
#include<windows.h>
然后定义程序的入口函数main
int __stdcall WinMain(HINSTANCE hInst,
HINSTANCE hPrev,
LPSTR lpCmdLine,
int nCmdShow)
{
}
说到这个入口函数,其实使用main()也是可以的
int main() {
}
int main(int argc, char** argv) {
}
int main(int argc, char* argv[]) {
}
其实C++定义了很多程序入口,只要程序中包含其中一个,程序就可以运行了
而WinMain的声明同样也是有依据可寻的
在头文件 <winbase.h> 中, 有这样两句话
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);
int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd);
它们分别声明了两种程序入口
WinMain 和 wWinMain
wWinMain 是 WinMain 的宽字符版本, 形参列表中的LPWSTR说明了这个事实
顺带说一下吧 基本所有的函数、类型、结构体、宏等都带有A 和 W,
比如 WNDCLASSA 和 WNDCLASSW
一般A是窄字符, W是宽字符
LPSTR 其实就是 char* ; 而LPWSTR 是 wchar_t*
表示宽字符时需要标记L
比如定义宽字符串HelloWorld应该写为 L"HelloWorld!" ,系统就会识别为宽字符了
说了这么多,该定义窗口实例句柄了
这是用来指向一个实例( instance ) 的类型 HINSTANCE
前缀H就是Handle句柄的意思, instance就是实例的意思
这个句柄的作用就是:指定一个窗口实例
如果你使用的时WinMain,那么可以选择直接使用形参表中的第一个或第二个参数,但是如果你使用的时int main(),那么就需要定义一个新的实例句柄
int WINAPI WinMain(HINSTANCE hInst, //可以使用这个
HINSTANCE hPrev, //也可以使用这个(习惯上使用上面的)
LPSTR lpCmdLine,
int nShowCmd)
{
}
int main()
{
HINSTANCE hInst; //定一个新的实例句柄
}
定义来有什么用呢?
我们需要做一个窗口,就需要创建它,而定义它的标准,是由结构体WNDCLASS来完成的,能够让窗口和窗口结构体链接上的,需要实例句柄一致,并且和窗口类名一致
窗口类在 <winuser.h> 中的定义
typedef struct tagWNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASSA,*PWNDCLASSA,*NPWNDCLASSA,*LPWNDCLASSA;
typedef struct tagWNDCLASSW {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HIN