mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-20 04:26:03 +08:00
Added most recent version of unmodified HL2 SDK for Orange Box engine
This commit is contained in:
333
utils/common/consolewnd.cpp
Normal file
333
utils/common/consolewnd.cpp
Normal file
@ -0,0 +1,333 @@
|
||||
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//=============================================================================//
|
||||
|
||||
#include <windows.h>
|
||||
#include "consolewnd.h"
|
||||
|
||||
|
||||
#pragma warning( disable : 4311 ) // warning C4311: 'reinterpret_cast' : pointer truncation from 'CConsoleWnd *const ' to 'LONG'
|
||||
#pragma warning( disable : 4312 ) // warning C4312: 'type cast' : conversion from 'LONG' to 'CConsoleWnd *' of greater size
|
||||
|
||||
#define EDITCONTROL_BORDER_SIZE 5
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
// Functions to manage the console window.
|
||||
// ------------------------------------------------------------------------------------------------ //
|
||||
|
||||
class CConsoleWnd : public IConsoleWnd
|
||||
{
|
||||
public:
|
||||
CConsoleWnd();
|
||||
~CConsoleWnd();
|
||||
|
||||
bool Init( void *hInstance, int dialogResourceID, int editControlID, bool bVisible );
|
||||
void Term();
|
||||
|
||||
virtual void Release();
|
||||
|
||||
virtual void SetVisible( bool bVisible );
|
||||
virtual bool IsVisible() const;
|
||||
|
||||
virtual void PrintToConsole( const char *pMsg );
|
||||
virtual void SetTitle( const char *pTitle );
|
||||
|
||||
virtual void SetDeleteOnClose( bool bDelete );
|
||||
|
||||
|
||||
private:
|
||||
|
||||
int WindowProc(
|
||||
HWND hwndDlg, // handle to dialog box
|
||||
UINT uMsg, // message
|
||||
WPARAM wParam, // first message parameter
|
||||
LPARAM lParam // second message parameter
|
||||
);
|
||||
|
||||
static int CALLBACK StaticWindowProc(
|
||||
HWND hwndDlg, // handle to dialog box
|
||||
UINT uMsg, // message
|
||||
WPARAM wParam, // first message parameter
|
||||
LPARAM lParam // second message parameter
|
||||
);
|
||||
|
||||
void RepositionEditControl();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
HWND m_hWnd;
|
||||
HWND m_hEditControl;
|
||||
bool m_bVisible;
|
||||
bool m_bDeleteOnClose;
|
||||
int m_nCurrentChars;
|
||||
};
|
||||
|
||||
|
||||
CConsoleWnd::CConsoleWnd()
|
||||
{
|
||||
m_hWnd = m_hEditControl = NULL;
|
||||
m_bVisible = false;
|
||||
m_bDeleteOnClose = false;
|
||||
m_nCurrentChars = 0;
|
||||
}
|
||||
|
||||
|
||||
CConsoleWnd::~CConsoleWnd()
|
||||
{
|
||||
Term();
|
||||
}
|
||||
|
||||
bool CConsoleWnd::Init( void *hInstance, int dialogResourceID, int editControlID, bool bVisible )
|
||||
{
|
||||
// Create the window.
|
||||
m_hWnd = CreateDialog(
|
||||
(HINSTANCE)hInstance,
|
||||
MAKEINTRESOURCE( dialogResourceID ),
|
||||
NULL,
|
||||
&CConsoleWnd::StaticWindowProc );
|
||||
|
||||
if ( !m_hWnd )
|
||||
return false;
|
||||
|
||||
SetWindowLong( m_hWnd, GWL_USERDATA, reinterpret_cast< LONG >( this ) );
|
||||
if ( bVisible )
|
||||
ShowWindow( m_hWnd, SW_SHOW );
|
||||
|
||||
// Get a handle to the edit control.
|
||||
m_hEditControl = GetDlgItem( m_hWnd, editControlID );
|
||||
if ( !m_hEditControl )
|
||||
return false;
|
||||
|
||||
RepositionEditControl();
|
||||
|
||||
m_bVisible = bVisible;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CConsoleWnd::Term()
|
||||
{
|
||||
if ( m_hWnd )
|
||||
{
|
||||
DestroyWindow( m_hWnd );
|
||||
m_hWnd = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CConsoleWnd::Release()
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
|
||||
|
||||
void CConsoleWnd::SetVisible( bool bVisible )
|
||||
{
|
||||
ShowWindow( m_hWnd, bVisible ? SW_RESTORE : SW_HIDE );
|
||||
|
||||
if ( bVisible )
|
||||
{
|
||||
ShowWindow( m_hWnd, SW_SHOW );
|
||||
SetWindowPos( m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
|
||||
UpdateWindow( m_hWnd );
|
||||
|
||||
int nLen = (int)SendMessage( m_hEditControl, EM_GETLIMITTEXT, 0, 0 );
|
||||
SendMessage( m_hEditControl, EM_SETSEL, nLen, nLen );
|
||||
}
|
||||
else
|
||||
{
|
||||
SetWindowPos( m_hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW | SWP_NOOWNERZORDER );
|
||||
}
|
||||
|
||||
m_bVisible = bVisible;
|
||||
}
|
||||
|
||||
|
||||
bool CConsoleWnd::IsVisible() const
|
||||
{
|
||||
return m_bVisible;
|
||||
}
|
||||
|
||||
|
||||
void CConsoleWnd::PrintToConsole( const char *pMsg )
|
||||
{
|
||||
if ( m_nCurrentChars >= 16*1024 )
|
||||
{
|
||||
// Clear the edit control otherwise it'll stop outputting anything.
|
||||
m_nCurrentChars = 0;
|
||||
|
||||
int nLen = (int)SendMessage( m_hEditControl, EM_GETLIMITTEXT, 0, 0 );
|
||||
SendMessage( m_hEditControl, EM_SETSEL, 0, nLen );
|
||||
SendMessage( m_hEditControl, EM_REPLACESEL, FALSE, (LPARAM)"" );
|
||||
}
|
||||
|
||||
FormatAndSendToEditControl( m_hEditControl, pMsg );
|
||||
m_nCurrentChars += (int)strlen( pMsg );
|
||||
}
|
||||
|
||||
|
||||
void CConsoleWnd::SetTitle( const char *pTitle )
|
||||
{
|
||||
SetWindowText( m_hWnd, pTitle );
|
||||
}
|
||||
|
||||
|
||||
int CConsoleWnd::WindowProc(
|
||||
HWND hwndDlg, // handle to dialog box
|
||||
UINT uMsg, // message
|
||||
WPARAM wParam, // first message parameter
|
||||
LPARAM lParam // second message parameter
|
||||
)
|
||||
{
|
||||
lParam = lParam; // avoid compiler warning
|
||||
|
||||
if ( hwndDlg != m_hWnd )
|
||||
return false;
|
||||
|
||||
switch ( uMsg )
|
||||
{
|
||||
case WM_SYSCOMMAND:
|
||||
{
|
||||
if ( wParam == SC_CLOSE )
|
||||
{
|
||||
if ( m_bDeleteOnClose )
|
||||
{
|
||||
Release();
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVisible( false );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_SHOWWINDOW:
|
||||
{
|
||||
m_bVisible = (wParam != 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_SIZE:
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
RepositionEditControl();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
int CConsoleWnd::StaticWindowProc(
|
||||
HWND hwndDlg, // handle to dialog box
|
||||
UINT uMsg, // message
|
||||
WPARAM wParam, // first message parameter
|
||||
LPARAM lParam // second message parameter
|
||||
)
|
||||
{
|
||||
CConsoleWnd *pDlg = (CConsoleWnd*)GetWindowLong( hwndDlg, GWL_USERDATA );
|
||||
if ( pDlg )
|
||||
return pDlg->WindowProc( hwndDlg, uMsg, wParam, lParam );
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void CConsoleWnd::RepositionEditControl()
|
||||
{
|
||||
RECT rcMain;
|
||||
GetClientRect( m_hWnd, &rcMain );
|
||||
|
||||
RECT rcNew;
|
||||
rcNew.left = rcMain.left + EDITCONTROL_BORDER_SIZE;
|
||||
rcNew.right = rcMain.right - EDITCONTROL_BORDER_SIZE;
|
||||
rcNew.top = rcMain.top + EDITCONTROL_BORDER_SIZE;
|
||||
rcNew.bottom = rcMain.bottom - EDITCONTROL_BORDER_SIZE;
|
||||
|
||||
SetWindowPos(
|
||||
m_hEditControl,
|
||||
NULL,
|
||||
rcNew.left,
|
||||
rcNew.top,
|
||||
rcNew.right - rcNew.left,
|
||||
rcNew.bottom - rcNew.top,
|
||||
SWP_NOZORDER );
|
||||
}
|
||||
|
||||
|
||||
void CConsoleWnd::SetDeleteOnClose( bool bDelete )
|
||||
{
|
||||
m_bDeleteOnClose = bDelete;
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------ //
|
||||
// Module interface.
|
||||
// ------------------------------------------------------------------------------------ //
|
||||
|
||||
void SendToEditControl( HWND hEditControl, const char *pText )
|
||||
{
|
||||
int nLen = (int)SendMessage( hEditControl, EM_GETLIMITTEXT, 0, 0 );
|
||||
SendMessage( hEditControl, EM_SETSEL, nLen, nLen );
|
||||
SendMessage( hEditControl, EM_REPLACESEL, FALSE, (LPARAM)pText );
|
||||
}
|
||||
|
||||
|
||||
void FormatAndSendToEditControl( void *hWnd, const char *pText )
|
||||
{
|
||||
HWND hEditControl = (HWND)hWnd;
|
||||
|
||||
// Translate \n to \r\n.
|
||||
char outMsg[1024];
|
||||
const char *pIn = pText;
|
||||
char *pOut = outMsg;
|
||||
while ( *pIn )
|
||||
{
|
||||
if ( *pIn == '\n' )
|
||||
{
|
||||
*pOut = '\r';
|
||||
pOut++;
|
||||
}
|
||||
*pOut = *pIn;
|
||||
|
||||
++pIn;
|
||||
++pOut;
|
||||
|
||||
if ( pOut - outMsg >= 1020 )
|
||||
{
|
||||
*pOut = 0;
|
||||
SendToEditControl( hEditControl, outMsg );
|
||||
pOut = outMsg;
|
||||
}
|
||||
}
|
||||
*pOut = 0;
|
||||
SendToEditControl( hEditControl, outMsg );
|
||||
}
|
||||
|
||||
|
||||
IConsoleWnd* CreateConsoleWnd( void *hInstance, int dialogResourceID, int editControlID, bool bVisible )
|
||||
{
|
||||
CConsoleWnd *pWnd = new CConsoleWnd;
|
||||
|
||||
if ( pWnd->Init( hInstance, dialogResourceID, editControlID, bVisible ) )
|
||||
{
|
||||
return pWnd;
|
||||
}
|
||||
else
|
||||
{
|
||||
pWnd->Release();
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user