WNDCLASS中style字段的取值(wndclass.style的取值)

WNDCLASS 结构体的 style 字段用来指定所创建的窗口的风格,它的取值如下表(也可以是多个值的组合):
在这里插入图片描述

记住这么多取值简直是一个噩梦,一般窗口常用的取值为CS_HREDRAW | CS_VREDRAW,表示窗口位置或大小改变时发生重绘,产生WM_PAINT消息。

观察上表可以发现,WNDCLASS 结构体中的 style 字段的取值都是以CS开头的,CS 是Class Style的缩写,意思是窗口类风格。

窗口样式需要在两个地方指定,一个是窗口类 WNDCLASSstyle 字段,另一个是 CreateWindow 函数的 dwStyle 参数

#include <windows.h> //窗口处理函数WndProc()的声明 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //主函数,程序的入口,相当于之前的main()函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[] = "HelloWin"; HWND hwnd; MSG msg; WNDCLASS wndclass;//WNDCLASSEX也行,会多几个分量,配合RegisterClassEX使用 //设置WNDCLASS结构体,为下一步调用RegisterClass()函数做准备 wndclass.style = CS_HREDRAW | CS_VREDRAW;//支持重绘,不能为0 wndclass.lpfnWndProc = (WNDPROC)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); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; //注册 if (!RegisterClass(&wndclass)) { MessageBox(NULL, "This program requires Windows NT!", szAppName, MB_ICONERROR); return 0; } //调用CreateWindow()函数创建窗体 hwnd = CreateWindow (szAppName, // window class name "The Windows Program", // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters //显示和更新窗口 ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); //消息循环,不停接收消息直至收到WM_QUIT消息后,跳出循环,程序结束 while(GetMessage(&msg, NULL, 0, 0))//如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零 { TranslateMessage(&msg);//翻译消息,将按键消息转换为字符消息 DispatchMessage(&msg);//以此消息为参数转发给相应的窗口消息处理程序 } return msg.wParam; } //窗口处理函数,函数格式固定,函数名无所谓 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { //Code 使用以上的框架代码,编写程序,要求不断变换窗口屏幕中的颜色,以红橙黄绿青蓝紫的顺序依次变换,间隔0.5秒,不断循环
最新发布
03-12
要在提供的Windows应用程序框架中实现窗口背景颜色按照红、橙、黄、绿、青、蓝、紫的颜色序列每隔0.5秒变化一次,你需要添加一个定时机制,并修改窗口过程函数(`WndProc`),以便响应这个计时器并改变窗口的背景色。 下面是经过改动后的代码: ```cpp #include <windows.h> #include <vector> // 窗口处理函数 WndProc 的声明 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); std::vector<COLORREF> colors{ RGB(255, 0, 0), //红色 RGB(255, 165, 0), //橘色 RGB(255, 255, 0), //黄色 RGB(0, 255, 0), //绿色 RGB(0, 128, 128), //青色 RGB(0, 0, 255), //蓝色 RGB(75, 0, 130) }; //紫色 COLORREF currentColorIndex = 0; // 主函数... int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); HWND hwnd; MSG msg; WNDCLASS wndclass; // 设置WNDCLASS 结构体... wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = (WNDPROC)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)(WHITE_BRUSH + 1); // 默认白色背景 wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, _T("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, _T("The Windows Program"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); SetTimer(hwnd, 1, 500, nullptr); // 每隔半秒钟触发消息 WM_TIMER while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } KillTimer(hwnd, 1); return msg.wParam; } // 定义窗口过程. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (message) { case WM_CREATE: break; case WM_PAINT: hdc = BeginPaint(hwnd,&ps ); FillRect(hdc , &ps.rcPaint ,(HBRUSH )(currentColorIndex+1)); EndPaint(hwnd, &ps ); break; case WM_TIMER: ++currentColorIndex %= colors.size(); InvalidateRect(hwnd, NULL, TRUE); // 请求重绘整个客户区,使得 WM_PAINT 被触发。 break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); } return 0; } ``` 这里有几个关键点需要注意: * 创建了一个包含RGB色彩值的标准向量 `colors`,用于存储我们想要交替使用的颜色列表。 * 使用了变量 `currentColorIndex` 来跟踪当前应该显示哪种颜色。 * 当收到 `WM_TIMER` 消息时增加索引并且刷新整个客户端区域以迫使系统发送新的 `WM_PAINT`. * 在 `WM_PAINT` 中填充矩形的时候指定了最新的刷子样式作为画布底色。 这种做法可以让你的窗口每过半个钟头就会自动切换到下一个预设好的颜色上去了。如果你运行这段代码,在创建好窗口之后它将会开始周期性的更改其背景颜色直到关闭为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值