Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ PBS_MARQUEE Progressbar WinApi_C++_Winapi_Progress Bar - Fatal编程技术网

C++ PBS_MARQUEE Progressbar WinApi

C++ PBS_MARQUEE Progressbar WinApi,c++,winapi,progress-bar,C++,Winapi,Progress Bar,我正在尝试让PBS_MARQUEE类型的进度条工作。 我可以创建进度条,但我无法管理它使其移动 如果我发现了这一点,但我不清楚我要做什么: “事实证明,由于我将进度条作为资源,而不是使用CreateWindowEx(..),因此我必须使用SetWindowLongPtr(..)来设置此控件的PBS_字幕样式…” 我这样创建progressbar: hwndPB = CreateWindowEx(0, PROGRESS_CLASS, (

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

如果我发现了这一点,但我不清楚我要做什么:

“事实证明,由于我将进度条作为资源,而不是使用CreateWindowEx(..),因此我必须使用SetWindowLongPtr(..)来设置此控件的PBS_字幕样式…”

我这样创建progressbar:

   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 );

Thx&ADVICES

问题是您正在删除窗口样式。错误是行:

SetWindowLongPtr(hwndPB,GWL_STYLE,PBS_MARQUEE);
这将设置
PBS_MARQUEE
样式标志,但删除所有其他标志,最明显的不是您想要的

相反,您应该使用按位或类似方式:

LONG_PTR style = GetWindowLongPtr(wndPB, GWL_STYLE);
SetWindowLongPtr(hwndPB, GWL_STYLE, 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='*'\"")

我在VisualStudio:/P>中添加了以下代码添加到空白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);

我需要添加manifest pragma以获得v6 comctl32,没有pragma就没有字幕。

您好,谢谢您的回答。我真的不想修改它,但我不知道如何制作进度条,声明为PBS_MARQUEE,正在移动。。。在我看来,它应该与CreateWindowEx()和SendMessage(hwndPB,PBM_SETMARQUEE,1,0);。。。()…@David Heffernan不,我不知道这是我的失败还是错误的解决方案。。。你想让我调用CreateWindowEx()而不是使用GetWindowLongPtr()等,对吗?好吧,你不能删除
WS|u CHILD | WS_VISIBLE
,这就是你的代码当前所做的。嗯,现在我有了我的CreateWindowEx()声明和你改变进度条样式的方法。该条显示的事实告诉我,我不再删除WS|u CHILD | WS|u VISIBLE。。。但是进度条还是不动。。。SendMessage(hwndPB,(UINT)PBM_SETMARQUEE,(WPARAM)1,(LPARAM)NULL)返回false。我不知道。这应该行得通。但是由于我看不到你所有的代码,我现在没有主意了。当你开始工作的时候,你可能想要加入PBS_平滑风格,但是在你解决了当前的问题之后,那是另外一件要做的事情。