mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
989 lines
25 KiB
989 lines
25 KiB
/*
|
|
|
|
CFileWindow.CPP
|
|
|
|
File window class
|
|
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include <commdlg.h>
|
|
#include "resource.h"
|
|
#include "cfilewindow.h"
|
|
|
|
#define BUFFER_GROW_SIZE 1024
|
|
|
|
#define CURSOR_BLINK 1000
|
|
#define LEFT_MARGIN_SIZE 40
|
|
|
|
#define MIN( _arg1, _arg2 ) (( _arg1 < _arg2 ? _arg1 : _arg2 ))
|
|
#define MAX( _arg1, _arg2 ) (( _arg1 > _arg2 ? _arg1 : _arg2 ))
|
|
|
|
#define DUMP_RECT( _rect ) { TCHAR sz[MAX_PATH]; wsprintf( sz, "( L%u, %T%u, R%u, B%u )", _rect.left, _rect.top, _rect.right, _rect.bottom ); OutputDebugString( sz ); }
|
|
|
|
//#define DEBUG_PAINT
|
|
|
|
//
|
|
// Constructor
|
|
//
|
|
CFileWindow::CFileWindow(
|
|
HWND hParent )
|
|
{
|
|
TCHAR szTitle[ MAX_PATH ];
|
|
|
|
_hParent = hParent;
|
|
_pszFilename = NULL;
|
|
_nLength = 0;
|
|
_pLine = NULL;
|
|
|
|
LoadString( g_hInstance,
|
|
IDS_UNTITLED,
|
|
szTitle,
|
|
sizeof(szTitle)/sizeof(szTitle[0]) );
|
|
|
|
_hWnd = CreateWindowEx( WS_EX_ACCEPTFILES,
|
|
CFILEWINDOWCLASS,
|
|
szTitle,
|
|
WS_OVERLAPPEDWINDOW
|
|
| WS_CLIPSIBLINGS,
|
|
CW_USEDEFAULT,
|
|
0,
|
|
CW_USEDEFAULT,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
g_hInstance,
|
|
(LPVOID) this);
|
|
if (!_hWnd)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ShowWindow( _hWnd, SW_NORMAL );
|
|
UpdateWindow( _hWnd );
|
|
}
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
CFileWindow::~CFileWindow( )
|
|
{
|
|
if ( _pszFilename )
|
|
LocalFree( _pszFilename );
|
|
|
|
if ( _pLine )
|
|
LocalFree( _pLine );
|
|
}
|
|
|
|
//
|
|
// _UpdateTitle( )
|
|
//
|
|
HRESULT
|
|
CFileWindow::_UpdateTitle( )
|
|
{
|
|
TCHAR szTitleBar[ MAX_PATH * 2 ];
|
|
LPTSTR pszTitle;
|
|
|
|
if ( _pszFilename )
|
|
{
|
|
pszTitle = strrchr( _pszFilename, TEXT('\\') );
|
|
if ( pszTitle )
|
|
{
|
|
INT iResult;
|
|
TCHAR ch;
|
|
TCHAR szCWD[ MAX_PATH ];
|
|
|
|
GetCurrentDirectory( MAX_PATH, szCWD );
|
|
|
|
ch = *pszTitle; // save
|
|
*pszTitle = 0; // terminate
|
|
iResult = strcmp( szCWD, _pszFilename );// compare
|
|
*pszTitle = ch; // restore
|
|
pszTitle++; // skip past the slash
|
|
if ( iResult != 0 )
|
|
{
|
|
pszTitle = _pszFilename;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pszTitle = _pszFilename;
|
|
}
|
|
|
|
strcpy( szTitleBar, pszTitle );
|
|
}
|
|
else
|
|
{
|
|
LoadString( g_hInstance,
|
|
IDS_UNTITLED,
|
|
szTitleBar,
|
|
sizeof(szTitleBar)/sizeof(szTitleBar[0]) );
|
|
}
|
|
|
|
SetWindowText( _hWnd, szTitleBar );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// SetInformation( )
|
|
//
|
|
HRESULT
|
|
CFileWindow::SetInformation(
|
|
ULONG nNode,
|
|
LPTSTR pszFilename,
|
|
LINEPOINTER * pLineBuffer,
|
|
ULONG nLineCount )
|
|
{
|
|
SCROLLINFO si;
|
|
|
|
if ( pszFilename )
|
|
{
|
|
if ( _pszFilename )
|
|
LocalFree( _pszFilename );
|
|
|
|
_pszFilename = pszFilename;
|
|
_UpdateTitle( );
|
|
}
|
|
|
|
_nNode = nNode;
|
|
_pLine = pLineBuffer;
|
|
_nLineCount = nLineCount;
|
|
|
|
if ( !_fVertSBVisible
|
|
&& _yWindow < (LONG)(_nLineCount * _tm.tmHeight) )
|
|
{
|
|
_fVertSBVisible = TRUE;
|
|
EnableScrollBar( _hWnd, SB_VERT, ESB_ENABLE_BOTH );
|
|
ShowScrollBar( _hWnd, SB_VERT, TRUE );
|
|
}
|
|
else if ( _fVertSBVisible
|
|
&& _yWindow >= (LONG)(_nLineCount * _tm.tmHeight) )
|
|
{
|
|
_fVertSBVisible = FALSE;
|
|
//EnableScrollBar( _hWnd, SB_VERT, ESB_ENABLE_BOTH );
|
|
ShowScrollBar( _hWnd, SB_VERT, FALSE );
|
|
}
|
|
|
|
si.cbSize = sizeof(si);
|
|
si.fMask = SIF_RANGE;
|
|
si.nMin = 0;
|
|
si.nMax = _nLineCount;
|
|
SetScrollInfo( _hWnd, SB_VERT, &si, TRUE );
|
|
|
|
InvalidateRect( _hWnd, NULL, TRUE );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// _OnPaint( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnPaint(
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
HDC hdc;
|
|
TCHAR szBuf[ 6 ]; // max 5-digits
|
|
LONG y;
|
|
LONG wx; // window coords
|
|
LONG wy;
|
|
RECT rect;
|
|
RECT rectResult;
|
|
SIZE size;
|
|
LPTSTR pszStartLine; // beginning of line (PID/TID)
|
|
LPTSTR pszStartTimeDate; // beginning of time/data stamp
|
|
LPTSTR pszStartComponent; // beginning of component name
|
|
LPTSTR pszStartResType; // beginning of a resource component
|
|
LPTSTR pszStartText; // beginning of text
|
|
LPTSTR pszCurrent; // current position and beginning of text
|
|
|
|
SCROLLINFO si;
|
|
PAINTSTRUCT ps;
|
|
|
|
#if 0
|
|
#if defined(_DEBUG)
|
|
static DWORD cPaint = 0;
|
|
{
|
|
TCHAR szBuf[ MAX_PATH ];
|
|
wsprintf( szBuf, "%u paint\n", ++cPaint );
|
|
OutputDebugString( szBuf );
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
si.cbSize = sizeof(si);
|
|
si.fMask = SIF_POS | SIF_PAGE;
|
|
GetScrollInfo( _hWnd, SB_VERT, &si );
|
|
|
|
hdc = BeginPaint( _hWnd, &ps);
|
|
|
|
if ( !_pLine )
|
|
goto EndPaint;
|
|
|
|
SetBkMode( hdc, OPAQUE );
|
|
SelectObject( hdc, g_hFont );
|
|
|
|
y = si.nPos;
|
|
|
|
wy = 0;
|
|
while ( y <= (LONG)(si.nPos + si.nPage)
|
|
&& y < _nLineCount )
|
|
{
|
|
// draw line number
|
|
SetRect( &rect,
|
|
0,
|
|
wy,
|
|
LEFT_MARGIN_SIZE,
|
|
wy + _tm.tmHeight );
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
//FillRect( hdc, &rect, g_pConfig->GetMarginColor( ) );
|
|
|
|
SetBkColor( hdc, GetSysColor( COLOR_GRAYTEXT ) );
|
|
SetTextColor( hdc, GetSysColor( COLOR_WINDOWTEXT ) );
|
|
|
|
DrawText( hdc,
|
|
szBuf,
|
|
wsprintf( szBuf, TEXT("%05.5u"), y ),
|
|
&rect,
|
|
DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE );
|
|
}
|
|
|
|
wx = LEFT_MARGIN_SIZE;
|
|
|
|
if ( _pLine[ y ].psLine )
|
|
{
|
|
|
|
//
|
|
// KB: This is what a typical cluster log line looks like.
|
|
// 3fc.268::1999/07/19-19:14:45.548 [EVT] Node up: 2, new UpNodeSet: 0002
|
|
// 3fc.268::1999/07/19-19:14:45.548 [EVT] EvOnline : calling ElfRegisterClusterSvc
|
|
// 3fc.268::1999/07/19-19:14:45.548 [GUM] GumSendUpdate: queuing update type 2 context 19
|
|
// 3fc.268::1999/07/19-19:14:45.548 [GUM] GumSendUpdate: Dispatching seq 2585 type 2 context 19 to node 1
|
|
// 3fc.268::1999/07/19-19:14:45.548 [NM] Received update to set extended state for node 1 to 0
|
|
// 3fc.268::1999/07/19-19:14:45.548 [NM] Issuing event 0.
|
|
// 3fc.268::1999/07/19-19:14:45.548 [GUM] GumSendUpdate: completed update seq 2585 type 2 context 19
|
|
// 37c.3a0::1999/07/19-19:14:45.548 Physical Disk: AddVolume : \\?\Volume{99d8d508-39fa-11d3-a200-806d6172696f}\ 'C', 7 (11041600)
|
|
// 37c.3a0::1999/07/19-19:14:45.558 Physical Disk: AddVolume: GetPartitionInfo(\??\Volume{99d8d503-39fa-11d3-a200-806d6172696f}), error 170
|
|
// 37c.3a0::1999/07/19-19:14:45.568 Physical Disk: AddVolume: GetPartitionInfo(\??\Volume{99d8d504-39fa-11d3-a200-806d6172696f}), error 170
|
|
// 37c.3a0::1999/07/19-19:14:45.568 Physical Disk: AddVolume: GetPartitionInfo(\??\Volume{99d8d505-39fa-11d3-a200-806d6172696f}), error 170
|
|
// 37c.3a0::1999/07/19-19:14:45.578 Physical Disk: AddVolume: GetPartitionInfo(\??\Volume{99d8d506-39fa-11d3-a200-806d6172696f}), error 170
|
|
// 37c.3a0::1999/07/19-19:14:45.578 Physical Disk: AddVolume: GetPartitionInfo(\??\Volume{99d8d501-39fa-11d3-a200-806d6172696f}), error 1
|
|
//
|
|
|
|
if ( _pLine[ y ].nFile != _nNode )
|
|
goto SkipLine;
|
|
|
|
pszStartResType =
|
|
pszStartComponent = NULL;
|
|
pszStartLine =
|
|
pszStartText =
|
|
pszStartTimeDate =
|
|
pszCurrent = _pLine[ y ].psLine;
|
|
|
|
// Find the thread and process IDs
|
|
while ( *pszCurrent && *pszCurrent != ':' && *pszCurrent >= 32 )
|
|
{
|
|
pszCurrent++;
|
|
}
|
|
if ( *pszCurrent < 32 )
|
|
goto DrawRestOfLine;
|
|
|
|
pszCurrent++;
|
|
if ( *pszCurrent != ':' )
|
|
goto DrawRestOfLine;
|
|
|
|
pszCurrent++;
|
|
|
|
// Find Time/Date stamp which is:
|
|
// ####/##/##-##:##:##.###<space>
|
|
pszStartTimeDate = pszCurrent;
|
|
|
|
while ( *pszCurrent && *pszCurrent != ' ' && *pszCurrent >= 32 )
|
|
{
|
|
pszCurrent++;
|
|
}
|
|
if ( *pszCurrent < 32 )
|
|
goto DrawRestOfLine;
|
|
|
|
pszCurrent++;
|
|
|
|
pszStartText = pszCurrent;
|
|
|
|
// [OPTIONAL] Cluster component which looks like:
|
|
// [<id...>]
|
|
if ( *pszCurrent == '[' )
|
|
{
|
|
while ( *pszCurrent && *pszCurrent != ']' && *pszCurrent >= 32 )
|
|
{
|
|
pszCurrent++;
|
|
}
|
|
if ( *pszCurrent < 32 )
|
|
goto NoComponentTryResouce;
|
|
|
|
pszCurrent++;
|
|
|
|
pszStartComponent = pszStartText;
|
|
pszStartText = pszCurrent;
|
|
}
|
|
else
|
|
{
|
|
// [OPTIONAL] If not a component, see if there is a res type
|
|
NoComponentTryResouce:
|
|
pszCurrent = pszStartText;
|
|
|
|
while ( *pszCurrent && *pszCurrent != ':' && *pszCurrent >= 32 )
|
|
{
|
|
pszCurrent++;
|
|
}
|
|
|
|
if ( *pszCurrent >= 32 )
|
|
{
|
|
pszCurrent++;
|
|
|
|
pszStartResType = pszStartText;
|
|
pszStartText = pszCurrent;
|
|
}
|
|
}
|
|
|
|
if ( pszStartComponent )
|
|
{
|
|
DWORD n = 0;
|
|
LONG nLen = pszStartText - pszStartComponent - 2;
|
|
LPTSTR psz = g_pszFilters;
|
|
while ( n < g_nComponentFilters )
|
|
{
|
|
if ( g_pfSelectedComponent[ n ]
|
|
&& ( nLen == lstrlen( psz ) )
|
|
&& ( _strnicmp( pszStartComponent + 1, psz, nLen ) == 0 ) )
|
|
goto SkipLine;
|
|
|
|
while ( *psz )
|
|
{
|
|
psz++;
|
|
}
|
|
psz += 2;
|
|
|
|
n++;
|
|
}
|
|
}
|
|
#if 0
|
|
if ( pszStartResType )
|
|
{
|
|
if ( !g_fNetworkName
|
|
&& _strnicmp( pszStartResType, "Network Name", sizeof("Network Name") - 1 ) == 0 )
|
|
goto SkipLine;
|
|
if ( !g_fGenericService
|
|
&& _strnicmp( pszStartResType, "Generic Service", sizeof("Generic Service") - 1 ) == 0 )
|
|
goto SkipLine;
|
|
if ( !g_fPhysicalDisk
|
|
&& _strnicmp( pszStartResType, "Physical Disk", sizeof("Physical Disk") - 1 ) == 0 )
|
|
goto SkipLine;
|
|
if ( !g_fIPAddress
|
|
&& _strnicmp( pszStartResType, "IP Address", sizeof("IP Address") - 1 ) == 0 )
|
|
goto SkipLine;
|
|
if ( !g_fGenericApplication
|
|
&& _strnicmp( pszStartResType, "Generic Application", sizeof("Generic Application") - 1 ) == 0 )
|
|
goto SkipLine;
|
|
if ( !g_fFileShare
|
|
&& _strnicmp( pszStartResType, "File Share", sizeof("File Share") - 1 ) == 0 )
|
|
goto SkipLine;
|
|
}
|
|
#endif
|
|
|
|
// Draw PID and TID
|
|
GetTextExtentPoint32( hdc,
|
|
pszStartLine,
|
|
pszStartTimeDate - pszStartLine - 2,
|
|
&size );
|
|
|
|
SetRect( &rect,
|
|
wx,
|
|
wy,
|
|
wx + size.cx,
|
|
wy + _tm.tmHeight );
|
|
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
SetBkColor( hdc, 0xFF8080 );
|
|
SetTextColor( hdc, 0x000000 );
|
|
|
|
DrawText( hdc,
|
|
pszStartLine,
|
|
pszStartTimeDate - pszStartLine - 2,
|
|
&rect,
|
|
DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE );
|
|
}
|
|
|
|
wx += size.cx;
|
|
|
|
GetTextExtentPoint32( hdc,
|
|
"::",
|
|
2,
|
|
&size );
|
|
|
|
SetRect( &rect,
|
|
wx,
|
|
wy,
|
|
wx + size.cx,
|
|
wy + _tm.tmHeight );
|
|
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
SetBkColor( hdc, 0xFFFFFF );
|
|
SetTextColor( hdc, 0x000000 );
|
|
|
|
DrawText( hdc,
|
|
"::",
|
|
2,
|
|
&rect,
|
|
DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE );
|
|
}
|
|
|
|
wx += size.cx;
|
|
|
|
// Draw Time/Date
|
|
pszCurrent = ( pszStartComponent ?
|
|
pszStartComponent :
|
|
( pszStartResType ?
|
|
pszStartResType :
|
|
pszStartText )
|
|
) - 1;
|
|
GetTextExtentPoint32( hdc,
|
|
pszStartTimeDate,
|
|
pszCurrent - pszStartTimeDate,
|
|
&size );
|
|
|
|
SetRect( &rect,
|
|
wx,
|
|
wy,
|
|
wx + size.cx,
|
|
wy + _tm.tmHeight );
|
|
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
SetBkColor( hdc, 0x80FF80 );
|
|
SetTextColor( hdc, 0x000000 );
|
|
|
|
DrawText( hdc,
|
|
pszStartTimeDate,
|
|
pszCurrent - pszStartTimeDate,
|
|
&rect,
|
|
DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE );
|
|
}
|
|
|
|
wx += size.cx;
|
|
|
|
// Draw component
|
|
if ( pszStartComponent )
|
|
{
|
|
GetTextExtentPoint32( hdc,
|
|
pszStartComponent,
|
|
pszStartText - pszStartComponent,
|
|
&size );
|
|
|
|
SetRect( &rect,
|
|
wx,
|
|
wy,
|
|
wx + size.cx,
|
|
wy + _tm.tmHeight );
|
|
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
SetBkColor( hdc, GetSysColor( COLOR_WINDOW ) );
|
|
SetTextColor( hdc, 0x800000 );
|
|
|
|
DrawText( hdc,
|
|
pszStartComponent,
|
|
pszStartText - pszStartComponent,
|
|
&rect,
|
|
DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE );
|
|
}
|
|
|
|
wx += size.cx;
|
|
}
|
|
|
|
if ( pszStartResType )
|
|
{
|
|
GetTextExtentPoint32( hdc,
|
|
pszStartResType,
|
|
pszStartText - pszStartResType,
|
|
&size );
|
|
|
|
SetRect( &rect,
|
|
wx,
|
|
wy,
|
|
wx + size.cx,
|
|
wy + _tm.tmHeight );
|
|
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
SetBkColor( hdc, GetSysColor( COLOR_WINDOW ) );
|
|
SetTextColor( hdc, 0x008000 );
|
|
|
|
DrawText( hdc,
|
|
pszStartResType,
|
|
pszStartText - pszStartResType,
|
|
&rect,
|
|
DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE );
|
|
}
|
|
|
|
wx += size.cx;
|
|
}
|
|
|
|
DrawRestOfLine:
|
|
pszCurrent = pszStartText;
|
|
|
|
while ( *pszCurrent && *pszCurrent != 13 )
|
|
{
|
|
pszCurrent++;
|
|
}
|
|
|
|
GetTextExtentPoint32( hdc,
|
|
pszStartText,
|
|
pszCurrent - pszStartText,
|
|
&size );
|
|
|
|
SetRect( &rect,
|
|
wx,
|
|
wy,
|
|
wx + size.cx,
|
|
wy + _tm.tmHeight );
|
|
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
SetBkColor( hdc, GetSysColor( COLOR_WINDOW ) );
|
|
SetTextColor( hdc, GetSysColor( COLOR_WINDOWTEXT ) );
|
|
|
|
DrawText( hdc,
|
|
pszStartText,
|
|
pszCurrent - pszStartText,
|
|
&rect,
|
|
DT_NOCLIP /*| DT_NOPREFIX */ | DT_SINGLELINE );
|
|
}
|
|
|
|
wx += size.cx;
|
|
}
|
|
|
|
SkipLine:
|
|
SetRect( &rect,
|
|
wx,
|
|
wy,
|
|
_xWindow,
|
|
wy + _tm.tmHeight );
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
HBRUSH hBrush;
|
|
hBrush = CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );
|
|
FillRect( hdc, &rect, hBrush );
|
|
DeleteObject( hBrush );
|
|
}
|
|
|
|
wy += _tm.tmHeight;
|
|
y++;
|
|
}
|
|
|
|
SetRect( &rect,
|
|
wx,
|
|
wy,
|
|
_xWindow,
|
|
wy + _tm.tmHeight );
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
HBRUSH hBrush;
|
|
hBrush = CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );
|
|
FillRect( hdc, &rect, hBrush );
|
|
DeleteObject( hBrush );
|
|
}
|
|
|
|
SetRect( &rect,
|
|
0,
|
|
wy + _tm.tmHeight,
|
|
LEFT_MARGIN_SIZE,
|
|
_yWindow );
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
HBRUSH hBrush;
|
|
hBrush = CreateSolidBrush( GetSysColor( COLOR_GRAYTEXT ) );
|
|
FillRect( hdc, &rect, hBrush );
|
|
DeleteObject( hBrush );
|
|
}
|
|
|
|
SetRect( &rect,
|
|
LEFT_MARGIN_SIZE,
|
|
wy + _tm.tmHeight,
|
|
_xWindow,
|
|
_yWindow );
|
|
if ( IntersectRect( &rectResult, &ps.rcPaint, &rect ) )
|
|
{
|
|
HBRUSH hBrush;
|
|
hBrush = CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );
|
|
FillRect( hdc, &rect, hBrush );
|
|
DeleteObject( hBrush );
|
|
}
|
|
|
|
EndPaint:
|
|
EndPaint(_hWnd, &ps);
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// _OnCommand( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnCommand(
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
UINT cmd = LOWORD(wParam);
|
|
switch ( cmd )
|
|
{
|
|
// Pass these back up
|
|
case IDM_OPEN_FILE:
|
|
return SendMessage( GetParent( GetParent( _hWnd ) ), WM_COMMAND, IDM_OPEN_FILE, 0 );
|
|
|
|
case IDM_NEW_FILE:
|
|
return SendMessage( GetParent( GetParent( _hWnd ) ), WM_COMMAND, IDM_NEW_FILE, 0 );
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return DefWindowProc( _hWnd, WM_COMMAND, wParam, lParam);
|
|
}
|
|
|
|
|
|
//
|
|
// _OnCloseWindow( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnCloseWindow( )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// _OnDestroyWindow( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnDestroyWindow( )
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// _OnFocus( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnFocus(
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// _OnKillFocus( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnKillFocus(
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
HideCaret( _hWnd );
|
|
DestroyCaret( );
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// _OnTimer( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnTimer(
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
OutputDebugString( "Timer!\n" );
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// _OnKeyUp( )
|
|
//
|
|
BOOL
|
|
CFileWindow::_OnKeyUp(
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//
|
|
// _OnVerticalScroll( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnVerticalScroll(
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
SCROLLINFO si;
|
|
|
|
INT nScrollCode = LOWORD(wParam); // scroll bar value
|
|
INT nPos;
|
|
//INT nPos = HIWORD(wParam); // scroll box position
|
|
//HWND hwndScrollBar = (HWND) lParam; // handle to scroll bar
|
|
|
|
si.cbSize = sizeof(si);
|
|
si.fMask = SIF_ALL;
|
|
GetScrollInfo( _hWnd, SB_VERT, &si );
|
|
|
|
nPos = si.nPos;
|
|
|
|
switch( nScrollCode )
|
|
{
|
|
case SB_BOTTOM:
|
|
si.nPos = si.nMax;
|
|
break;
|
|
|
|
case SB_THUMBPOSITION:
|
|
si.nPos = nPos;
|
|
break;
|
|
|
|
case SB_THUMBTRACK:
|
|
si.nPos = si.nTrackPos;
|
|
break;
|
|
|
|
case SB_TOP:
|
|
si.nPos = si.nMin;
|
|
break;
|
|
|
|
case SB_LINEDOWN:
|
|
si.nPos += 1;
|
|
break;
|
|
|
|
case SB_LINEUP:
|
|
si.nPos -= 1;
|
|
break;
|
|
|
|
case SB_PAGEDOWN:
|
|
si.nPos += si.nPage;
|
|
break;
|
|
|
|
case SB_PAGEUP:
|
|
si.nPos -= si.nPage;
|
|
break;
|
|
}
|
|
|
|
si.fMask = SIF_POS;
|
|
SetScrollInfo( _hWnd, SB_VERT, &si, TRUE );
|
|
GetScrollInfo( _hWnd, SB_VERT, &si );
|
|
|
|
if ( si.nPos != nPos )
|
|
{
|
|
ScrollWindowEx( _hWnd,
|
|
0,
|
|
(nPos - si.nPos) * _tm.tmHeight,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
SW_INVALIDATE );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// _OnCreate( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnCreate(
|
|
HWND hwnd,
|
|
LPCREATESTRUCT pcs )
|
|
{
|
|
_hWnd = hwnd;
|
|
|
|
SetWindowLong( _hWnd, GWL_USERDATA, (LONG) this );
|
|
|
|
_UpdateTitle( );
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
//
|
|
// _OnSize( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnSize(
|
|
LPARAM lParam )
|
|
{
|
|
HDC hdc;
|
|
SIZE size;
|
|
HGDIOBJ hObj;
|
|
TCHAR szSpace[ 1 ] = { TEXT(' ') };
|
|
|
|
SCROLLINFO si;
|
|
|
|
_xWindow = LOWORD( lParam );
|
|
_yWindow = HIWORD( lParam );
|
|
|
|
hdc = GetDC( _hWnd );
|
|
hObj = SelectObject( hdc, g_hFont );
|
|
GetTextMetrics( hdc, &_tm );
|
|
|
|
GetTextExtentPoint32( hdc, szSpace, 1, &size );
|
|
_xSpace = size.cx;
|
|
|
|
si.cbSize = sizeof(si);
|
|
si.fMask = SIF_RANGE | SIF_PAGE;
|
|
si.nMin = 0;
|
|
si.nMax = _nLineCount;
|
|
si.nPage = _yWindow / _tm.tmHeight;
|
|
|
|
SetScrollInfo( _hWnd, SB_VERT, &si, FALSE );
|
|
|
|
// cleanup the HDC
|
|
SelectObject( hdc, hObj );
|
|
ReleaseDC( _hWnd, hdc );
|
|
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// _OnMouseWheel( )
|
|
//
|
|
LRESULT
|
|
CFileWindow::_OnMouseWheel( SHORT iDelta )
|
|
{
|
|
if ( iDelta > 0 )
|
|
{
|
|
SendMessage( _hWnd, WM_VSCROLL, SB_LINEUP, 0 );
|
|
SendMessage( _hWnd, WM_VSCROLL, SB_LINEUP, 0 );
|
|
SendMessage( _hWnd, WM_VSCROLL, SB_LINEUP, 0 );
|
|
}
|
|
else if ( iDelta < 0 )
|
|
{
|
|
SendMessage( _hWnd, WM_VSCROLL, SB_LINEDOWN, 0 );
|
|
SendMessage( _hWnd, WM_VSCROLL, SB_LINEDOWN, 0 );
|
|
SendMessage( _hWnd, WM_VSCROLL, SB_LINEDOWN, 0 );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// WndProc( )
|
|
//
|
|
LRESULT CALLBACK
|
|
CFileWindow::WndProc(
|
|
HWND hWnd,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
CFileWindow * pfw = (CFileWindow *) GetWindowLong( hWnd, GWL_USERDATA );
|
|
|
|
if ( pfw != NULL )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_COMMAND:
|
|
return pfw->_OnCommand( wParam, lParam );
|
|
|
|
case WM_PAINT:
|
|
return pfw->_OnPaint( wParam, lParam );
|
|
|
|
case WM_CLOSE:
|
|
return pfw->_OnCloseWindow( );
|
|
|
|
case WM_DESTROY:
|
|
SetWindowLong( hWnd, GWL_USERDATA, NULL );
|
|
return pfw->_OnDestroyWindow( );
|
|
|
|
case WM_SETFOCUS:
|
|
pfw->_OnFocus( wParam, lParam );
|
|
break; // don't return!
|
|
|
|
case WM_KILLFOCUS:
|
|
return pfw->_OnKillFocus( wParam, lParam );
|
|
|
|
case WM_TIMER:
|
|
return pfw->_OnTimer( wParam, lParam );
|
|
|
|
case WM_SIZE:
|
|
return pfw->_OnSize( lParam );
|
|
|
|
case WM_KEYDOWN:
|
|
case WM_SYSKEYDOWN:
|
|
if ( pfw->_OnKeyDown( wParam, lParam ) )
|
|
return 0;
|
|
break; // do default as well
|
|
|
|
case WM_KEYUP:
|
|
case WM_SYSKEYUP:
|
|
if ( pfw->_OnKeyUp( wParam, lParam ) )
|
|
return 0;
|
|
break;
|
|
|
|
case WM_VSCROLL:
|
|
return pfw->_OnVerticalScroll( wParam, lParam );
|
|
|
|
case WM_MOUSEWHEEL:
|
|
return pfw->_OnMouseWheel( HIWORD(wParam) );
|
|
}
|
|
}
|
|
|
|
if ( uMsg == WM_CREATE )
|
|
{
|
|
LPCREATESTRUCT pcs = (LPCREATESTRUCT) lParam;
|
|
//LPMDICREATESTRUCT pmdics = (LPMDICREATESTRUCT) pcs->lpCreateParams;
|
|
//pfw = (CFileWindow *) pmdics->lParam;
|
|
pfw = (CFileWindow *) pcs->lpCreateParams;
|
|
return pfw->_OnCreate( hWnd, pcs );
|
|
}
|
|
|
|
if ( uMsg == WM_ERASEBKGND )
|
|
{
|
|
RECT rect;
|
|
RECT rectWnd;
|
|
|
|
HDC hdc = (HDC) wParam;
|
|
HBRUSH hBrush;
|
|
#if defined(DEBUG_PAINT)
|
|
hBrush = CreateSolidBrush( 0xFF00FF );
|
|
#else
|
|
hBrush = CreateSolidBrush( GetSysColor( COLOR_GRAYTEXT ) );
|
|
#endif
|
|
|
|
GetClientRect( hWnd, &rectWnd );
|
|
SetRect( &rect,
|
|
0,
|
|
0,
|
|
LEFT_MARGIN_SIZE,
|
|
rectWnd.bottom );
|
|
FillRect( hdc, &rect, hBrush );
|
|
DeleteObject( hBrush );
|
|
|
|
#if defined(DEBUG_PAINT)
|
|
hBrush = CreateSolidBrush( 0xFF00FF );
|
|
#else
|
|
hBrush = CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );
|
|
#endif
|
|
SetRect( &rect,
|
|
LEFT_MARGIN_SIZE,
|
|
0,
|
|
rectWnd.right,
|
|
rectWnd.bottom );
|
|
|
|
FillRect( hdc, &rect, hBrush );
|
|
DeleteObject( hBrush );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return DefWindowProc( hWnd, uMsg, wParam, lParam );
|
|
}
|
|
|