PBS_MARQUEE Progressbar WinApi

Estoy intentando que funcione una barra de progreso del tipo PBS_MARQUEE. Puedo crear la barra de progreso, pero no puedo administrarla para que se mueva.

Si encontré esto, pero no entiendo claramente lo que tengo que hacer:

“Resulta que desde que tuve la barra de progreso como un recurso en lugar de usar CreateWindowEx (..) tuve que usar SetWindowLongPtr (..) para configurar el estilo PBS_MARQUEE para este control …”

Creo la barra de progreso de esa manera:

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

Entonces trato de hacerlo funcionar:

  SetWindowLongPtr(hwndPB,GWL_STYLE,PBS_MARQUEE); SendMessage(hwndPB,(UINT) PBM_SETMARQUEE,(WPARAM) 1,(LPARAM)NULL ); 

Gracias y saludos

El problema es que estás borrando el estilo de la ventana. El error es la línea:

 SetWindowLongPtr(hwndPB,GWL_STYLE,PBS_MARQUEE); 

Esto establece la bandera de estilo PBS_MARQUEE , pero elimina todas las demás banderas, definitivamente no es lo que pretendes.

En su lugar, debe utilizar bitwise O así:

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

No sé casi nada acerca de las reglas de tipo C ++, por lo que probablemente habrá arrugas con este código, ¡pero estoy seguro de que este es su problema!

De hecho, ya que configura el estilo de la ventana en la llamada a CreateWindowEx() no veo por qué necesita modificarlo en absoluto.


Un último presentimiento de por qué la barra de progreso de la marquesina no funciona. ¿Incluiste un manifiesto para controles comunes v6? El estilo de marquesina solo se admite en los controles comunes v6 y superiores.

Puede hacer esto de la manera más simple incluyendo lo siguiente en, por ejemplo, stdafx.h:

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

Probé esto con el siguiente código agregado al proyecto Win32 en blanco en 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); 

Necesitaba agregar el pragma manifiesto para obtener v6 comctl32 y sin el pragma no había marquesina.

Intereting Posts