Spinner
スピナーは、インクリメント ボタン、デクリメント ボタン、および編集コントロールで構成される複合コントロールです。これらはすべて、アプリケーションに 10 進値を提供するために使用されます。
説明
次のスクリーン ショットは、リボン スピナーを示しています。
スピナーのプロパティ
リボン フレームワークは、スピナー コントロールの プロパティ キー のコレクションを定義します。
通常、スピナー プロパティは、 IUIFramework::InvalidateUICommand メソッドの呼び出しによってコントロールに関連付けられている Command を無効にすることで、リボン UI で更新されます。 無効化イベントが処理され、 IUICommandHandler::UpdateProperty コールバック メソッドによって定義されたプロパティが更新されます。
IUICommandHandler::UpdateProperty コールバック メソッドは実行されず、アプリケーションは、フレームワークでプロパティが必要になるまで、更新されたプロパティ値を照会しました。 たとえば、タブがアクティブ化され、リボン UI にコントロールが表示されたときや、ツールヒントが表示されたときなどです。
注意
場合によっては、 IUIFramework::GetUICommandProperty メソッドを使用してプロパティを取得し、 IUIFramework::SetUICommandProperty メソッドを使用して設定できます。
次の表に、スピナー コントロールに関連付けられているプロパティ キーの一覧を示します。
プロパティ キー | Notes |
---|---|
UI_PKEY_DecimalPlaces | 無効化によってのみ更新できます。 |
UI_PKEY_DecimalValue |
IUIFramework::GetUICommandProperty と IUIFramework::SetUICommandProperty をサポートします。
メモ:コントロールに関連付けられているコマンドが IUIFramework::InvalidateUICommand の呼び出しによって無効化された場合、フレームワークは フラグの値として が渡されたときにUI_INVALIDATIONS_VALUE このプロパティを照会します。 |
UI_PKEY_Enabled | IUIFramework::GetUICommandProperty と IUIFramework::SetUICommandProperty をサポートします。 |
UI_PKEY_FormatString | 無効化によってのみ更新できます。 |
UI_PKEY_Increment | 無効化によってのみ更新できます。 |
UI_PKEY_Keytip | 無効化によってのみ更新できます。 |
UI_PKEY_Label | 無効化によってのみ更新できます。 |
UI_PKEY_LargeHighContrastImage | 無効化によってのみ更新できます。 |
UI_PKEY_LargeImage | 無効化によってのみ更新できます。 |
UI_PKEY_MaxValue | 無効化によってのみ更新できます。 |
UI_PKEY_MinValue | 無効化によってのみ更新できます。 |
UI_PKEY_RepresentativeString | 無効化によってのみ更新できます。 |
UI_PKEY_SmallHighContrastImage | 無効化によってのみ更新できます。 |
UI_PKEY_SmallImage | 無効化によってのみ更新できます。 |
UI_PKEY_TooltipDescription | 無効化によってのみ更新できます。 |
UI_PKEY_TooltipTitle | 無効化によってのみ更新できます。 |
コードの次のセクションでは、 IUICommandHandler::UpdateProperty メソッドで、スピナー コントロールのさまざまなプロパティがどのように更新されるかを示します。
//
// FUNCTION: UpdateProperty()
//
// PURPOSE: Called by the Ribbon framework when a command property needs
// to be updated.
//
// COMMENTS: This function is used to provide new command property values for
// the spinner when requested by the Ribbon framework.
//
STDMETHODIMP CCommandHandler::UpdateProperty(
UINT nCmdID,
REFPROPERTYKEY key,
const PROPVARIANT* ppropvarCurrentValue,
PROPVARIANT* ppropvarNewValue)
{
UNREFERENCED_PARAMETER(ppropvarCurrentValue);
HRESULT hr = E_NOTIMPL;
if (nCmdID == IDR_CMD_SPINNER_RESIZE)
{
// Set the minimum value
if (IsEqualPropertyKey(key, UI_PKEY_MinValue))
{
ZeroMemory(ppropvarNewValue, sizeof(*ppropvarNewValue));
ppropvarNewValue->vt = VT_DECIMAL;
VarDecFromR8(-10.0, &ppropvarNewValue->decVal);
hr = S_OK;
}
// Set the maximum value
else if (IsEqualPropertyKey(key, UI_PKEY_MaxValue))
{
ZeroMemory(ppropvarNewValue, sizeof(*ppropvarNewValue));
ppropvarNewValue->vt = VT_DECIMAL;
VarDecFromR8(10.0, &ppropvarNewValue->decVal);
hr = S_OK;
}
// Set the increment
else if (IsEqualPropertyKey(key, UI_PKEY_Increment))
{
ZeroMemory(ppropvarNewValue, sizeof(*ppropvarNewValue));
ppropvarNewValue->vt = VT_DECIMAL;
VarDecFromR8(2.0, &ppropvarNewValue->decVal);
hr = S_OK;
}
// Set the number of decimal places
else if (IsEqualPropertyKey(key, UI_PKEY_DecimalPlaces))
{
hr = InitPropVariantFromUInt32(1, ppropvarNewValue);
hr = S_OK;
}
// Set the format string
else if (IsEqualPropertyKey(key, UI_PKEY_FormatString))
{
hr = InitPropVariantFromString(L"px", ppropvarNewValue);
hr = S_OK;
}
// Set the representative string
else if (IsEqualPropertyKey(key, UI_PKEY_RepresentativeString))
{
hr = InitPropVariantFromString(L"AAAAAAA", ppropvarNewValue);
hr = S_OK;
}
}
return hr;
}
注釈
スピナーの最小値 (UI_PKEY_MinValue) が 0.0 に初期化されている場合、アプリケーションは、コントロールによって提供される後続の値が -0.0 (負のゼロ) と等しくないことを確認する必要があります。 スピナーが -0.0 の値を提供する場合、アプリケーションは、次のスピン ボタン コントロールの IUICommandHandler::Execute メソッドの例に示すように、IUIFramework::SetUICommandProperty メソッドを使用して、この値を 0.0 (正のゼロ) にリセットする必要があります。
注意
このテストが実行されず、値が未修正のままの場合、コントロールの編集フィールドに文字列 "Auto" が表示されます。
//
// FUNCTION: Execute()
//
// PURPOSE: Called by the Ribbon framework when a command is executed by the user.
// For this sample, when an increment or decrement button is pressed or
// a new value is entered in the Spinner edit field.
//
STDMETHODIMP CCommandHandler::Execute(
UINT nCmdID,
UI_EXECUTIONVERB verb,
const PROPERTYKEY* key,
const PROPVARIANT* ppropvarValue,
IUISimplePropertySet* pCommandExecutionProperties)
{
UNREFERENCED_PARAMETER(pCommandExecutionProperties);
HRESULT hr = E_NOTIMPL;
if (verb == UI_EXECUTIONVERB_EXECUTE)
{
RenderParam param;
g_renderer.GetRenderParam(¶m);
if (nCmdID == IDR_CMD_SPINNER_RESIZE)
{
// Spinner value is negative.
if (!(ppropvarValue->decVal.sign == 0))
{
// Check if the value supplied by the Spinner is -0
// and correct the value if necessary.
// If this value is left uncorrected, the edit field
// of the control will display the string "Auto" when
// UI_PKEY_MinValue is set to 0.
if (ppropvarValue->decVal.Lo64 == 0)
{
// Initialize a new PROPVARIANT structure.
PROPVARIANT m_varNewVal;
PropVariantInit(&m_varNewVal);
// The replacement DECIMAL value.
DECIMAL m_dVal;
hr = VarDecFromI4(0, &m_dVal);
if (FAILED(hr))
{
return hr;
}
// Initialize the new DECIMAL value.
UIInitPropertyFromDecimal(UI_PKEY_DecimalValue, m_dVal, &m_varNewVal);
// Set the UI_PKEY_DecimalValue to the new DECIMAL value.
hr = g_pFramework->SetUICommandProperty(nCmdID, UI_PKEY_DecimalValue, m_varNewVal);
if (FAILED(hr))
{
return hr;
}
}
// Decrease size of shape in document space.
param.iShapeSizeIncrement = -ppropvarValue->intVal;
}
// Spinner value is positive.
else
{
// Increase size of shape in document space.
param.iShapeSizeIncrement = ppropvarValue->intVal;
}
}
g_renderer.UpdateRenderParam(param);
}
return hr;
}