Win32 API子窗口输入时频繁闪烁问题求助
解决Win32 API子窗口频繁闪烁问题
核心问题根源
你的窗口过程中WM_COMMAND分支没有添加break语句,导致每次处理完按钮点击的WM_COMMAND消息后,代码会继续向下执行到WM_CREATE分支,重复创建所有子控件——这就是所有子窗口频繁闪烁的直接原因。
具体修复步骤
修复switch分支断裂问题
在WM_COMMAND分支的末尾添加break;,阻止代码执行后续的WM_CREATE分支:case WM_COMMAND: switch(wp){ case CONVERT_TAX: // ... 原有代码 break; } break; // 新增这行,跳出WM_COMMAND分支统一Unicode字符集调用
代码中混用了ANSI版本的GetWindowText和Unicode版本的CreateWindowW,会导致字符串处理异常,需统一使用宽字符版本的API:- 将
char Tax[100];改为wchar_t Tax[100]; - 将
GetWindowText(hTax,Tax,100);改为GetWindowTextW(hTax,Tax,100); - 将
SetWindowText(hOut,Tax);改为SetWindowTextW(hOut,Tax);
- 将
优化窗口样式减少闪烁(可选)
给窗口类添加CS_HREDRAW | CS_VREDRAW样式,确保窗口大小变化时正确重绘;同时处理WM_ERASEBKGND消息,避免不必要的背景擦除:// 窗口类初始化时添加样式 wc.style = CS_HREDRAW | CS_VREDRAW; // 在窗口过程中添加WM_ERASEBKGND分支 case WM_ERASEBKGND: return TRUE; // 跳过背景擦除,减少闪烁
修复后的完整代码
#include <windows.h> #include <wchar.h> #include <stdlib.h> #define CONVERT_TAX 1 LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM); void AddControls(HWND hWnd); int TaxConversion(int TaxRate); HWND hOut; HWND hTax; int WINAPI WinMain(HINSTANCE hInst, HINSTANCE vPrevInst,LPSTR args, int ncmdshow){ WNDCLASSW wc ={}; wc.hIcon=LoadIcon(NULL, IDI_APPLICATION); wc.cbWndExtra=0; wc.cbClsExtra=0; wc.style=CS_HREDRAW | CS_VREDRAW; // 添加重绘样式 wc.hbrBackground=(HBRUSH)COLOR_WINDOW; wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hInstance=hInst; wc.lpszClassName=L"myWindowClass"; wc.lpfnWndProc=WindowProcedure; if(!RegisterClassW(&wc)) return -1; CreateWindowW(L"myWindowClass",L"My Window",WS_OVERLAPPEDWINDOW|WS_VISIBLE,500,500,500,500,NULL,NULL,NULL,NULL); MSG msg = {0}; while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){ switch(msg){ case WM_COMMAND: switch(wp){ case CONVERT_TAX: wchar_t Tax[100]; GetWindowTextW(hTax,Tax,100); SetWindowTextW(hOut,Tax); break; } break; // 新增break,避免执行WM_CREATE case WM_CREATE: AddControls(hWnd); break; case WM_ERASEBKGND: return TRUE; // 跳过背景擦除,减少闪烁 case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProcW(hWnd,msg,wp,lp); } return 0; } void AddControls(HWND hWnd){ CreateWindowW(L"Static",L"Enter Tax Rate",WS_CHILD|WS_VISIBLE,1,1,90,20,hWnd,0,0,0); // 调整控件大小更合理 hTax=CreateWindowW(L"Edit",L"",WS_CHILD|WS_BORDER|WS_VISIBLE,1,30,90,25,hWnd,0,0,0); CreateWindowW(L"Button",L"Find Amount",WS_CHILD|WS_BORDER|WS_VISIBLE,1,65,90,25,hWnd,(HMENU)CONVERT_TAX,0,0); hOut=CreateWindowW(L"Edit",L"",WS_CHILD|WS_BORDER|WS_VISIBLE,1,100,90,25,hWnd,0,0,0); }
内容的提问来源于stack exchange,提问作者Rezno
相关产品推荐
相关产品推荐

