PBS_MARQUEE进度栏WinApi

问题描述

我正在尝试使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);
然后我尝试使其工作:
    SetWindowLongPtr(hwndPB,GWL_STYLE,PBS_MARQUEE);
    SendMessage(hwndPB,(UINT) PBM_SETMARQUEE,(WPARAM) 1,(LPARAM)NULL );
致谢     

解决方法

问题是您要消除窗口样式。错误是这一行:
SetWindowLongPtr(hwndPB,GWL_STYLE,PBS_MARQUEE);
这将设置“ 3”样式标志,但会删除所有其他标志,绝对不是您想要的标志。 相反,您应该像这样使用按位或:
LONG_PTR style = GetWindowLongPtr(wndPB,GWL_STYLE);
SetWindowLongPtr(hwndPB,style | PBS_MARQUEE);
我对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=\'*\'\\\"\")
我使用以下代码添加到Visual Studio的空白Win32项目中对此进行了测试:
HWND hwndPB = CreateWindowEx(
    0,PROGRESS_CLASS,(LPCWSTR)NULL,WS_CHILD | WS_VISIBLE | PBS_MARQUEE,400,100,hWnd,(HMENU) 0,hInst,NULL
);
SendMessage(hwndPB,(UINT) PBM_SETMARQUEE,(WPARAM) 1,(LPARAM)NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
我需要添加清单编译指示以获取v6 comctl32,并且没有编译指示就没有选框。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...