IProvideWinSATVisuals::get_Bitmap 方法 (winsatcominterfacei.h)
[IProvideWinSATVisuals::get_Bitmap在Windows 8.1后可能会更改或不可用于版本。]
检索 WinSAT 基本分数的位图。
语法
HRESULT get_Bitmap(
[in] WINSAT_BITMAP_SIZE bitmapSize,
[in] WINSAT_ASSESSMENT_STATE state,
[in] float rating,
[out] HBITMAP *pBitmap
);
参数
[in] bitmapSize
确定此方法返回的位图的大小。 有关可能的值,请参阅 WINSAT_BITMAP_SIZE 枚举。
[in] state
评估的状态。 若要获取此值,请调用 IProvideWinSATResultsInfo::get_AssessmentState 方法。
[in] rating
计算机的基本分数。 若要获取此值,请调用 IProvideWinSATResultsInfo::get_SystemRating 方法。
[out] pBitmap
位图的句柄。 若要在完成后释放句柄,请调用 DeleteObject 函数。
返回值
此方法可以返回其中一个值。
下表列出了此方法返回的一些 HRESULT 值。
返回代码/值 | 说明 |
---|---|
|
已成功检索位图。 |
|
分级值无效。 有效值为 1.0 到 9.9。 |
注解
位图仅针对WINSAT_ASSESSMENT_STATE_VALID和WINSAT_ASSESSMENT_STATE_INCOHERENT_WITH_HARDWARE状态返回。 如果传递另一个状态值, (返回值S_OK) ,但 pBitmap 参数将为 NULL,则该方法将成功。
示例
以下示例演示如何检索表示评估基本分数的位图。 该示例使用 Win32_WinSAT WMI MOF 类获取传递给此方法的状态和基本分数。
#include <windows.h>
#include <comutil.h>
#include <commctrl.h>
#include <wbemidl.h>
#include <winsatcominterfacei.h>
#pragma comment(lib, "comsupp.lib") // For _bstr_t
#pragma comment(lib, "comctl32.lib") // For common controls
#pragma comment(lib, "gdi32.lib")
// The WQL query used to retrieve an instance of the Win32_WinSAT class.
#define WINSAT_QUERY_STRING L"Select * \
From Win32_WinSAT \
Where TimeTaken = 'MostRecentAssessment'"
HRESULT GetBaseScore(float* pBaseScore, WINSAT_ASSESSMENT_STATE* pState);
HRESULT GetScoreBitmap(const float BaseScore, const WINSAT_ASSESSMENT_STATE State, HBITMAP* phbitmap);
LRESULT CALLBACK MonitorWndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Global variables
HINSTANCE g_hinst;
HWND g_hwndStatus;
HBITMAP g_hScoreBitmap;
#define IDC_MONITOR 100
int WINAPI WinMain(HINSTANCE hinst,
HINSTANCE hinstPrev,
LPSTR pszCmdLine,
int nCmdShow)
{
WNDCLASSEX wc;
ATOM atom;
HWND hwnd;
MSG msg;
g_hinst = hinst;
ZeroMemory(&wc, sizeof(wc));
wc.cbSize = sizeof(wc);
wc.lpfnWndProc = MonitorWndProc;
wc.hInstance = hinst;
wc.lpszClassName = TEXT("MainWClass");
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
atom = RegisterClassEx(&wc);
hwnd = CreateWindowEx(0,
TEXT("MainWClass"),
TEXT("Experience Index Base Score"),
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
390, 165,
NULL,
NULL,
hinst,
NULL);
if (NULL == hwnd)
{
return (int)GetLastError();
}
ShowWindow(hwnd, nCmdShow);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK MonitorWndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
HRESULT hr = S_OK;
switch(msg)
{
case WM_CREATE:
{
INITCOMMONCONTROLSEX initctrls;
RECT rc;
float BaseScore = 0.0;
WINSAT_ASSESSMENT_STATE AssessmentState;
SetWindowText(hwnd, TEXT("Experience Index Base Score"));
initctrls.dwSize = sizeof(initctrls);
initctrls.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx(&initctrls);
GetClientRect(hwnd, &rc);
g_hwndStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL,
WS_CHILD | WS_BORDER | WS_VISIBLE,
rc.left, rc.bottom - 20, rc.right, 20,
hwnd, (HMENU) IDC_MONITOR, g_hinst, NULL);
if (NULL == g_hwndStatus)
return (LRESULT) NULL;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// Get the base score and the state of the assessment.
if (FAILED(hr = GetBaseScore(&BaseScore, &AssessmentState)))
{
SetWindowText(g_hwndStatus, TEXT("Failed to get base score and state"));
}
// Get the bitmap for the specified score and state values.
if (FAILED(hr = GetScoreBitmap(BaseScore, AssessmentState, &g_hScoreBitmap)) || NULL == g_hScoreBitmap)
{
SetWindowText(g_hwndStatus, TEXT("Failed to get base score bitmap"));
}
break;
}
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdcWin;
HDC hdcCompatible;
HGDIOBJ bmpOld;
BITMAP bitmap;
// Write the bitmap to the window.
if (g_hScoreBitmap)
{
hdcWin = BeginPaint(hwnd, &ps);
hdcCompatible = CreateCompatibleDC(hdcWin);
bmpOld = SelectObject(hdcCompatible, g_hScoreBitmap);
GetObject(g_hScoreBitmap, sizeof(BITMAP), &bitmap);
BitBlt(hdcWin, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcCompatible, 0, 0, SRCCOPY);
SelectObject(hdcCompatible, bmpOld);
DeleteDC(hdcCompatible);
EndPaint(hwnd, &ps);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
CoUninitialize();
DeleteObject(g_hScoreBitmap);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
}
return 0;
}
// Use the Win32_WinSAT WMI class to retrieve the base score and
// state of the most recent assessment.
HRESULT GetBaseScore(float* pBaseScore, WINSAT_ASSESSMENT_STATE* pState)
{
HRESULT hr = S_OK;
IWbemServices* pServices = NULL;
IWbemLocator* pLocator = NULL;
IEnumWbemClassObject* pEnum = NULL;
IWbemClassObject* pWinSAT = NULL;
_variant_t vBaseScore;
_variant_t vState;
ULONG returned = 0;
// WMI code to retrieve the Win32_WinSAT instance.
hr = CoCreateInstance(__uuidof(WbemLocator),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IWbemLocator),
(void**)&pLocator);
if (FAILED(hr))
{
// Handle error
goto cleanup;
}
hr = pLocator->ConnectServer(_bstr_t(L"root\\cimv2"),
NULL, NULL, NULL, 0L, NULL, NULL,
&pServices);
if (FAILED(hr))
{
// Handle error
goto cleanup;
}
hr = pServices->ExecQuery(_bstr_t(L"WQL"),
_bstr_t(WINSAT_QUERY_STRING),
WBEM_FLAG_USE_AMENDED_QUALIFIERS | WBEM_FLAG_FORWARD_ONLY,
NULL,
&pEnum);
if (FAILED(hr))
{
// Handle error
goto cleanup;
}
// The query will return only one instance.
hr = pEnum->Next(WBEM_INFINITE, 1, &pWinSAT, &returned);
if (FAILED(hr))
{
// Handle error
goto cleanup;
}
hr = pWinSAT->Get(L"WinSPRLevel", 0, &vBaseScore, NULL, NULL);
if (FAILED(hr))
{
// Handle error
goto cleanup;
}
*pBaseScore = vBaseScore.fltVal;
hr = pWinSAT->Get(L"WinSATAssessmentState", 0, &vState, NULL, NULL);
if (FAILED(hr))
{
// Handle error
goto cleanup;
}
*pState = (WINSAT_ASSESSMENT_STATE)vState.lVal;
cleanup:
if (pLocator)
pLocator->Release();
if (pServices)
pServices->Release();
if (pEnum)
pEnum->Release();
if (pWinSAT)
pWinSAT->Release();
return hr;
}
HRESULT GetScoreBitmap(const float BaseScore, const WINSAT_ASSESSMENT_STATE State, HBITMAP* phbitmap)
{
HRESULT hr = S_OK;
IProvideWinSATVisuals* pVisuals = NULL;
// Code to retrieve the bitmap from WinSAT. Get the bitmap
// only if the state is one of the following states.
if (WINSAT_ASSESSMENT_STATE_VALID == State ||
WINSAT_ASSESSMENT_STATE_INCOHERENT_WITH_HARDWARE == State)
{
hr = CoCreateInstance(__uuidof(CProvideWinSATVisuals),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IProvideWinSATVisuals),
(void**)&pVisuals);
if (FAILED(hr))
{
// Handle error
goto cleanup;
}
hr = pVisuals->get_Bitmap(WINSAT_BITMAP_SIZE_NORMAL,
State,
BaseScore,
phbitmap);
if (FAILED(hr))
{
// Handle error
goto cleanup;
}
}
cleanup:
if (pVisuals)
pVisuals->Release();
return hr;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [仅限桌面应用] |
最低受支持的服务器 | 无受支持的版本 |
目标平台 | Windows |
标头 | winsatcominterfacei.h |
DLL | Winsatapi.dll |