经典Hello Word窗口表示,可视化编程入门。

  • Post author:
  • Post category:其他


很多同学在学习了C++后,会发现,我们用C++控制台写出的程序,总觉得不是我们想要的样子,每次运行程序都只是出现一个黑窗口,一点也不美观,,我们学习C++,大多数的同学都是想要自己写一些小游戏,如果要自己写小游戏,只有C++基础是不够的,现在的游戏大多都是有自己的窗口,在窗口中还有很多的菜单按钮,这就涉及到另一个概念——Windows窗口可视化编程。Windows可视化编程就是我们在电脑上的APP的样子。下面我们就来初步认识一下Windows窗口可视化编程。


目录


可视化编程代码结构包含


头文件:


程序入口点:


窗口设计:


WNDCLASSEX注册:


窗口创建命令:


完整代码如下


运行结果:


可视化编程代码结构包含

头文件:

和C++控制台程序中的#include <iosteam>一样的原理。

//定义宏
#include <windows.h>
#include <tchar.h>
#include <stdlib.h>
#include <string.h>

程序入口点:

在控制台应用程序中我们的程序始终是从mian函数开始的,同样的在可视化编程的过程中,我们也需要一个节点来识别程序的开始,这个开始的标志就是

WinMain

函数,具体结构如下

int CALLBACK WinMain(
_In_HINSTANCE hInstance,
_In_HINSTANCE hPrevInstance,
_In_LPSTR lpCmdline,
_In_int nCmdShow
);

窗口设计:

在这些前期准备条件介绍完之后我们就可以开始设计我们想要的窗口类了,

窗口信息:所谓的窗口信息就是在Win Main函数中添加功能,在窗口信息中我们可以自己定义自己心中的窗口样式,包括窗口的大小,窗口的颜色,窗口图标,窗口名称等等。在窗口设计中我们要用到的结构如下。

WNDCLASSEX wcex;

wcex.cbSize         = sizeof(WNDCLASSEX);
wcex.style          = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc    = WndProc;
wcex.cbClsExtra     = 0;
wcex.cbWndExtra     = 0;
wcex.hInstance      = hInstance;
wcex.hIcon          = LoadIcon(wcex.hInstance, IDI_APPLICATION);
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName   = NULL;
wcex.lpszClassName  = szWindowClass;
wcex.hIconSm        = LoadIcon(wcex.hInstance, IDI_APPLICATION);

WNDCLASSEX注册:

好现在我们已经用代码将窗口的基本信息表现出来了,想要将这个窗口在Windows桌面展示出来,有一个前期准备过程。

我们就要将结构WNDCLASSEX注册到Windows,我们就要用到函数RegisterClassEx,具体形式如下

if (!RegisterClassEx(&wcex))
{
   MessageBox(NULL,
      _T("Call to RegisterClassEx failed!"),
      _T("Windows Desktop Guided Tour"),
      NULL);

   return 1;
}

窗口创建命令:

现在我们可以创建窗口了使用CreateWindowEx函数,

static TCHAR szWindowClass[] = _T("DesktopApp");
static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application");
//窗口名称,双引号中可以自定义窗口名称。
HWND hWnd = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,
   szWindowClass,
   szTitle,
   WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT, CW_USEDEFAULT,
   500, 100,
   NULL,
   NULL,
   hInstance,
   NULL
);
if (!hWnd)
{
   MessageBox(NULL,
      _T("Call to CreateWindowEx failed!"),
      _T("Windows Desktop Guided Tour"),
      NULL);

   return 1;
}

现在窗口已经创建,我们要告诉Windows使窗口可见。代码如下


ShowWindow(hWnd,
   nCmdShow);
UpdateWindow(hWnd);

细心的同学会发现,在上面的过程中,我们只讲到了窗口的创建,还没有提到窗口的交互。下面我们就来简单的了解窗口的交互,窗口的交互在计算机看来就是消息的处理。代码如下

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}

return (int) msg.wParam;

好的,截至当前我们已经简单的了解了Windows可视化编程的大概结构,想要创建更加漂亮的窗口,这点知识肯定使不够的,但是我们已经了解想要用C++写一个属于自己的小游戏的基础和原理。想要了解更多的Windows窗口编程可以关注我。我将从0开始为大家讲解过程。

完整代码如下

#include<Windows.h>
#include<tchar.h>
#include <stdlib.h>
#include <string.h>

static TCHAR szWindowClass[] = _T("My Class");
static TCHAR szTitle[] = _T("Windows应用程序");

HINSTANCE hInst;

LRESULT CALLBACK WindowProc(
	_In_ HWND hwnd,
	_In_ UINT uMsg,
	_In_ WPARAM wParam,
	_In_ LPARAM lParam
);

int CALLBACK WinMain(
	_In_ HINSTANCE hInstance,
	_In_ HINSTANCE hPrevInstance,
	_In_ LPSTR lpCmdLine,
	_In_ int nCmdShow
) {
	WNDCLASSEX wcex;
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WindowProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = szWindowClass;
	wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);
	if (!RegisterClassEx(&wcex)) {
		MessageBox(NULL,
			_T("Call to RegisterClassEx failed!"),
			_T("Windows Desktop Guided Tour"),
			NULL);
		return 1;
	}


	hInst = hInstance;


	HWND hWnd = CreateWindow(
		szWindowClass,
		szTitle,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT,
		500, 100,
		NULL,
		NULL,
		hInstance,
		NULL
	);
	if (!hWnd)
	{
		MessageBox(NULL,
			_T("Call to CreateWindow failed!"),
			_T("Windows Desktop Guided Tour"),
			NULL);

		return 1;
	}

	ShowWindow(hWnd,
		nCmdShow);
	UpdateWindow(hWnd);

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(
	_In_ HWND hwnd,
	_In_ UINT uMsg,
	_In_ WPARAM wParam,
	_In_ LPARAM lParam
) {
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR greeting[] = _T("Hello World!");

	switch (uMsg)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		TextOut(hdc,
			5, 5,
			greeting, _tcslen(greeting));

		EndPaint(hwnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);
		break;
	}
	return 0;
}

运行结果: