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

Win32程序Progress Bar不显示:代码错误排查求助

Win32进度条不显示问题排查

核心问题分析

你的代码存在几个关键错误,直接导致进度条无法正常显示:

  • 错误的初始化消息:WM_INITDIALOG是对话框窗口专属的初始化消息,但你用CreateWindowW创建的是普通窗口,普通窗口初始化时会收到WM_CREATE消息,因此放在WM_INITDIALOG分支里的进度条创建代码根本不会执行。
  • 未初始化的定时器ID:IDC_TIMER仅定义但未赋值,SetTimer使用未初始化的随机值,后续KillTimer可能无法正确停止定时器。
  • 窗口过程返回值缺失:除default分支外,其他消息处理后未返回对应的值,会导致窗口行为异常。
  • CreateWindow参数不规范:最后一个实例句柄参数传了NULL,规范写法应传入hInst。

修改后的代码片段

#include <iostream>
#include <Windows.h>
#include <CommCtrl.h>

// PB Defines
HINSTANCE hInstance;
HWND hProgress;
#define IDC_TIMER 1001 // 明确定时器ID常量
DWORD nCounter;

// Window #defines
#define WNDNAME L"ProgressBar"
#define WND_CLASS L"ProgressBarclass"

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

int main() {}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow) {
    hInstance = hInst;

    WNDCLASSW wc = { 0 };
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hInstance = hInst;
    wc.lpszClassName = WND_CLASS;
    wc.lpfnWndProc = WindowProcedure;

    if (!RegisterClassW(&wc)) {
        MessageBoxA(NULL, "Register Failed", "Register Failed", MB_OK);
        return 1;
    }
    
    // 修正实例句柄参数为hInst
    CreateWindowW(WND_CLASS, WNDNAME, WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,
                  625, 200, 650, 750, NULL, NULL, hInst, NULL);

    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, NULL, NULL)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
    switch (msg)
    {
    case WM_CREATE: { // 将进度条创建逻辑移到普通窗口的初始化消息分支
        hProgress = CreateWindowEx(0, PROGRESS_CLASS, (LPTSTR)NULL,
            WS_CHILD | WS_VISIBLE | PBS_SMOOTH, 45, 625, 300, 35,
            hWnd, (HMENU)0, hInstance, NULL);
        SendMessage(hProgress, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
        SendMessage(hProgress, PBM_SETSTEP, (WPARAM)10, 0);
        SetTimer(hWnd, IDC_TIMER, 100, 0);
        nCounter = 0;
        return 0; // 处理完成后返回0
    }
    case WM_TIMER: {
        nCounter++;
        SendMessage(hProgress, PBM_STEPIT, 0, 0);
        if (nCounter == 10) {
            KillTimer(hWnd, IDC_TIMER);
        }
        return 0; // 处理完成后返回0
    }
        
    case WM_DESTROY:
        PostQuitMessage(0); // 常规用法传0表示正常退出
        return 0;
        
    default:
        return DefWindowProcW(hWnd, msg, wp, lp);
    }
}

额外说明

  • 进度条的位置45, 625在主窗口高度(750)范围内,无需调整即可正常显示。
  • PostQuitMessage参数传0是Win32程序退出的常规写法,传-1虽不影响运行,但不符合规范。

内容的提问来源于stack exchange,提问作者clouded.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:52:19