|
|
//-------------------------------------------------------------------------//
// 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; }
|