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 来标识这个窗口对象即可。