PBS_MARQUEE Progressbar WinApi - PullRequest
       0

PBS_MARQUEE Progressbar WinApi

5 голосов
/ 15 апреля 2011

Я пытаюсь заставить работать индикатор выполнения типа 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 );

Спасибо и привет

1 Ответ

5 голосов
/ 16 апреля 2011

Проблема в том, что вы стираете стиль окна.Ошибка - строка:

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='*'\"")

Я проверял этосо следующим кодом, добавленным в пустой проект Win32 в 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);

Мне нужно было добавить прагму манифеста для получения v6 comctl32, а без прагмы не было выделенной области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...