WindowsXP-SP1/shell/themes/test/ncperf/ncperf.cpp
2020-09-30 16:53:49 +02:00

858 lines
26 KiB
C++

//-------------------------------------------------------------------------//
// NcPerf.cpp
//-------------------------------------------------------------------------//
#include "stdafx.h"
#include "resource.h"
#include <math.h>
//--- globals
HINSTANCE _hInst = NULL; // current instance
HWND _hwndMain = NULL;
HWND _hwndMdiClient = NULL;
HWND _hwndCover = NULL;
// resize test
#define SAMPLE_SIZE 1501
#define MOVE_ANGLE_INCR 20 // angle interval, in degrees
SIZE _sizeOffset = {2,2}; // size offset of cover window relative to main window
int _nRadius = 250; // radius
int _cRep = 0; // current repitition
int _nRot = 0; // angle of rotation, in degrees.
//--- misc defs, helpers
#define MAX_LOADSTRING 255
#define MDICHILD_COUNT 6
#define WC_NCPERFMAIN TEXT("NcPerfMainWnd")
#define WC_NCPERFCOVERWND TEXT("NcPerfCoverWnd")
#define WC_NCPERFMDICHILD TEXT("NcPerfMdiChild")
#define RECTWIDTH(prc) ((prc)->right - (prc)->left)
#define RECTHEIGHT(prc) ((prc)->bottom - (prc)->top)
#define SAFE_DELETE(p) {delete (p); (p)=NULL;}
#define WM_KICKRESIZE (WM_USER+101)
#define WM_STOPTEST (WM_USER+102)
//--- fn forwards
BOOL RegisterClasses(HINSTANCE hInstance);
void RunTests( HWND );
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK CoverWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK MdiChildProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ResultsDlgProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK NilDlgProc(HWND, UINT, WPARAM, LPARAM);
ULONG AvgTime( ULONG, DWORD [], DWORD [][2], int, ULONG& );
class CResizeResults;
class CResizeData;
CResizeData* _pData = NULL;
//-------------------------------------------------------------------------//
class CResizeData
//-------------------------------------------------------------------------//
{
public:
//-------------------------------------------------------------------------//
CResizeData( HWND hwnd )
: _hwnd(hwnd), _cSamples(-1), _cEraseP(0), _cNcPaintP(0),
_cNcCalcR(0), _cNcPaintR(0), _cEraseR(0), _cPosChgR(0)
{
ZeroMemory( &_rcStart, sizeof(_rcStart) );
ZeroMemory( &_rcStop, sizeof(_rcStop) );
ZeroMemory( _rgdwSWP, sizeof(_rgdwSWP) );
ZeroMemory( _rgdwEraseP, sizeof(_rgdwEraseP));
ZeroMemory( _rgdwNcPaintP, sizeof(_rgdwNcPaintP));
ZeroMemory( _rgdwNcCalcR, sizeof(_rgdwNcCalcR) );
ZeroMemory( _rgdwNcPaintR, sizeof(_rgdwNcPaintR) );
ZeroMemory( _rgdwEraseR, sizeof(_rgdwEraseR) );
ZeroMemory( _rgdwPosChgR, sizeof(_rgdwPosChgR) );
}
//-------------------------------------------------------------------------//
static BOOL Start( HWND hwnd )
{
SAFE_DELETE( _pData );
if( (_pData = new CResizeData(hwnd)) == NULL )
return FALSE;
// set timer.
if( TIMERR_NOERROR != timeBeginPeriod(_tc.wPeriodMin) )
{
SAFE_DELETE(_pData);
return FALSE;
}
int cxScr = GetSystemMetrics( SM_CXSCREEN );
int cyScr = GetSystemMetrics( SM_CYSCREEN );
int cxWnd = MulDiv( cxScr, 9, 10 );
int cyWnd = MulDiv( cyScr, 9, 10 );
int x = (cxScr - cxWnd)/2;
int y = (cyScr - cyWnd)/2;
_nRadius = min(cxWnd, cyWnd)/4;
SetWindowPos( hwnd, NULL, x, y, cxWnd, cyWnd,
SWP_NOZORDER|SWP_NOACTIVATE );
GetWindowRect( hwnd, &_pData->_rcStop );
_cTicks = 0;
_idTimer = timeSetEvent( 1, 0, TimerProc, 0, TIME_PERIODIC | TIME_CALLBACK_FUNCTION );
if( !_idTimer )
{
timeEndPeriod(_tc.wPeriodMin);
SAFE_DELETE(_pData);
return FALSE;
}
return TRUE;
}
//-------------------------------------------------------------------------//
static BOOL Stop( HWND hwnd )
{
static BOOL fInStop = FALSE;
if( !fInStop )
{
fInStop = TRUE;
if( _idTimer )
{
timeKillEvent( _idTimer );
timeEndPeriod(_tc.wPeriodMin);
_idTimer = 0;
}
if( _hwndCover )
{
if( _pData )
GetWindowRect( hwnd, &_pData->_rcStop );
DestroyWindow( _hwndCover );
}
if( _pData )
{
DialogBoxParam( _hInst, MAKEINTRESOURCE(IDD_RESULTS), hwnd,
(DLGPROC)ResultsDlgProc, (LPARAM)_pData );
SAFE_DELETE( _pData );
}
fInStop = FALSE;
}
return TRUE;
}
//-------------------------------------------------------------------------//
static void CALLBACK TimerProc( UINT uID, UINT, DWORD, DWORD, DWORD )
{
_cTicks++;
}
//-------------------------------------------------------------------------//
LPCTSTR Evaluate( INT& iEval )
{
ULONG nTimeMax = 0;
static TCHAR szOut[MAX_PATH*4] = {0};
LPCTSTR pszHdr = TEXT("Window rect: {%d,%d,%d,%d} = %d x %d\r\n")\
TEXT("Test time (ms): %d\r\n")\
TEXT("SetWindowPos iterations: %d\r\n");
LPCTSTR pszStaticHdr = TEXT("Passive window msg stats:\r\n");
LPCTSTR pszResizeHdr = TEXT("Resized window msg stats:\r\n");
LPCTSTR pszMsgStats = TEXT("\t%s: %d msgs, %d-%d ms latency\r\n");
switch( iEval )
{
case 0:
wsprintf( szOut, pszHdr,
_rcStop.left, _rcStop.top, _rcStop.right, _rcStop.bottom,
RECTWIDTH(&_rcStop), RECTHEIGHT(&_rcStop),
_cTicks, _cSamples );
break;
case 1:
return pszStaticHdr;
case 2:
{
DWORD nEraseTimeP0 = AvgTime( _cSamples, _rgdwSWP, _rgdwEraseP, 0, nTimeMax );
DWORD nEraseTimePN = AvgTime( _cSamples, _rgdwSWP, _rgdwEraseP, 1, nTimeMax );
wsprintf( szOut, pszMsgStats,
TEXT("WM_ERASEBKGND"), _cEraseP, nEraseTimeP0, nEraseTimePN );
break;
}
case 3:
{
DWORD nNcPaintTimeP0 = AvgTime( _cSamples, _rgdwSWP, _rgdwNcPaintP, 0, nTimeMax );
DWORD nNcPaintTimePN = AvgTime( _cSamples, _rgdwSWP, _rgdwNcPaintP, 1, nTimeMax );
wsprintf( szOut, pszMsgStats,
TEXT("WM_NCPAINT"), _cNcPaintP, nNcPaintTimeP0, nNcPaintTimePN );
break;
}
case 4:
return pszResizeHdr;
case 5:
{
DWORD nNcCalcTimeR0 = AvgTime( _cSamples, _rgdwSWP, _rgdwNcCalcR, 0, nTimeMax );
DWORD nNcCalcTimeRN = AvgTime( _cSamples, _rgdwSWP, _rgdwNcCalcR, 1, nTimeMax );
wsprintf( szOut, pszMsgStats,
TEXT("WM_NCCALCSIZE"), _cNcCalcR, nNcCalcTimeR0, nNcCalcTimeRN );
break;
}
case 6:
{
DWORD nPosChgTimeR0 = AvgTime( _cSamples, _rgdwSWP, _rgdwPosChgR, 0, nTimeMax );
DWORD nPosChgTimeRN = AvgTime( _cSamples, _rgdwSWP, _rgdwPosChgR, 1, nTimeMax );
wsprintf( szOut, pszMsgStats,
TEXT("WM_WINDOWPOSCHANGED"), _cPosChgR, nPosChgTimeR0, nPosChgTimeRN );
break;
}
case 7:
{
DWORD nEraseTimeR0 = AvgTime( _cSamples, _rgdwSWP, _rgdwEraseR, 0, nTimeMax );
DWORD nEraseTimeRN = AvgTime( _cSamples, _rgdwSWP, _rgdwEraseR, 1, nTimeMax );
wsprintf( szOut, pszMsgStats,
TEXT("WM_ERASEBKGND"), _cEraseR, nEraseTimeR0, nEraseTimeRN );
break;
}
case 8:
{
DWORD nNcPaintTimeR0 = AvgTime( _cSamples, _rgdwSWP, _rgdwNcPaintR, 0, nTimeMax );
DWORD nNcPaintTimeRN = AvgTime( _cSamples, _rgdwSWP, _rgdwNcPaintR, 1, nTimeMax );
wsprintf( szOut, pszMsgStats,
TEXT("WM_NCPAINT"), _cNcPaintR, nNcPaintTimeR0, nNcPaintTimeRN );
break;
}
default:
return NULL;
}
return szOut;
}
public:
HWND _hwnd;
RECT _rcStart;
RECT _rcStop;
DWORD _cSamples; // number of SetWindowPos calls issued to resize the window.
DWORD _cEraseP; // count of WM_ERASEBACKGROUNDs received by passive window
DWORD _cNcPaintP; // count of WM_NCPAINTs received by passive window
DWORD _cNcCalcR; // count of WM_NCCALCSIZEs received by resized window
DWORD _cNcPaintR; // count of WM_NCPAINTs received by resized window
DWORD _cEraseR; // count of WM_ERASEBACKGROUNDs received by resized window
DWORD _cPosChgR; // count of WM_WINDOWPOSCHANGED received by resized window
DWORD _rgdwSWP[SAMPLE_SIZE];
DWORD _rgdwEraseP[SAMPLE_SIZE][2];
DWORD _rgdwNcPaintP[SAMPLE_SIZE][2];
DWORD _rgdwNcCalcR[SAMPLE_SIZE][2];
DWORD _rgdwNcPaintR[SAMPLE_SIZE][2];
DWORD _rgdwEraseR[SAMPLE_SIZE][2];
DWORD _rgdwPosChgR[SAMPLE_SIZE][2];
static TIMECAPS _tc;
static UINT _idTimer;
static LONG _cTicks;
};
TIMECAPS CResizeData::_tc = {0};
UINT CResizeData::_idTimer = 0;
LONG CResizeData::_cTicks = 0;
//-------------------------------------------------------------------------//
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_NCPERF);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if ( !TranslateMDISysAccel(_hwndMdiClient, &msg) &&
!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
//-------------------------------------------------------------------------//
BOOL RegisterClasses(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
ZeroMemory( &wcex, sizeof(wcex) );
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)MainWndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_NCPERF);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_NCPERF);
wcex.lpszClassName = WC_NCPERFMAIN;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
if( !RegisterClassEx(&wcex) )
return FALSE;
wcex.style = 0;
wcex.lpfnWndProc = (WNDPROC)CoverWndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_NCPERF);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_COVER);
wcex.lpszClassName = WC_NCPERFCOVERWND;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
if( !RegisterClassEx(&wcex) )
return FALSE;
ZeroMemory( &wcex, sizeof(wcex) );
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)MdiChildProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_NCPERF);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszClassName = WC_NCPERFMDICHILD;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
if( !RegisterClassEx(&wcex) )
return FALSE;
return TRUE;
}
//-------------------------------------------------------------------------//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
_hInst = hInstance; // Store instance handle in our global variable
// Initialize global strings
if( !RegisterClasses(hInstance) )
return FALSE;
if( TIMERR_NOERROR != timeGetDevCaps( &CResizeData::_tc, sizeof(CResizeData::_tc) ) )
return FALSE;
HWND hwnd = CreateWindow( WC_NCPERFMAIN,
TEXT("NcPerf Test Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, _hInst, NULL);
if( hwnd )
{
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
}
return TRUE;
}
//-------------------------------------------------------------------------//
BOOL Deg2Rad( double* pval )
{
if( *pval >= 0 && *pval <= 360 )
{
*pval = ((*pval) * 22)/(7 * 180);
return TRUE;
}
return FALSE;
}
//-------------------------------------------------------------------------//
void PinCover( HWND hwndMain )
{
if( IsWindow(_hwndCover) )
{
RECT rc;
GetWindowRect( hwndMain, &rc );
InflateRect( &rc, -_sizeOffset.cx, -_sizeOffset.cx );
SetWindowPos( _hwndCover, hwndMain, rc.left, rc.top,
RECTWIDTH(&rc), RECTHEIGHT(&rc),
SWP_NOZORDER|SWP_NOACTIVATE );
}
}
//-------------------------------------------------------------------------//
BOOL CirclePtNext( IN OUT INT* pnAngle /*degrees*/, OUT POINT& pt, OUT OPTIONAL BOOL* pfRoll )
{
if( *pnAngle < 0 || *pnAngle >= 360 )
{
*pnAngle = 0;
if( pfRoll )
*pfRoll = TRUE;
}
// increase angle
double nAngle = _nRot + MOVE_ANGLE_INCR;
// establish new x, y
if( Deg2Rad( &nAngle ) )
{
pt.x = (long)(_nRadius * cos( nAngle ));
pt.y = (long)(_nRadius * sin( nAngle ));
(*pnAngle) += MOVE_ANGLE_INCR;
return TRUE;
}
return FALSE;
}
//-------------------------------------------------------------------------//
ULONG AvgTime( ULONG cSamples, DWORD rgdwStart[], DWORD rgdwStop[][2], int iStop, ULONG& nTimeMax )
{
ULONG dwTime = 0;
for( ULONG i = 0, cnt = 0; i < cSamples; i++ )
{
if( rgdwStop[i][iStop] && rgdwStart[i] &&
rgdwStop[i][iStop] > rgdwStart[i] )
{
dwTime += (rgdwStop[i][iStop] - rgdwStart[i]);
cnt++;
if( rgdwStop[i][iStop] > nTimeMax )
nTimeMax = rgdwStop[i][iStop];
}
}
return cnt ? (dwTime / cnt) : 0;
}
//-------------------------------------------------------------------------//
inline void LogMsg( DWORD rgdwMsg[][2], ULONG& cnt )
{
DWORD nTick = CResizeData::_cTicks;
if(!rgdwMsg[_pData->_cSamples][0] )
rgdwMsg[_pData->_cSamples][0] = nTick;
rgdwMsg[_pData->_cSamples][1] = nTick;
cnt++;
}
//-------------------------------------------------------------------------//
void RunTests( HWND hwndMain )
{
HWND hwnd = CreateWindow( WC_NCPERFCOVERWND,
TEXT("NcPerf Cover Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, _hInst, NULL);
if( hwnd )
{
_cRep = 0;
PinCover( hwndMain );
ShowWindow( hwnd, SW_SHOWNORMAL );
UpdateWindow( hwnd );
if( CResizeData::Start( hwndMain ) )
{
for( int i=0; i < SAMPLE_SIZE; i++ )
{
PostMessage( hwndMain, WM_KICKRESIZE, 0, 0 );
}
PostMessage( hwndMain, WM_STOPTEST, 0, 0 );
}
else
{
DestroyWindow( hwnd );
}
}
}
//-------------------------------------------------------------------------//
inline void SWAP( long& x, long& y )
{
long z = x;
x = y;
y = z;
}
//-------------------------------------------------------------------------//
inline void NORMALIZERECT( LPRECT prc )
{
if( prc->right < prc->left )
SWAP( prc->right, prc->left );
if( prc->bottom < prc->top )
SWAP( prc->bottom, prc->top );
}
enum RECTVERTEX
{
LEFTTOP,
RIGHTTOP,
LEFTBOTTOM,
RIGHTBOTTOM,
};
void _MoveVertex( RECTVERTEX v, IN OUT RECT& rc, const RECT& rcMain, const POINT& pt, IN OUT ULONG& fSwp )
{
rc.left = rcMain.left + _sizeOffset.cx;
rc.top = rcMain.top + _sizeOffset.cy;
rc.right = rcMain.right - _sizeOffset.cx;
rc.bottom = rcMain.bottom - _sizeOffset.cy;
switch( v )
{
case LEFTTOP:
rc.left = rcMain.left + _nRadius + pt.x;
rc.top = rcMain.top + _nRadius + pt.y;
fSwp |= SWP_NOMOVE;
break;
case RIGHTTOP:
rc.right = rcMain.right - (_nRadius + pt.x);
rc.top = rcMain.top + _nRadius + pt.y;
break;
case LEFTBOTTOM:
rc.left = rcMain.left + _nRadius + pt.x;
rc.bottom = rcMain.bottom - (_nRadius + pt.y);
break;
case RIGHTBOTTOM:
rc.right = rcMain.right - (_nRadius + pt.x);
rc.bottom = rcMain.bottom - (_nRadius + pt.y);
break;
}
}
//-------------------------------------------------------------------------//
void ResizeCover( HWND hwndMain )
{
POINT pt;
BOOL fRollover = FALSE;
CirclePtNext( &_nRot, pt, &fRollover );
RECT rc, rcMain;
GetWindowRect( hwndMain, &rcMain );
GetWindowRect( _hwndCover, &rc );
ULONG nFlags = SWP_NOZORDER|SWP_NOACTIVATE;
if( fRollover )
{
_cRep++;
PinCover( hwndMain );
}
RECTVERTEX v = LEFTTOP;
int phase = _cRep % 20;
if( phase < 5 )
{
v = LEFTTOP;
}
else if( phase < 10 )
{
v = RIGHTTOP;
}
else if( phase < 15 )
{
v = LEFTBOTTOM;
}
else
{
v = RIGHTBOTTOM;
}
_MoveVertex( v, rc, rcMain, pt, nFlags );
if( _pData->_cSamples + 1 >= SAMPLE_SIZE )
{
CResizeData::Stop( hwndMain );
}
else
{
_pData->_rgdwSWP[_pData->_cSamples] = CResizeData::_cTicks;
SetWindowPos( _hwndCover, NULL, rc.left, rc.top, RECTWIDTH(&rc), RECTHEIGHT(&rc),
SWP_NOZORDER|SWP_NOACTIVATE );
_pData->_cSamples++;
}
}
//-------------------------------------------------------------------------//
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = 0L;
switch (uMsg)
{
case WM_KICKRESIZE:
ResizeCover( hwnd );
break;
case WM_STOPTEST:
CResizeData::Stop( hwnd );
break;
case WM_ERASEBKGND:
lRet = DefWindowProc( hwnd, uMsg, wParam, lParam );
if( _pData )
{
LogMsg( _pData->_rgdwEraseP, _pData->_cEraseP );
}
break;
case WM_NCPAINT:
lRet = DefWindowProc( hwnd, uMsg, wParam, lParam );
if( _pData )
{
LogMsg( _pData->_rgdwNcPaintP, _pData->_cNcPaintP );
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
break;
}
case WM_TIMER:
{
if( _hwndCover )
{
ResizeCover( hwnd );
}
}
break;
case WM_CREATE:
{
_hwndMain = hwnd;
#if 0
RECT rc;
GetClientRect( hwnd, &rc );
CLIENTCREATESTRUCT ccs = {0};
ccs.idFirstChild = 1;
_hwndMdiClient = CreateWindow( TEXT("MDICLIENT"), TEXT(""),
WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL,
rc.left, rc.top, RECTWIDTH(&rc), RECTHEIGHT(&rc),
hwnd, NULL, _hInst, &ccs );
if( _hwndMdiClient )
{
MDICREATESTRUCT mcs = {0};
mcs.szClass = WC_NCPERFMDICHILD;
mcs.szTitle = TEXT("Nc Perf");
mcs.hOwner = _hInst;
mcs.x = CW_USEDEFAULT; mcs.y = 0; mcs.cx = CW_USEDEFAULT; mcs.cy = 0;
mcs.style = WS_OVERLAPPEDWINDOW;
mcs.lParam = 0;
for( int i = 0; i < MDICHILD_COUNT; i++ )
SendMessage( _hwndMdiClient, WM_MDICREATE, 0, (LPARAM)&mcs);
SendMessage( _hwndMdiClient, WM_MDITILE, MDITILE_HORIZONTAL, 0 );
return 0;
}
return -1;
#else
return 0;
#endif 0
}
case WM_COMMAND:
// Parse the menu selections:
switch (LOWORD(wParam))
{
case ID_START:
RunTests( hwnd );
break;
case IDM_STOP:
CResizeData::Stop( hwnd );
if( IsWindow( _hwndCover ) )
DestroyWindow( _hwndCover );
break;
case IDM_ABOUT:
DialogBox(_hInst, (LPCTSTR)IDD_ABOUTBOX, hwnd, (DLGPROC)NilDlgProc);
break;
case IDM_EXIT:
DestroyWindow(hwnd);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
break;
case WM_DESTROY:
CResizeData::Stop(hwnd);
PostQuitMessage(0);
break;
default:
return _hwndMdiClient ?
DefFrameProc(hwnd, _hwndMdiClient, uMsg, wParam, lParam) :
DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return lRet;
}
//-------------------------------------------------------------------------//
LRESULT CALLBACK CoverWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = 0L;
switch (uMsg)
{
case WM_CREATE:
_hwndCover = hwnd;
return 0;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDM_STOP:
CResizeData::Stop( hwnd );
if( IsWindow( _hwndCover ) )
DestroyWindow( _hwndCover );
break;
}
break;
case WM_ERASEBKGND:
lRet = DefWindowProc( hwnd, uMsg, wParam, lParam );
if( _pData )
{
LogMsg( _pData->_rgdwEraseR, _pData->_cEraseR );
}
break;
case WM_NCCALCSIZE:
lRet = DefWindowProc( hwnd, uMsg, wParam, lParam );
if( _pData )
{
LogMsg( _pData->_rgdwNcCalcR, _pData->_cNcCalcR );
}
break;
case WM_NCPAINT:
lRet = DefWindowProc( hwnd, uMsg, wParam, lParam );
if( _pData )
{
LogMsg( _pData->_rgdwNcPaintR, _pData->_cNcPaintR );
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
break;
}
case WM_WINDOWPOSCHANGED:
lRet = DefWindowProc( hwnd, uMsg, wParam, lParam );
if( _pData )
{
LogMsg( _pData->_rgdwPosChgR, _pData->_cPosChgR );
}
break;
case WM_NCDESTROY:
_hwndCover = NULL;
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return lRet;
}
//-------------------------------------------------------------------------//
LRESULT CALLBACK MdiChildProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefMDIChildProc(hwnd, uMsg, wParam, lParam);
}
//-------------------------------------------------------------------------//
LRESULT CALLBACK ResultsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if( WM_INITDIALOG == uMsg )
{
if( lParam )
{
LPCTSTR pszRes;
int i;
for( i = 0; (pszRes = ((CResizeData*)lParam)->Evaluate(i)) != NULL; i++ )
{
SendDlgItemMessage( hwnd, IDC_RESULTS, EM_SETSEL, -1, 0 );
SendDlgItemMessage( hwnd, IDC_RESULTS, EM_REPLACESEL, FALSE, (LPARAM)pszRes );
}
}
}
return NilDlgProc( hwnd, uMsg, wParam, lParam );
}
//-------------------------------------------------------------------------//
LRESULT CALLBACK NilDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}