You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32 C++开发记事本如何实现点击按钮清空EDIT文本框

问题根源

你的代码卡顿的核心原因是:你把编辑框的创建代码直接放在了WndProc函数的最开头,没有绑定到任何消息触发逻辑。WndProc是窗口的消息回调函数,系统会持续向它发送各类消息(鼠标移动、窗口重绘、菜单点击等,每秒可达几十上百次),相当于你每次处理任意消息都会新建一个编辑框叠在原有窗口上,创建的窗口数量越来越多,最终导致卡顿。
而你把编辑框放在WinMain里的时候无法操作,是因为编辑框句柄是WinMain的局部变量,WndProc里无法访问到这个值。

解决方案

只需要做3处简单修改即可解决问题:

  1. 新增全局变量存储编辑框句柄,方便WndProc全流程访问
  2. 把编辑框创建逻辑移到WM_CREATE消息中,仅在主窗口初始化时创建一次编辑框
  3. 清空操作直接调用全局的编辑框句柄即可

修改后的完整代码

// 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:48:01