C++调用API初步创建Windows窗口程序

首先在进行介绍前,先介绍一下api,个人理解,api是在windows.h中提供的一些封装好的函数。

创建一个窗口程序的一般步骤是先注册一个窗口类名,然后再创建一个窗口,传递信息进行处理(窗口的操作都是通过信息传递来实现的)

下面介绍几个要用到api函数

RegistetClass()  //该函数只有一个参数,是一个指向WNDCLASS结构的指针

//该函数用来注册一个窗口类

WNDCLASS:一个包含了窗口类的全部信息的数据结构

typedef struct _WNDCLASS {
UINT style;// 窗口类型
WNDPROC lpfnWndProc;//窗口处理函数
int cbClsExtra;//窗口扩展
int cbWndExtra;//窗口实例扩展
HINSTANCE hInstance;//实例句柄
HICON hIcon;//窗口的最小化图标
HCURSOR hCursor;//窗口鼠标光标
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜单
LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;

CreateWindowEx()//该函数有多个参数,用来创建一个窗口

HWND CreateWindowEx(
DWORD DdwExStyle,        //窗口的扩展风格
LPCTSTR lpClassName,    //指向注册类名的指针
LPCTSTR lpWindowName,   //指向窗口名称的指针
DWORD dwStyle,          //窗口风格
int x,                  //窗口的水平位置
int y,                  //窗口的垂直位置
int nWidth,             //窗口的宽度
int nHeight,            //窗口的高度
HWND hWndParent,        //父窗口的句柄
HMENU hMenu,            //菜单的句柄或是子窗口的标识符
HINSTANCE hInstance,    //应用程序实例的句柄
LPVOID lpParam          //指向窗口的创建数据
);

ShowWindow(hwnd,bool)//该函数用来显示/隐藏窗口

接下来介绍一个结构体MSG,该结构体用来存储窗口传递的消息

 typedef struct tagMSG {
  HWND hwnd;
  UINT message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD time;
  POINT pt;
 } MSG;

GetMessage() //该函数用来从调用该函数的线程中取回一个与指定窗口相关联和由PostThreadMessage寄送的线程消息的消息,并将之从消息队列中删除,该函数会一直等到有消息取出才返回

GetMessage(
LPMSG lpMsg,//指向MSG结构的指针,该结构从线程的消息队列里接收消息信息
HWND hWnd,//取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
UINT wMsgFilterMin,//指定被检索的最小消息值的整数。可省略
UINT wMsgFilterMax//指定被检索的最大消息值的整数。可省略
)
//返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1

TranslateMessage(&MSG)//该函数将虚拟键消息转换为字符信息。字符消息将被寄送到调用线程的消息队列里

DispatchMessage(&MSG)//该函数分发一个消息给过程函数 lpfnWndProc,然后窗口进入消息处理阶段。

DefWindowProc(hwnd,MSG,lParam,wParam)//该函数用来处理所不想处理的消息,确保每个消息得到处理

下面介绍一个函数

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);//该函数就是处理消息的过程函数(回调函数)

下面是代码

#include<windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HINSTANCE hinhwnd = 0;
HWND editor = 0;
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdeShow)
{
	const wchar_t CLASS_NAME[] = L"test";//类名
	WNDCLASS wc = {};
	wc.style = 0;//缺省
	wc.cbClsExtra = 0;//缺省
	wc.cbWndExtra = 0;//缺省
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);//缺省
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);//箭头光标
	wc.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));//白色刷子
	wc.lpszMenuName = NULL;//无菜单
	wc.lpfnWndProc = WindowProc;//消息处理函数
	hinhwnd=wc.hInstance = hInstance;
	wc.lpszClassName = CLASS_NAME;
	
	RegisterClass(&wc);
	HWND hwnd = CreateWindowEx(
		0,
		CLASS_NAME,
		L"test",//标题
		WS_OVERLAPPEDWINDOW,//一般风格
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,//默认位置及尺寸
		NULL,
		NULL,
		hInstance,
		NULL
	);
	if (hwnd == NULL)
		return 0;
	ShowWindow(hwnd,1);
	MSG msg = {};
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}
	return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_DESTROY:
	{
		PostQuitMessage(0);
		return 0;
	}
	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hwnd, &ps);
		FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
		EndPaint(hwnd, &ps);

	}
	return 0;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

以上是运行效果,如果需要或许更多详细的API使用方法可以参考MSDN(虽然我一般选择百度)

个人建议,但是如果实在实在实在实在是搞不懂每个参数每句代码的意义的话,不要钻牛角尖,可以通过多接触这方面的知识后再来理解,毕竟这个只是第一个程序。

该程序运行系统为win10/运行工具为Visual Studio 2015








猜你喜欢

转载自blog.csdn.net/Dang_boy/article/details/72862621