https://blog.csdn.net/zb774095236/article/details/108291755
1.百度云:https://pan.baidu.com/s/1B0YuPWgSxvLTHk59STzQQQ 提取码:1ins
学习目标:
在Win32API-13-14-窗口关闭和窗口显示文字版本上尝试使用各种不同的字体来进行不同的字体显示
一、 项目参考
新增函数解释 CreateFont SetRect SelectObject DeleteObject
1. https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createfonta Microsoft官方函数文档
2. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setrect Microsoft官方函数文档
3. https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-selectobject Microsoft官方函数文档
4. https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-selectobject Microsoft官方函数文档
5.https://blog.csdn.net/caimouse/article/details/1770966 大牛的Win32系列
6.https://blog.csdn.net/caimouse/article/details/1773850 大牛的Win32系列
二. 在往期模板上修改和新增的步骤 1.代码段
//库文件 #include "Windows.h" #include "tchar.h" #define New_Add 0x01 //后续将采用宏定义的方式来标记新增代码段 LRESULT CALLBACK MainWndProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam) // second message parameter { PAINTSTRUCT ps; HDC hdc; #if New_Add COLORREF crOld; RECT rect; HFONT hFont; int nOldMode; #endif switch (uMsg) { case WM_CREATE: // Initialize the window. return 0; case WM_PAINT: // Paint the window's client area. hdc = BeginPaint(hwnd, &ps); //TextOut(hdc, 0, 0, _T("Hello, Windows!"), 15);//注释了 #if New_Add //逻辑单元是与设备相关的像素,因此这将创建一个48像素高的逻辑字体的句柄。 //宽度设置为0时,字体映射器会选择最接近的匹配值。 //字体的正面名称将受到影响 hFont = CreateFont(48, 0, 0, 0, FW_DONTCARE, FALSE, TRUE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, TEXT("Impact")); SelectObject(hdc, hFont); //设置文本要在其中进行格式化的矩形的坐标. SetRect(&rect, 100, 100, 700, 200); SetTextColor(hdc, RGB(255, 0, 0)); DrawText(hdc, TEXT("Drawing Text with Impact"), -1, &rect, DT_NOCLIP); //逻辑单元是与设备相关的像素,因此这将创建一个36像素高的逻辑字体的句柄。 //当宽度设置为20时,字体映射器将选择一种字体,在本例中,这种字体是拉伸的。 //字体名称为Times New Roman。此时旋转角度为-300十分之一度(-30度) hFont = CreateFont(36, 20, -300, 0, FW_DONTCARE, FALSE, TRUE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, TEXT("Times New Roman")); SelectObject(hdc, hFont); //设置文本要在其中进行格式化的矩形的坐标. SetRect(&rect, 100, 200, 500, 300); SetTextColor(hdc, RGB(0, 128, 0)); DrawText(hdc, TEXT("Drawing Text with Times New Roman"), -1, &rect, DT_NOCLIP); //逻辑单元是与设备相关的像素,因此这将创建一个36像素高的逻辑字体的句柄。 //当宽度设置为10时,字体映射器将选择一种字体,在本例中,这种字体是被压缩的。 //字体名称为Arial。此时的旋转角度为250 / 10度(25度) hFont = CreateFont(36, 10, 250, 0, FW_DONTCARE, FALSE, TRUE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, TEXT("Arial")); SelectObject(hdc, hFont); //设置文本要在其中格式化的矩形的坐标。 SetRect(&rect, 500, 200, 1400, 600); SetTextColor(hdc, RGB(0, 0, 255)); DrawText(hdc, TEXT("Drawing Text with Arial"), -1, &rect, DT_NOCLIP); DeleteObject(hFont); #endif EndPaint(hwnd, &ps); return 0; case WM_SIZE: // Set the size and position of the window. return 0; case WM_DESTROY: // Clean up window-specific data objects. PostQuitMessage(0); return 0; // // Process other messages. // default: return DefWindowProc(hwnd, uMsg, wParam, lParam);//系统的默认消息处理函数 } return 0; } //定义WinMain的入口 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { //没有这些参数也不会发生警告 //UNREFERENCED_PARAMETER(hInstance); UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); //UNREFERENCED_PARAMETER(nCmdShow); WNDCLASS wc; //创建窗口类对象 //1.对窗口类的各属性进行初始化 wc.style = CS_HREDRAW | CS_VREDRAW; /*窗口类的风格,CS前缀,C表示Class,S表示 Style,这里使用了水平和垂直风格*/ wc.lpfnWndProc = MainWndProc; /*这里将回到函数的名字赋值用以windows后面回调*/ wc.cbClsExtra = 0; //附加参数,通常情况下为0 wc.cbWndExtra = 0; //附加参数,通常情况下为0 wc.hInstance = hInstance; //窗口句柄,这里将WinMain中的hInstance句柄赋值就可 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /*窗口图标,LoadIcon()是加载图标,这里是加载一个系统资源图标,LoadIcon()的原型是HICON LoadIcon(HINSTANCE, LPCSTR);*/ wc.hCursor = LoadCursor(NULL, IDC_ARROW); /*加载鼠标,同上相似*/ wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); /*窗口画刷,这里是使用的白色画刷,所以创建出来的窗口的背景颜色则是白色的*/ wc.lpszMenuName = _T("MainMenu"); //窗口菜单名称,这里没有菜单,设为NULL wc.lpszClassName = _T("MainWindowClass"); //窗口类名称,这个窗口类名称可作为这个窗口的唯一标识 /*注册窗口类*/ if (!RegisterClass(&wc)) { //注册窗口类失败时,弹出提示 MessageBox(NULL, TEXT("This program requires Window NT!"), _T("MainWindowClass"), MB_ICONERROR); return FALSE; } /*创建窗口 HWND CreateWindow( LPCTSTR lpClassName, //窗口类名 LPCTSTR lpWindowName, //窗口标题 DWORD dwStyle, //窗口风格,WS开头 int x, //窗口左上角x坐标 int y, //窗口左上角y坐标 int nWidth, //窗口宽度 int nHeight, //窗口高度 HWND hWndParent, //父窗口句柄 HMENU hMenu, //菜单句柄 HANDLE hlnstance, //窗口句柄 LPVOID lpParam); //改值会传递给窗口WM_CREATE消息的一个参数 */ HWND hwnd; //2.创建窗口函数CreateWindow()会返回一个HWND句柄,这里定义下,用来接收这个句柄 hwnd = CreateWindow(_T("MainWindowClass"), //窗口类名 TEXT(" Hello Win32API"), //窗口标题,会在窗口的左上角标题栏显示 WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, //窗口风格 CW_USEDEFAULT, //窗口左上角x位置,这里使用的系统默认值,可自定义 CW_USEDEFAULT, //窗口左上角y位置 CW_USEDEFAULT, //窗口的宽度 CW_USEDEFAULT, //窗口的高度 NULL, //该窗口的父窗口或所有者窗口的句柄,这里用不到,设为NULL NULL, //窗口菜单句柄,这里没有菜单,设置为NULL hInstance, //窗口句柄 NULL //传递给窗口WM_CREATE消息的一个参数,这里不用,设置为NULL ); /*3.显示窗口,显示方式使用WinMain的参数*/ ShowWindow(hwnd, nCmdShow); /*4.更新窗口*/ UpdateWindow(hwnd); MSG msg; // 5.主消息循环: while (GetMessage(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }1.百度云:https://pan.baidu.com/s/1CRxjekDJ8TvhX_8sBNG3Xw 提取码:lutz
你可以通过查找宏 New_Add 来发现新增的代码段