windows-nt/Source/XPSP1/NT/shell/themes/test/spywindows/spywindows.cpp
2020-09-26 16:20:57 +08:00

147 lines
4.2 KiB
C++

// DumpIcon.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "commctrl.h"
#include "uxtheme.h"
#include <tmschema.h>
#define RECTWIDTH(rc) ((rc).right - (rc).left)
#define RECTHEIGHT(rc) ((rc).bottom - (rc).top)
__int64 liStart;
__int64 liEnd;
__int64 liFreq;
__int64 liTotal = 0;
DWORD dwCount = 0;
TCHAR g_szTestWindow[MAX_PATH];
void _GetProcFromComCtl32(FARPROC* ppfn, LPCSTR pszProc)
{
static HMODULE g_hinstCC = 0;
if (!g_hinstCC)
g_hinstCC = GetModuleHandle(TEXT("comctl32.dll"));
if (g_hinstCC)
*ppfn = GetProcAddress(g_hinstCC, pszProc);
else
{
// Hmm, This is a fatal error.... Dialog and Quit?
*ppfn = NULL;
}
}
#define STUB_COMCTL32_ORD(_ret, _fn, _args, _nargs, _ord, _err) \
_ret __stdcall _fn _args \
{ \
static _ret (__stdcall *_pfn##_fn) _args = (_ret (__stdcall *)_args)-1; \
if (_pfn##_fn == (_ret (__stdcall *)_args)-1) \
_GetProcFromComCtl32((FARPROC*)&_pfn##_fn, (LPCSTR)_ord); \
if (_pfn##_fn) \
return _pfn##_fn _nargs; \
return (_ret)_err; \
}
STUB_COMCTL32_ORD(BOOL, SetWindowSubclass, (HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass, DWORD_PTR dwRefData), (hWnd, pfnSubclass, uIdSubclass, dwRefData), 410, FALSE);
STUB_COMCTL32_ORD(LRESULT , DefSubclassProc, (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam), (hWnd, uMsg, wParam, lParam), 413, 0);
LRESULT CALLBACK UxThemeTestHook(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (uMsg)
{
case WM_PAINT:
QueryPerformanceCounter((LARGE_INTEGER*)&liStart);
LRESULT l = DefSubclassProc(hWnd, uMsg, wParam, lParam);
QueryPerformanceCounter((LARGE_INTEGER*)&liEnd);
if (dwCount < 100)
{
liTotal += liEnd - liStart;
dwCount++;
}
return l;
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK HostWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
RECT rc;
GetClientRect(hwnd, &rc);
for (int i=0; i < 100; i++)
{
HWND hwndTest = CreateWindow(g_szTestWindow, TEXT("0"), WS_CHILD | WS_VISIBLE,
(RECTWIDTH(rc) / 10) * (i % 10),
(RECTHEIGHT(rc) / 10) * (i / 10),
RECTWIDTH(rc) / 10,
RECTHEIGHT(rc) / 10,
hwnd, NULL, NULL, NULL);
if (hwndTest)
SetWindowSubclass(hwndTest, UxThemeTestHook, 1, NULL);
}
}
break;
case WM_CLOSE:
{
TCHAR sz[256];
double fTimeFor100 = (float)(liTotal) / liFreq ;
double fTimePer = (float)fTimeFor100 / 100;
sprintf(sz, TEXT("The average time to render 100 %s is %f, The time to render 100 buttons is %f"), g_szTestWindow, fTimePer, fTimeFor100 );
MessageBox(NULL, sz, TEXT("Time to render"), 0);
PostQuitMessage(0);
}
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int __cdecl main(int cch, char* ppv[])
{
lstrcpy(g_szTestWindow, TEXT("Button"));
if (cch > 1)
lstrcpy(g_szTestWindow, ppv[1]);
QueryPerformanceFrequency((LARGE_INTEGER*)&liFreq);
InitCommonControls();
WNDCLASS wc = {0};
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpfnWndProc = HostWndProc;
wc.lpszClassName = TEXT("UxThemeTestHost");
RegisterClass(&wc);
CreateWindow(TEXT("UxThemeTestHost"), TEXT("UxTheme Perf Testing"), WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 600, 600, NULL, NULL, NULL, NULL);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
return 0;
}