Windows API一日一练(27)SetBkMode函数-让文字也能透明起来

tech2024-11-07  26

主目录传送门

https://blog.csdn.net/zb774095236/article/details/108291755

本次学习的源码模板下载:

1.百度云:https://pan.baidu.com/s/1B0YuPWgSxvLTHk59STzQQQ  提取码:1ins

学习目标:

在Win32API-13-14-窗口关闭和窗口显示文字版本上改变一块区域的背景色并且在输出文字时不会影响背景色

 


学习内容:

一、 项目参考  

新增函数解释 SetBkMode

1. https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setbkmode Microsoft官方函数文档

2.https://blog.csdn.net/caimouse/article/details/1768634  大牛的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 rcText; HBRUSH hbrush; 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 crOld = SetTextColor(hdc, RGB(255, 0, 0)); rcText.left = 10; rcText.top = 10; rcText.right = 300; rcText.bottom = 80; //创建黑色的画刷, hbrush = CreateSolidBrush(RGB(0, 0, 0)); //用黑色的画刷填充四边形的颜色. FillRect(hdc, &rcText, hbrush); //删除画刷. DeleteObject(hbrush); //显示字符串在四边形的中间位置. DrawText(hdc, _T("我不是透明的颜色"), 16, &rcText, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); rcText.left = 10; rcText.top = 10; rcText.right = 300; rcText.bottom = 40; //设置透明背景 nOldMode = SetBkMode(hdc, TRANSPARENT); //显示字符串在四边形的中间位置. DrawText(hdc, _T("我是透明的颜色"), 14, &rcText, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); //恢复原来的模式. SetBkMode(hdc, nOldMode); //恢复原来的颜色. SetTextColor(hdc, crOld); #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/1rfMZ0uORCjaCcIa5IFkjdw   提取码:ctpb

留在最后

      你可以通过查找宏 New_Add 来发现新增的代码段

最新回复(0)