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 |