PBS_MARQUEE Progressbar WinApi

sam*_*bob 5 c++ winapi progress-bar

我正在尝试使用PBS_MARQUEE类型的进度条.我可以创建进度条,但我无法管理它以使其移动.

如果发现这个,但我不清楚我必须做什么:

"事实证明,因为我将进度条作为资源而不是使用CreateWindowEx(..)我必须使用SetWindowLongPtr(..)为此控件设置PBS_MARQUEE样式......"

我以这种方式创建进度条:

   hwndPB = CreateWindowEx(0, PROGRESS_CLASS,
                            (LPSTR)NULL, WS_CHILD | WS_VISIBLE | PBS_MARQUEE ,
                            rcClient.left,
                            rcClient.bottom - cyVScroll,
                            rcClient.right, cyVScroll,
                            hwnd, (HMENU) 0, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

然后我尝试让它工作:

    SetWindowLongPtr(hwndPB,GWL_STYLE,PBS_MARQUEE);
    SendMessage(hwndPB,(UINT) PBM_SETMARQUEE,(WPARAM) 1,(LPARAM)NULL );
Run Code Online (Sandbox Code Playgroud)

感谢和问候

Dav*_*nan 5

问题是你正在消除窗口风格.错误是行:

SetWindowLongPtr(hwndPB,GWL_STYLE,PBS_MARQUEE);
Run Code Online (Sandbox Code Playgroud)

这会设置PBS_MARQUEE样式标志,但会删除所有其他标志,绝对不是你想要的.

相反,您应该使用按位OR,如下所示:

LONG_PTR style = GetWindowLongPtr(wndPB, GWL_STYLE);
SetWindowLongPtr(hwndPB, GWL_STYLE, style | PBS_MARQUEE);
Run Code Online (Sandbox Code Playgroud)

我对C++类型规则几乎一无所知,所以这段代码可能会有皱纹,但我确信这是你的问题!

事实上,由于你在调用中设置了窗口样式,CreateWindowEx()我不明白为什么你需要修改它.


为什么你的选框进度条不起作用的最后预感.您是否包含常用控件v6的清单?仅在常用控件v6及更高版本中支持选取框样式.

您可以通过在stdafx.h中包含以下内容来最简单地执行此操作:

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

我使用以下代码在Visual Studio中添加到空白的Win32项目中测试了这个:

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);
Run Code Online (Sandbox Code Playgroud)

我需要添加清单编译指示以获取v6 comctl32而没有编译指示没有选取框.