📄 window.h
字号:
/*=============================================================================
Window.h: GUI window management code.
Copyright 1997-1999 Epic Games, Inc. All Rights Reserved.
Revision history:
* Created by Tim Sweeney
=============================================================================*/
#include "..\Src\Res\WindowRes.h"
/*-----------------------------------------------------------------------------
Defines.
-----------------------------------------------------------------------------*/
#ifndef WINDOW_API
#define WINDOW_API __declspec(dllimport)
#endif
#define WIN_OBJ 0
/*-----------------------------------------------------------------------------
Unicode support.
-----------------------------------------------------------------------------*/
#define RegSetValueExX(a,b,c,d,e,f) TCHAR_CALL_OS(RegSetValueExW(a,b,c,d,e,f),RegSetValueExA(a,TCHAR_TO_ANSI(b),c,d,(BYTE*)TCHAR_TO_ANSI((TCHAR*)e),f))
#define RegSetValueX(a,b,c,d,e) TCHAR_CALL_OS(RegSetValueW(a,b,c,d,e),RegSetValueA(a,TCHAR_TO_ANSI(b),c,TCHAR_TO_ANSI(d),e))
#define RegCreateKeyX(a,b,c) TCHAR_CALL_OS(RegCreateKeyW(a,b,c),RegCreateKeyA(a,TCHAR_TO_ANSI(b),c))
#define RegQueryValueX(a,b,c,d) TCHAR_CALL_OS(RegQueryValueW(a,b,c,d),RegQueryValueW(a,TCHAR_TO_ANSI(b),TCHAR_TO_ANSI(c),d))
#define RegOpenKeyX(a,b,c) TCHAR_CALL_OS(RegOpenKeyW(a,b,c),RegOpenKeyA(a,TCHAR_TO_ANSI(b),c))
#define RegDeleteKeyX(a,b) TCHAR_CALL_OS(RegDeleteKeyW(a,b),RegDeleteKeyA(a,TCHAR_TO_ANSI(b)))
#define RegDeleteValueX(a,b) TCHAR_CALL_OS(RegDeleteValueW(a,b),RegDeleteValueA(a,TCHAR_TO_ANSI(b)))
#define RegQueryInfoKeyX(a,b) TCHAR_CALL_OS(RegQueryInfoKeyW(a,NULL,NULL,NULL,b,NULL,NULL,NULL,NULL,NULL,NULL,NULL),RegQueryInfoKeyA(a,NULL,NULL,NULL,b,NULL,NULL,NULL,NULL,NULL,NULL,NULL))
#define RegOpenKeyExX(a,b,c,d,e) TCHAR_CALL_OS(RegOpenKeyExW(a,b,c,d,e),RegOpenKeyExA(a,TCHAR_TO_ANSI(b),c,d,e))
#define LookupPrivilegeValueX(a,b,c) TCHAR_CALL_OS(LookupPrivilegeValueW(a,b,c),LookupPrivilegeValueA(TCHAR_TO_ANSI(a),TCHAR_TO_ANSI(b),c))
#define GetDriveTypeX(a) TCHAR_CALL_OS(GetDriveTypeW(a),GetDriveTypeA(TCHAR_TO_ANSI(a)))
#define GetDiskFreeSpaceX(a,b,c,d,e) TCHAR_CALL_OS(GetDiskFreeSpaceW(a,b,c,d,e),GetDiskFreeSpaceA(TCHAR_TO_ANSI(a),b,c,d,e))
#define SetFileAttributesX(a,b) TCHAR_CALL_OS(SetFileAttributesW(a,b),SetFileAttributesA(TCHAR_TO_ANSI(a),b))
#define DrawTextExX(a,b,c,d,e,f) TCHAR_CALL_OS(DrawTextExW(a,b,c,d,e,f),DrawTextExA(a,const_cast<ANSICHAR*>(TCHAR_TO_ANSI(b)),c,d,e,f))
#define DrawTextX(a,b,c,d,e) TCHAR_CALL_OS(DrawTextW(a,b,c,d,e),DrawTextA(a,TCHAR_TO_ANSI(b),c,d,e))
#define GetTextExtentPoint32X(a,b,c,d) TCHAR_CALL_OS(GetTextExtentPoint32W(a,b,c,d),GetTextExtentPoint32A(a,TCHAR_TO_ANSI(b),c,d))
#define DefMDIChildProcX(a,b,c,d) TCHAR_CALL_OS(DefMDIChildProcW(a,b,c,d),DefMDIChildProcA(a,b,c,d))
#define SetClassLongX(a,b,c) TCHAR_CALL_OS(SetClassLongW(a,b,c),SetClassLongA(a,b,c))
#define GetClassLongX(a,b) TCHAR_CALL_OS(GetClassLongW(a,b),GetClassLongA(a,b))
#define RemovePropX(a,b) TCHAR_CALL_OS(RemovePropW(a,b),RemovePropA(a,TCHAR_TO_ANSI(b)))
#define GetPropX(a,b) TCHAR_CALL_OS(GetPropW(a,b),GetPropA(a,TCHAR_TO_ANSI(b)))
#define SetPropX(a,b,c) TCHAR_CALL_OS(SetPropW(a,b,c),SetPropA(a,TCHAR_TO_ANSI(b),c))
#define ShellExecuteX(a,b,c,d,e,f) TCHAR_CALL_OS(ShellExecuteW(a,b,c,d,e,f),ShellExecuteA(a,TCHAR_TO_ANSI(b),TCHAR_TO_ANSI(c),TCHAR_TO_ANSI(d),TCHAR_TO_ANSI(e),f))
#define CreateMutexX(a,b,c) TCHAR_CALL_OS(CreateMutexW(a,b,c),CreateMutexA(a,b,TCHAR_TO_ANSI(c)))
#define DefFrameProcX(a,b,c,d,e) TCHAR_CALL_OS(DefFrameProcW(a,b,c,d,e),DefFrameProcA(a,b,c,d,e))
#define RegisterWindowMessageX(a) TCHAR_CALL_OS(RegisterWindowMessageW(a),RegisterWindowMessageA(TCHAR_TO_ANSI(a)))
#define AppendMenuX(a,b,c,d) TCHAR_CALL_OS(AppendMenuW(a,b,c,d),AppendMenuA(a,b,c,TCHAR_TO_ANSI(d)))
#define LoadLibraryX(a) TCHAR_CALL_OS(LoadLibraryW(a),LoadLibraryA(TCHAR_TO_ANSI(a)))
#define SystemParametersInfoX(a,b,c,d) TCHAR_CALL_OS(SystemParametersInfoW(a,b,c,d),SystemParametersInfoA(a,b,c,d))
#define DispatchMessageX(a) TCHAR_CALL_OS(DispatchMessageW(a),DispatchMessageA(a))
#define PeekMessageX(a,b,c,d,e) TCHAR_CALL_OS(PeekMessageW(a,b,c,d,e),PeekMessageA(a,b,c,d,e))
#define PostMessageX(a,b,c,d) TCHAR_CALL_OS(PostMessageW(a,b,c,d),PostMessageA(a,b,c,d))
#define SendMessageX(a,b,c,d) TCHAR_CALL_OS(SendMessageW(a,b,c,d),SendMessageA(a,b,c,d))
#define SendMessageLX(a,b,c,d) TCHAR_CALL_OS(SendMessageW(a,b,c,(LPARAM)d),SendMessageA(a,b,c,(LPARAM)TCHAR_TO_ANSI(d)))
#define SendMessageWX(a,b,c,d) TCHAR_CALL_OS(SendMessageW(a,b,(WPARAM)c,d),SendMessageA(a,b,(WPARAM)TCHAR_TO_ANSI(c),d))
#define DefWindowProcX(a,b,c,d) TCHAR_CALL_OS(DefWindowProcW(a,b,c,d),DefWindowProcA(a,b,c,d))
#define CallWindowProcX(a,b,c,d,e) TCHAR_CALL_OS(CallWindowProcW(a,b,c,d,e),CallWindowProcA(a,b,c,d,e))
#define GetWindowLongX(a,b) TCHAR_CALL_OS(GetWindowLongW(a,b),GetWindowLongA(a,b))
#define SetWindowLongX(a,b,c) TCHAR_CALL_OS(SetWindowLongW(a,b,c),SetWindowLongA(a,b,c))
#define LoadMenuIdX(i,n) TCHAR_CALL_OS(LoadMenuW(i,MAKEINTRESOURCEW(n)),LoadMenuA(i,MAKEINTRESOURCEA(n)))
#define LoadCursorIdX(i,n) TCHAR_CALL_OS(LoadCursorW(i,MAKEINTRESOURCEW(n)),LoadCursorA(i,MAKEINTRESOURCEA(n)))
#define LoadIconIdX(i,n) TCHAR_CALL_OS(LoadIconW(i,MAKEINTRESOURCEW(n)),LoadIconA(i,MAKEINTRESOURCEA(n)))
inline DWORD GetTempPathX( DWORD nBufferLength, LPTSTR lpBuffer )
{
DWORD Result;
#if UNICODE
if( !GUnicodeOS )
{
ANSICHAR ACh[MAX_PATH]="";
Result = GetTempPathA( ARRAY_COUNT(ACh), ACh );
appStrncpy( lpBuffer, appFromAnsi(ACh), nBufferLength );
}
else
#endif
{
Result = GetTempPath( nBufferLength, lpBuffer );
}
return Result;
}
inline LONG RegQueryValueExX( HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData )
{
#if UNICODE
if( !GUnicodeOS )
{
ANSICHAR* ACh = (ANSICHAR*)appAlloca(*lpcbData);
LONG Result = RegQueryValueExA( hKey, TCHAR_TO_ANSI(lpValueName), lpReserved, lpType, (BYTE*)ACh, lpcbData );
if( Result==ERROR_SUCCESS )
MultiByteToWideChar( CP_ACP, 0, ACh, -1, (TCHAR*)lpData, *lpcbData );
return Result;
}
else
#endif
{
return RegQueryValueEx( hKey, lpValueName, lpReserved, lpType, lpData, lpcbData );
}
}
#if UNICODE
#define MAKEINTRESOURCEX(a) MAKEINTRESOURCEA(a)
#define OSVERSIONINFOX OSVERSIONINFOA
#define GetVersionExX GetVersionExA
extern WINDOW_API BOOL (WINAPI* Shell_NotifyIconWX)( DWORD dwMessage, PNOTIFYICONDATAW pnid );
extern WINDOW_API BOOL (WINAPI* SHGetSpecialFolderPathWX)( HWND hwndOwner, LPTSTR lpszPath, INT nFolder, BOOL fCreate );
inline HRESULT SHGetSpecialFolderPathX( HWND hwndOwner, LPTSTR lpszPath, INT nFolder, BOOL fCreate )
{
if( !GUnicodeOS || !SHGetSpecialFolderPathWX )
{
ANSICHAR ACh[MAX_PATH];
ITEMIDLIST* IdList=NULL;
#if 1 /* Needed because Windows 95 doesn't export SHGetSpecialFolderPath */
HRESULT Result = SHGetSpecialFolderLocation( NULL, nFolder, &IdList );
SHGetPathFromIDListA( IdList, ACh );
#else
HRESULT Result = SHGetSpecialFolderPathA( hwndOwner, ACh, nFolder, fCreate );
#endif
MultiByteToWideChar( CP_ACP, 0, ACh, -1, lpszPath, MAX_PATH );
return Result;
}
else return SHGetSpecialFolderPathWX( hwndOwner, lpszPath, nFolder, fCreate );
}
#else
#define MAKEINTRESOURCEX(a) MAKEINTRESOURCEA(a)
#define OSVERSIONINFOX OSVERSIONINFOA
#define GetVersionExX GetVersionExA
#define GetTempPathX GetTempPathA
#define SHGetSpecialFolderPathX(a,b,c,d) SHGetSpecialFolderPathA(a,TCHAR_TO_ANSI(b),c,d)
#endif
/*-----------------------------------------------------------------------------
Globals.
-----------------------------------------------------------------------------*/
// Classes.
class WWindow;
class WControl;
class WWizardDialog;
class WWizardPage;
class WDragInterceptor;
// Global functions.
WINDOW_API void InitWindowing();
WINDOW_API HBITMAP LoadFileToBitmap( const TCHAR* Filename, INT& SizeX, INT& SizeY );
// Global variables.
extern WINDOW_API HBRUSH hBrushWhite;
extern WINDOW_API HBRUSH hBrushOffWhite;
extern WINDOW_API HBRUSH hBrushHeadline;
extern WINDOW_API HBRUSH hBrushBlack;
extern WINDOW_API HBRUSH hBrushStipple;
extern WINDOW_API HBRUSH hBrushCurrent;
extern WINDOW_API HBRUSH hBrushDark;
extern WINDOW_API HBRUSH hBrushGrey;
extern WINDOW_API HFONT hFontText;
extern WINDOW_API HFONT hFontUrl;
extern WINDOW_API HFONT hFontHeadline;
extern WINDOW_API class WLog* GLogWindow;
extern WINDOW_API HINSTANCE hInstanceWindow;
extern WINDOW_API UBOOL GNotify;
extern WINDOW_API UINT WindowMessageOpen;
extern WINDOW_API UINT WindowMessageMouseWheel;
extern WINDOW_API NOTIFYICONDATA NID;
#if UNICODE
extern WINDOW_API NOTIFYICONDATAA NIDA;
#else
#define NIDA NID
#endif
/*-----------------------------------------------------------------------------
Window class definition macros.
-----------------------------------------------------------------------------*/
inline void MakeWindowClassName( TCHAR* Result, const TCHAR* Base )
{
guard(MakeWindowClassName);
appSprintf( Result, TEXT("%sUnreal%s"), appPackage(), Base );
unguard;
}
#if WIN_OBJ
#define DECLARE_WINDOWCLASS(cls,parentcls,pkg) \
public: \
void GetWindowClassName( TCHAR* Result ) {MakeWindowClassName(Result,TEXT(#cls));} \
void Destroy() \
{ \
Super::Destroy(); \
MaybeDestroy(); \
} \
virtual const TCHAR* GetPackageName() { return TEXT(#pkg); }
#else
#define DECLARE_WINDOWCLASS(cls,parentcls,pkg) \
public: \
void GetWindowClassName( TCHAR* Result ) {MakeWindowClassName(Result,TEXT(#cls));} \
~cls() {MaybeDestroy();} \
virtual const TCHAR* GetPackageName() { return TEXT(#pkg); }
#endif
#define DECLARE_WINDOWSUBCLASS(cls,parentcls,pkg) \
DECLARE_WINDOWCLASS(cls,parentcls,pkg) \
static WNDPROC SuperProc;
#define IMPLEMENT_WINDOWCLASS(cls,clsf) \
{TCHAR Temp[256]; MakeWindowClassName(Temp,TEXT(#cls)); cls::RegisterWindowClass( Temp, clsf );}
#define IMPLEMENT_WINDOWSUBCLASS(cls,wincls) \
{TCHAR Temp[256]; MakeWindowClassName(Temp,TEXT(#cls)); cls::SuperProc = cls::RegisterWindowClass( Temp, wincls );}
#define FIRST_AUTO_CONTROL 8192
/*-----------------------------------------------------------------------------
FRect.
-----------------------------------------------------------------------------*/
struct FPoint
{
INT X, Y;
FPoint()
{}
FPoint( INT InX, INT InY )
: X( InX )
, Y( InY )
{}
static FPoint ZeroValue()
{
return FPoint(0,0);
}
static FPoint NoneValue()
{
return FPoint(INDEX_NONE,INDEX_NONE);
}
operator POINT*() const
{
return (POINT*)this;
}
const INT& operator()( INT i ) const
{
return (&X)[i];
}
INT& operator()( INT i )
{
return (&X)[i];
}
static INT Num()
{
return 2;
}
UBOOL operator==( const FPoint& Other ) const
{
return X==Other.X && Y==Other.Y;
}
UBOOL operator!=( const FPoint& Other ) const
{
return X!=Other.X || Y!=Other.Y;
}
FPoint& operator+=( const FPoint& Other )
{
X += Other.X;
Y += Other.Y;
return *this;
}
FPoint& operator-=( const FPoint& Other )
{
X -= Other.X;
Y -= Other.Y;
return *this;
}
FPoint operator+( const FPoint& Other ) const
{
return FPoint(*this) += Other;
}
FPoint operator-( const FPoint& Other ) const
{
return FPoint(*this) -= Other;
}
};
struct FRect
{
FPoint Min, Max;
FRect()
{}
FRect( INT X0, INT Y0, INT X1, INT Y1 )
: Min( X0, Y0 )
, Max( X1, Y1 )
{}
FRect( FPoint InMin, FPoint InMax )
: Min( InMin )
, Max( InMax )
{}
FRect( RECT R )
: Min( R.left, R.top )
, Max( R.right, R.bottom )
{}
operator RECT*() const
{
return (RECT*)this;
}
const FPoint& operator()( INT i ) const
{
return (&Min)[i];
}
FPoint& operator()( INT i )
{
return (&Min)[i];
}
static INT Num()
{
return 2;
}
UBOOL operator==( const FRect& Other ) const
{
return Min==Other.Min && Max==Other.Max;
}
UBOOL operator!=( const FRect& Other ) const
{
return Min!=Other.Min || Max!=Other.Max;
}
FRect Right( INT Width )
{
return FRect( ::Max(Min.X,Max.X-Width), Min.Y, Max.X, Max.Y );
}
FRect Bottom( INT Height )
{
return FRect( Min.X, ::Max(Min.Y,Max.Y-Height), Max.X, Max.Y );
}
FPoint Size()
{
return FPoint( Max.X-Min.X, Max.Y-Min.Y );
}
INT Width()
{
return Max.X-Min.X;
}
INT Height()
{
return Max.Y-Min.Y;
}
FRect& operator+=( const FPoint& P )
{
Min += P;
Max += P;
return *this;
}
FRect& operator-=( const FPoint& P )
{
Min -= P;
Max -= P;
return *this;
}
FRect operator+( const FPoint& P ) const
{
return FRect( Min+P, Max+P );
}
FRect operator-( const FPoint& P ) const
{
return FRect( Min-P, Max-P );
}
FRect operator+( const FRect& R ) const
{
return FRect( Min+R.Min, Max+R.Max );
}
FRect operator-( const FRect& R ) const
{
return FRect( Min-R.Min, Max-R.Max );
}
FRect Inner( FPoint P ) const
{
return FRect( Min+P, Max-P );
}
UBOOL Contains( FPoint P ) const
{
return P.X>=Min.X && P.X<Max.X && P.Y>=Min.Y && P.Y<Max.Y;
}
};
/*-----------------------------------------------------------------------------
FControlSnoop.
-----------------------------------------------------------------------------*/
// For forwarding interaction with a control to an object.
class WINDOW_API FControlSnoop
{
public:
// FControlSnoop interface.
virtual void SnoopChar( WWindow* Src, INT Char ) {}
virtual void SnoopKeyDown( WWindow* Src, INT Char ) {}
virtual void SnoopLeftMouseDown( WWindow* Src, FPoint P ) {}
virtual void SnoopRightMouseDown( WWindow* Src, FPoint P ) {}
};
/*-----------------------------------------------------------------------------
FCommandTarget.
-----------------------------------------------------------------------------*/
//
// Interface for accepting commands.
//
class WINDOW_API FCommandTarget
{
public:
virtual void Unused() {}
};
//
// Delegate function pointers.
//
typedef void(FCommandTarget::*TDelegate)();
typedef void(FCommandTarget::*TDelegateInt)(INT);
//
// Simple bindings to an object and a member function of that object.
//
struct WINDOW_API FDelegate
{
FCommandTarget* TargetObject;
void (FCommandTarget::*TargetInvoke)();
FDelegate( FCommandTarget* InTargetObject=NULL, TDelegate InTargetInvoke=NULL )
: TargetObject( InTargetObject )
, TargetInvoke( InTargetInvoke )
{}
virtual void operator()() { if( TargetObject ) (TargetObject->*TargetInvoke)(); }
};
struct WINDOW_API FDelegateInt
{
FCommandTarget* TargetObject;
void (FCommandTarget::*TargetInvoke)(int);
FDelegateInt( FCommandTarget* InTargetObject=NULL, TDelegateInt InTargetInvoke=NULL )
: TargetObject( InTargetObject )
, TargetInvoke( InTargetInvoke )
{}
virtual void operator()( int I ) { if( TargetObject ) (TargetObject->*TargetInvoke)(I); }
};
// Text formatting.
inline const TCHAR* LineFormat( const TCHAR* In )
{
guard(LineFormat);
static TCHAR Result[4069];
TCHAR* Ptr = Result;
while( *In )
*Ptr++ = *In++!='\\' ? In[-1] : *In++=='n' ? '\n' : In[-1];
*Ptr++ = 0;
return Result;
unguard;
}
/*-----------------------------------------------------------------------------
Menu helper functions.
-----------------------------------------------------------------------------*/
//
// Load a menu and localize its text.
//
inline void LocalizeSubMenu( HMENU hMenu, const TCHAR* Name, const TCHAR* Package )
{
guard(LocalizeSubMenu);
for( INT i=GetMenuItemCount(hMenu)-1; i>=0; i-- )
{
#if UNICODE
if( GUnicode && !GUnicodeOS )
{
MENUITEMINFOA Info;
ANSICHAR Buffer[1024];
appMemzero( &Info, sizeof(Info) );
Info.cbSize = sizeof(Info);
Info.fMask = MIIM_TYPE | MIIM_SUBMENU;
Info.cch = ARRAY_COUNT(Buffer);
Info.dwTypeData = Buffer;
GetMenuItemInfoA( hMenu, i, 1, &Info );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -