Member 13518242 Ответов: 2

Цвет фона ленты в чистом C


Привет,
Я пишу нативные программы на Си уже 30 лет, но теперь у меня есть задача моего босса улучшить существующие программы с помощью ленточного меню, не записывая все новые программы на c++ или c#.
Я прекрасно ориентировался на программу "Windows Ribbon Framework in Win32 C Application" от Стивена Вириа с 2010 года (Большое спасибо за эту замечательную программу!) и все lools очень хороши за одним исключением:
Я не могу установить глобальный цвет фона ленты с помощью "UI_PKEY_GlobalBackgroundColor".
Я решительно не знаком с C++, и все мои попытки перевести пример кода c++ на чистый c, чтобы установить цвет backgrouind ленты, потерпели неудачу.
Есть ли у кого-нибудь короткое решение для меня?
Огромное спасибо.
Детлеф

Что я уже пробовал:

HRESULT STDMETHODCALLTYPE OnCreateUICommand(IUIApplication *This, UINT32 commandId, UI_COMMANDTYPE typeID, IUICommandHandler **commandHandler)
{
	HRESULT hr;
	VOID *ppvObj = NULL;
	PROPVARIANT pv;
	
	
	/* allocate pApplication */
	
	// Command-Handler für das Abfragen der Command-Ids
	pCommandHandler = (IUICommandHandler *)GlobalAlloc(GMEM_FIXED, sizeof(IUICommandHandler));
	(IUICommandHandlerVtbl *)pCommandHandler->lpVtbl = &myCommand_Vtbl;
	hr = pCommandHandler->lpVtbl->QueryInterface(pCommandHandler, &IID_IUICommandHandler, (void**)commandHandler);
	


	// Property-Handler
	pPropertyStore = (IPropertyStore *)GlobalAlloc(GMEM_FIXED, sizeof(IPropertyStore));
	
	(IPropertyStoreVtbl*)pPropertyStore->lpVtbl = &myPropertyStore_Vtbl;

	pPropertyStore->lpVtbl->QueryInterface(pPropertyStore, &IID_IUIPropertyHandler, &ppvObj);

		

	UI_HSBCOLOR BackgroundColor = UI_HSB(0xFF, 0xFF, 0x00);
	

	PropVariantInit (&pv);

	pv.vt = VT_UI4;
	pv.lVal = BackgroundColor;
		
	hr = pPropertyStore->lpVtbl->SetValue(pPropertyStore, &UI_PKEY_GlobalBackgroundColor, &pv);
	hr = pPropertyStore->lpVtbl->Commit(pPropertyStore);
	
	
	return hr;

}

KarstenK

Вы должны предоставить все сообщение об ошибке. Лучше всего, что Вы google для своих ключевых слов :-O

Member 13518242

Привет Карстен,

спасибо за ваш повтор.
Проблема в том, что я не получаю сообщения об ошибке, но цвет фона остается неизменным в своем старом состоянии.

Я думаю, что в c++ очень легко изменить цвет, и мне нужна такая функция:


CComPtr<ipropertystore> spPropertyStore;

// _spFramework - это указатель на назначенный интерфейс IUIFramework
// когда лента инициализируется.
if (SUCCESSED(_spFramework->QueryInterface(&spPropertyStore)))
{
ПРОПВАРИАНТ propvarBackground;
PROPVARIANT propvarHighlight;
ПРОПВАРИАНТНЫЙ пропвартекст;

// UI_HSBCOLOR-это тип, определенный в UIRibbon.h, который состоит из
// три значения компонентов: оттенок, насыщенность и яркость соответственно.
UI_HSBCOLOR BackgroundColor = UI_HSB(0x14, 0x38, 0x54);
UI_HSBCOLOR HighlightColor = UI_HSB(0x00, 0x36, 0x87);
UI_HSBCOLOR TextColor = UI_HSB(0x2B, 0xD6, 0x00);

InitPropVariantFromUInt32(BackgroundColor, &propvarBackground);
InitPropVariantFromUInt32(HighlightColor, &propvarHighlight);
InitPropVariantFromUInt32(TextColor, &propvarText);

spPropertyStore->SetValue(UI_PKEY_GlobalBackgroundColor, propvarBackground);
spPropertyStore->SetValue(UI_PKEY_GlobalTextColor, propvarText);

spPropertyStore->Commit();
}


