2.创建窗口

windows是关于窗口,即window的编程,在这个系列学习中,我都是参考 C++技术网  的教学过程去学习的。

我参考的是 窗口创建的过程: http://www.cjjjs.com/paper/czxt/2015819111149987.html

加了我自己的注释的学习代码 WinMain.cpp:

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

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szExeName[] = _T("Win32");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass; //WNDCLASS结构体是窗口类的模板,定制得到窗口类wndclass

	/*------------------------------------初始化窗口的参数---------------------------------------*/
	wndclass.style = CS_HREDRAW | CS_VREDRAW; //wndclass是定制后得到的窗口类
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //hbrush  white_brush
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szExeName; //窗口类名,创建窗口的时候用来标识使用的窗口类

	if (!RegisterClass(&wndclass)) //1. 注册窗口类,必须要注册窗口类,我们才能创建我们自己的窗口
	{    //只有我们要根据我们自己定制的窗口类创建窗口时,才需要先注册窗口类
		MessageBox(NULL, _T("注册窗口类失败,此程序需要运行在Windows NT平台下。"), szExeName, MB_ICONERROR);
		//用     _T    可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。
		return 0;
	}

	hwnd = CreateWindow(szExeName, _T("我的窗口标题_C++技术网"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
	//2. createWindows函数 生成窗口,参数列表: windows_overlapped_window ,create_window_user_default, user_default
	// 利用wndclass模板生成了一个窗口对象 hwnd
	ShowWindow(hwnd, iCmdShow); //3. ShowWindow函数 显示窗口
	UpdateWindow(hwnd); //4. UpdateWindow 更新窗口

	while (GetMessage(&msg, NULL, 0, 0)) //5. 响应窗口:消息机制
	{
		TranslateMessage(&msg); //6. 转换消息的格式
		DispatchMessage(&msg); //7. 分发消息
	}
	return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//专门处理窗口消息,也就是窗口过程函数
{
	HDC hdc;
	PAINTSTRUCT ps; //paint_struct 绘画的结构体
	RECT rect; //rect
	static int i = 0;
	WCHAR szTip[100] = { 0 };
	switch (message)
	{
	case WM_CREATE: //windows_create
		MessageBox(NULL, _T("窗口正在创建"), _T("win32"), MB_ICONINFORMATION);
		SetTimer(hwnd, 0, 1000, NULL);
		return 0;
	case WM_PAINT: //window_paint
		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rect);
		if (i % 2)  //确定闪烁
			DrawText(hdc, _T("第一个Win32程序,终于见到了。 【程序代码见C++技术网的Windows零基础入门课程文章2.6节】"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		swprintf_s(szTip, _T("计时:%d"), i);
		DrawText(hdc, szTip, -1, &rect, DT_SINGLELINE | DT_CENTER); //drawtext_singleline 和 drawtext_center
		EndPaint(hwnd, &ps);
		return 0;
	case WM_DESTROY: //windows_destroy
		MessageBox(NULL, _T("程序即将结束!"), _T("win32"), MB_ICONINFORMATION);
		KillTimer(hwnd, 0); //使timer失效
		PostQuitMessage(0);
		return 0;
	case WM_TIMER: //window_timer
		GetClientRect(hwnd, &rect);
		InvalidateRect(hwnd, &rect, true);
		i++; //i计数
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}
其实这里的WinMain函数的几十行代码中,结构还是非常清晰的,主要是利用WNDCLASS结构体定制了一个自定义的wndclass的窗口类,然后我们就可以使用这个窗口类来实例化一个窗口对象了(是通过窗口类名来确定实例化的是哪个窗口类,仔细看代码~),然后再使用 hwnd 来标识这个窗口对象即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值