PBS_MARQUEE Progressbar WinApi

前端 未结 1 503
遇见更好的自我
遇见更好的自我 2021-01-18 09:54

I\'m trying to get a progress bar of the type PBS_MARQUEE working. I can create the progress bar, but i just can\'t manage it to make it moving.

If found this, but i

1条回答
  •  一生所求
    2021-01-18 10:02

    The problem is that you are obliterating the window style. The error is the line:

    SetWindowLongPtr(hwndPB,GWL_STYLE,PBS_MARQUEE);
    

    This sets the PBS_MARQUEE style flag, but removes all other flags, most definitely not what you intend.

    Instead you should use bitwise OR like so:

    LONG_PTR style = GetWindowLongPtr(wndPB, GWL_STYLE);
    SetWindowLongPtr(hwndPB, GWL_STYLE, style | PBS_MARQUEE);
    

    I'm know next to nothing about C++ type rules so there will probably be wrinkles with this code, but I'm sure that this is your problem!

    In fact, since you set the window style in the call to CreateWindowEx() I don't see why you need to modify it at all.


    One final hunch at why your marquee progress bar is not working. Did you include a manifest for common controls v6? The marquee style is only supported in common controls v6 and up.

    You can do this most simply by including the following in, for example, stdafx.h:

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

    I tested this with the following code added to the blank Win32 project in Visual Studio:

    HWND hwndPB = CreateWindowEx(
        0, PROGRESS_CLASS, (LPCWSTR)NULL,
        WS_CHILD | WS_VISIBLE | PBS_MARQUEE,
        0, 0, 400, 100,
        hWnd, (HMENU) 0, hInst, NULL
    );
    SendMessage(hwndPB,(UINT) PBM_SETMARQUEE,(WPARAM) 1,(LPARAM)NULL);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    

    I needed to add the manifest pragma to get v6 comctl32 and without the pragma there was no marquee.

    0 讨论(0)
提交回复
热议问题