Но в чистом c я не могу найти аналогичную функцию, как "InitPropVariantFromUInt32".

Может быть, это решит проблему.
Гугл не помог :-(.

Еще раз спасибо и с наилучшими пожеланиями.
Детлеф

2 Ответов

Рейтинг:
1

Member 13518242

IPropertyStoreCache *ppvObj_propertystore = NULL;
PROPVARIANT    pvBackgroundColor;

UI_HSBCOLOR BackgroundColor = UI_HSB(0xFF, 0xFF, 0x54);
HRESULT hr;

hr = CoCreateInstance(&CLSID_InMemoryPropertyStore, NULL, CLSCTX_INPROC_SERVER, &IID_IPropertyStoreCache, (void**)&ppvObj_propertystore);

hr = ppvObj_propertystore->lpVtbl->Release(ppvObj_propertystore);

hr = ppvObj_propertystore->lpVtbl->QueryInterface(ppvObj_propertystore, &IID_IPropertyStoreCache, &ppvObj_propertystore);


	
PropVariantInit (&pvBackgroundColor);
hr = InitPropVariantFromUInt32(BackgroundColor, &pvBackgroundColor);

PropVariantInit(&pvBackgroundColorIn);
hr = InitPropVariantFromUInt32(BackgroundColor, &pvBackgroundColorIn);

hr = ppvObj_propertystore->lpVtbl->GetValue(ppvObj_propertystore, &UI_PKEY_GlobalBackgroundColor, &pvBackgroundColorIn);

PropVariantToUInt32(&pvBackgroundColorIn, &uErgebnis);


hr = ppvObj_propertystore->lpVtbl->SetValue(ppvObj_propertystore,  
        &UI_PKEY_GlobalBackgroundColor, &pvBackgroundColor);
hr = ppvObj_propertystore->lpVtbl->Commit(ppvObj_propertystore);


Member 13518242

Тем временем я нашел решение самостоятельно.
Может быть, кому-то нужно решение. Вот он:

// Обработчик Свойств
pPropertyStore = (IPropertyStore *) GlobalAlloc(GMEM_FIXED, sizeof(IPropertyStore));

(IPropertyStoreVtbl*)pPropertyStore->lpVtbl = &myPropertyStore_Vtbl;

ч = g_pFramework-&ГТ;lpVtbl-и GT;метод queryinterface(g_pFramework, &ампер;IID_IPropertyStore, &ампер;pPropertyStore);


InitPropVariantFromUInt32(BackgroundColor, &pvBackgroundColor);
InitPropVariantFromUInt32(TextColor, &pvTextColor);


ч = pPropertyStore-&ГТ;lpVtbl-и GT;метод setValue(pPropertyStore, &ампер;UI_PKEY_GlobalBackgroundColor, &ампер;pvBackgroundColor);
ч = pPropertyStore-&ГТ;lpVtbl-и GT;метод setValue(pPropertyStore, &ампер;UI_PKEY_GlobalTextColor, &ампер;pvTextColor);


hr = pPropertyStore->lpVtbl->Commit(pPropertyStore);
hr = pPropertyStore->lpVtbl->Release(pPropertyStore);

Рейтинг:
0

merano99

Не уверен, если это поможет:

https://docs.microsoft.com/de-de/windows/desktop/windowsribbon/windowsribbon-templates


Member 13518242

Спасибо тебе, мерано99. Это полезно, но все же у меня есть проблема создать PropertyHandler в чистом c, который работает. Я попробовал Решение ниже, но backgroundclor vremain остался неизменным. Тем не менее спасибо.
Детлеф