Win32 C++开发记事本如何实现点击按钮清空EDIT文本框
问题根源
你的代码卡顿的核心原因是:你把编辑框的创建代码直接放在了WndProc函数的最开头,没有绑定到任何消息触发逻辑。WndProc是窗口的消息回调函数,系统会持续向它发送各类消息(鼠标移动、窗口重绘、菜单点击等,每秒可达几十上百次),相当于你每次处理任意消息都会新建一个编辑框叠在原有窗口上,创建的窗口数量越来越多,最终导致卡顿。
而你把编辑框放在WinMain里的时候无法操作,是因为编辑框句柄是WinMain的局部变量,WndProc里无法访问到这个值。
解决方案
只需要做3处简单修改即可解决问题:
- 新增全局变量存储编辑框句柄,方便
WndProc全流程访问 - 把编辑框创建逻辑移到
WM_CREATE消息中,仅在主窗口初始化时创建一次编辑框 - 清空操作直接调用全局的编辑框句柄即可
修改后的完整代码
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c #include <windows.h> #include <stdlib.h> #include <string.h> #include <tchar.h> // Global variables HMENU menuStrip; HWND hWndEdit; // 新增:全局变量存储编辑框句柄 // The main window class name. static TCHAR szWindowClass[] = _T("DesktopApp"); // The string that appears in the application's title bar. static TCHAR szTitle[] = _T("NoteRecorder"); HINSTANCE hInst; // Forward declarations of functions included in this code module: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void AddMenuStrip(HWND hWnd); int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(wcex.hInstance, L""); wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION); if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Windows Desktop Guided Tour"), NULL); return 1; } hInst = hInstance; // Height and width int x = 1366; int y = 768; HWND hWnd = CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, x, y, NULL, NULL, hInstance, NULL ); if (!hWnd) { MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("NoteRecorder"), NULL); return 1; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // Main message loop: MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // 删掉原来放在这里的编辑框创建代码 switch (message) { case WM_COMMAND: switch (wParam) { case 11: SetWindowText(hWndEdit, _T("")); MessageBox(NULL, _T("The function has executed successfully."), _T("NoteRecorder"), MB_ICONASTERISK); break; case 12: break; case 13: break; case 14: break; case 15: break; case 21: break; case 22: break; case 23: break; case 24: break; case 25: break; case 26: break; case 31: break; case 41: break; case 42: break; } break; case WM_CREATE: AddMenuStrip(hWnd); // 编辑框仅在窗口初始化时创建一次 hWndEdit = CreateWindow(TEXT("EDIT"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL | ES_MULTILINE, 0, 0, 1366, 768, hWnd, NULL, hInst, NULL); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0; } void AddMenuStrip(HWND hWnd) { menuStrip = CreateMenu(); HMENU fileMenu = CreateMenu(); AppendMenu(fileMenu, MF_STRING, 11, L"New"); AppendMenu(fileMenu, MF_STRING, 12, L"Open"); AppendMenu(fileMenu, MF_STRING, 13, L"Save"); AppendMenu(fileMenu, MF_STRING, 14, L"Save As"); AppendMenu(fileMenu, MF_SEPARATOR, NULL, NULL); AppendMenu(fileMenu, MF_STRING, 15, L"Exit"); HMENU editMenu = CreateMenu(); AppendMenu(editMenu, MF_STRING, 21, L"Undo"); AppendMenu(editMenu, MF_STRING, 22, L"Redo"); AppendMenu(editMenu, MF_SEPARATOR, NULL, NULL); AppendMenu(editMenu, MF_STRING, 23, L"Cut"); AppendMenu(editMenu, MF_STRING, 24, L"Copy"); AppendMenu(editMenu, MF_STRING, 25, L"Paste"); AppendMenu(editMenu, MF_SEPARATOR, NULL, NULL); AppendMenu(editMenu, MF_STRING, 26, L"Select All"); HMENU formatMenu = CreateMenu(); AppendMenu(formatMenu, MF_BYCOMMAND, 31, L"Font..."); HMENU helpMenu = CreateMenu(); AppendMenu(helpMenu, MF_STRING, 41, L"Get Help"); AppendMenu(helpMenu, MF_SEPARATOR, NULL, NULL); AppendMenu(helpMenu, MF_STRING, 42, L"About WorkPlace 247..."); AppendMenu(menuStrip, MF_POPUP, (UINT_PTR)fileMenu, L"File"); AppendMenu(menuStrip, MF_POPUP, (UINT_PTR)editMenu, L"Edit"); AppendMenu(menuStrip, MF_POPUP, (UINT_PTR)formatMenu, L"Format"); AppendMenu(menuStrip, MF_POPUP, (UINT_PTR)helpMenu, L"Help"); SetMenu(hWnd, menuStrip); }
额外优化说明
修改代码里还修正了原来的笔误:把不存在的WB_LEFT样式换成了编辑框正确的ES_LEFT样式,同时传入了正确的实例句柄hInst,避免潜在的创建失败问题。
内容的提问来源于stack exchange,提问作者user16709023
相关产品推荐
相关产品推荐

