📄 window.h
字号:
void OnUndo()
{
throw TEXT("NoRoute");
}
};
// A terminal window.
class WINDOW_API WTerminal : public WTerminalBase, public FOutputDevice
{
W_DECLARE_CLASS(WTerminal,WTerminalBase,CLASS_Transient);
DECLARE_WINDOWCLASS(WTerminal,WTerminalBase,Window)
// Variables.
WEditTerminal Display;
FExec* Exec;
INT MaxLines, SlackLines;
TCHAR Typing[256];
UBOOL Shown;
// Structors.
WTerminal()
{}
WTerminal( FName InPersistentName, WWindow* InOwnerWindow )
: WTerminalBase ( InPersistentName, InOwnerWindow )
, Display ( this )
, Exec ( NULL )
, MaxLines ( 256 )
, SlackLines ( 64 )
, Shown ( 0 )
{
appStrcpy( Typing, TEXT(">") );
}
// FOutputDevice interface.
void Serialize( const TCHAR* Data, EName MsgType )
{
guard(WTerminal::Serialize);
if( MsgType==NAME_Title )
{
SetText( Data );
return;
}
else if( Shown )
{
Display.SetRedraw( 0 );
INT LineCount = Display.GetLineCount();
if( LineCount > MaxLines )
{
INT NewLineCount = Max(LineCount-SlackLines,0);
INT Index = Display.GetLineIndex( LineCount-NewLineCount );
Display.SetSelection( 0, Index );
Display.SetSelectedText( TEXT("") );
INT Length = Display.GetLength();
Display.SetSelection( Length, Length );
Display.ScrollCaret();
}
TCHAR Temp[1024]=TEXT("");
appStrncat( Temp, *FName(MsgType), ARRAY_COUNT(Temp) );
appStrncat( Temp, TEXT(": "), ARRAY_COUNT(Temp) );
appStrncat( Temp, (TCHAR*)Data, ARRAY_COUNT(Temp) );
appStrncat( Temp, TEXT("\r\n"), ARRAY_COUNT(Temp) );
appStrncat( Temp, Typing, ARRAY_COUNT(Temp) );
Temp[ARRAY_COUNT(Temp)-1] = 0;
SelectTyping();
Display.SetRedraw( 1 );
Display.SetSelectedText( Temp );
}
unguard;
}
// WWindow interface.
void OnShowWindow( UBOOL bShow )
{
guard(WTerminal::OnShowWindow);
Shown = bShow;
unguard;
}
void OnCreate()
{
guard(WTerminal::OnCreate);
WWindow::OnCreate();
Display.OpenWindow( 1, 1, 1 );
Display.SetFont( (HFONT)GetStockObject(DEFAULT_GUI_FONT) );
Display.SetText( Typing );
unguard;
}
void OpenWindow( UBOOL bMdi=0, UBOOL AppWindow=0 )
{
guard(WTerminal::OpenWindow);
MdiChild = bMdi;
PerformCreateWindowEx
(
MdiChild
? (WS_EX_MDICHILD)
: (AppWindow?WS_EX_APPWINDOW:0),
*FString::Printf( LocalizeGeneral("LogWindow",TEXT("Window")), LocalizeGeneral("Product",TEXT("Core")) ),
MdiChild
? (WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
: (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX),
CW_USEDEFAULT,
CW_USEDEFAULT,
512,
256,
OwnerWindow ? OwnerWindow->hWnd : NULL,
NULL,
hInstance
);
unguard;
}
void OnSetFocus( HWND hWndLoser )
{
guard(WTerminal::OnSetFocus);
WWindow::OnSetFocus( hWndLoser );
SetFocus( Display );
unguard;
}
void OnSize( DWORD Flags, INT NewX, INT NewY )
{
guard(WTerminal::OnSize);
WWindow::OnSize( Flags, NewX, NewY );
Display.MoveWindow( FRect(0,0,NewX,NewY), TRUE );
Display.ScrollCaret();
unguard;
}
// WTerminalBase interface.
void Paste()
{
guard(WTerminal::Paste);
SelectTyping();
FString Str = appClipboardPaste();
appStrncat( Typing, *Str, ARRAY_COUNT(Typing) );
Typing[ARRAY_COUNT(Typing)-1]=0;
for( INT i=0; Typing[i]; i++ )
if( Typing[i]<32 || Typing[i]>=127 )
Typing[i] = 0;
UpdateTyping();
unguard;
}
void TypeChar( TCHAR Ch )
{
guard(WTerminal::TypeChar);
SelectTyping();
INT Length = appStrlen(Typing);
if( Ch>=32 )
{
if( Length<ARRAY_COUNT(Typing)-1 )
{
Typing[Length]=Ch;
Typing[Length+1]=0;
}
}
else if( Ch==13 && Length>1 )
{
UpdateTyping();
Display.SetSelectedText( TEXT("\r\n>") );
TCHAR Temp[ARRAY_COUNT(Typing)];
appStrcpy( Temp, Typing+1 );
appStrcpy( Typing, TEXT(">") );
if( Exec )
if( !Exec->Exec( Temp, *GLog ) )
Log( LocalizeError("Exec",TEXT("Core")) );
SelectTyping();
}
else if( (Ch==8 || Ch==127) && Length>1 )
{
Typing[Length-1] = 0;
}
else if( Ch==27 )
{
appStrcpy( Typing, TEXT(">") );
}
UpdateTyping();
if( Ch==22 )
{
Paste();
}
unguard;
}
// WTerminal interface.
void SelectTyping()
{
guard(WTerminal::SelectTyping);
INT Length = Display.GetLength();
Display.SetSelection( Max(Length-appStrlen(Typing),0), Length );
unguard;
}
void UpdateTyping()
{
guard(WTerminal::UpdateTyping);
Display.SetSelectedText( Typing );
unguard;
}
void SetExec( FExec* InExec )
{
Exec = InExec;
}
};
/*-----------------------------------------------------------------------------
WLog.
-----------------------------------------------------------------------------*/
// A log window.
static void GNotifyExit()
{
if( GNotify )
TCHAR_CALL_OS(Shell_NotifyIconWX(NIM_DELETE,&NID),Shell_NotifyIconA(NIM_DELETE,&NIDA));
}
class WINDOW_API WLog : public WTerminal
{
W_DECLARE_CLASS(WLog,WTerminal,CLASS_Transient);
DECLARE_WINDOWCLASS(WLog,WTerminal,Window)
// Variables.
UINT NidMessage;
FArchive*& LogAr;
FString LogFilename;
// Functions.
WLog()
:LogAr(LogAr)
{}
WLog( const TCHAR* InLogFilename, FArchive*& InLogAr, FName InPersistentName, WWindow* InOwnerWindow=NULL )
: WTerminal( InPersistentName, InOwnerWindow )
, NidMessage( RegisterWindowMessageX( TEXT("UnrealNidMessage")) )
, LogAr( InLogAr )
, LogFilename( InLogFilename )
{}
void SetText( const TCHAR* Text )
{
guard(WLog::SetText);
WWindow::SetText( Text );
if( GNotify )
{
#if UNICODE
if( GUnicode && !GUnicodeOS )
{
appMemcpy( NIDA.szTip, TCHAR_TO_ANSI(Text), Min<INT>(ARRAY_COUNT(NIDA.szTip),appStrlen(Text)+1) );
NIDA.szTip[ARRAY_COUNT(NIDA.szTip)-1]=0;
Shell_NotifyIconA( NIM_MODIFY, &NIDA );
}
else
#endif
{
appStrncpy( NID.szTip, Text, ARRAY_COUNT(NID.szTip) );
#if UNICODE
Shell_NotifyIconWX(NIM_MODIFY,&NID);
#else
Shell_NotifyIconA(NIM_MODIFY,&NID);
#endif
}
}
unguard;
}
void OnShowWindow( UBOOL bShow )
{
guard(WLog::OnShowWindow);
WTerminal::OnShowWindow( bShow );
if( bShow )
{
// Load log file.
if( LogAr )
{
delete LogAr;
FArchive* Reader = GFileManager->CreateFileReader( *LogFilename );
if( Reader )
{
#if FORCE_ANSI_LOG
TArray<ANSICHAR> AnsiText( Reader->TotalSize() );
Reader->Serialize( &AnsiText(0), AnsiText.Num() );
delete Reader;
INT CrCount=0;
for( INT Ofs=AnsiText.Num()-1; Ofs>0 && CrCount<MaxLines; Ofs-- )
CrCount += (AnsiText(Ofs)=='\n');
while( Ofs<AnsiText.Num() && AnsiText(Ofs)=='\n' )
Ofs++;
AnsiText.AddItem( '>' );
AnsiText.AddItem( 0 );
TArray<TCHAR> Text( AnsiText.Num() );
for( INT i=0; i<AnsiText.Num(); i++ )
Text( i ) = FromAnsi( AnsiText(i) );
Display.SetText( &Text(Ofs) );
#else
TArray<TCHAR> Text( Reader->TotalSize() );
Reader->Serialize( &Text(0), Text.Num()/sizeof(TCHAR)-GUnicode*2 );
delete Reader;
INT CrCount=0;
for( INT Ofs=Text.Num()-1; Ofs>0 && CrCount<MaxLines; Ofs-- )
CrCount += (Text(Ofs)=='\n');
while( Ofs<Text.Num() && Text(Ofs)=='\n' )
Ofs++;
Text.AddItem( '>' );
Text.AddItem( 0 );
Display.SetText( &Text(Ofs) );
#endif
}
LogAr = GFileManager->CreateFileWriter( *LogFilename, 1, 0, 1, 1 );
}
INT Length = Display.GetLength();
Display.SetSelection( Length, Length );
Display.ScrollCaret();
}
unguard;
}
void OpenWindow( UBOOL bShow, UBOOL bMdi )
{
guard(WLog::OpenWindow);
WTerminal::OpenWindow( bMdi, 0 );
Show( bShow );
UpdateWindow( *this );
GLogHook = this;
// Show dedicated server in tray.
if( !GIsClient && !GIsEditor )
{
NID.cbSize = sizeof(NID);
NID.hWnd = hWnd;
NID.uID = 0;
NID.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
NID.uCallbackMessage = NidMessage;
NID.hIcon = LoadIconIdX(hInstanceWindow,IDICON_Mainframe);
NID.szTip[0] = 0;
#if UNICODE
if( GUnicode && !GUnicodeOS )
{
NIDA.cbSize = sizeof(NIDA);
NIDA.hWnd = hWnd;
NIDA.uID = 0;
NIDA.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
NIDA.uCallbackMessage = NidMessage;
NIDA.hIcon = LoadIconIdX(hInstanceWindow,IDICON_Mainframe);
NIDA.szTip[0] = 0;
Shell_NotifyIconA(NIM_ADD,&NIDA);
}
else
#endif
{
#if UNICODE
Shell_NotifyIconWX(NIM_ADD,&NID);
#else
Shell_NotifyIconA(NIM_ADD,&NID);
#endif
}
GNotify = 1;
atexit( GNotifyExit );
}
unguard;
}
void OnDestroy()
{
guard(WLog::OnDestroy);
GLogHook = NULL;
WTerminal::OnDestroy();
unguard;
}
void OnCopyData( HWND hWndSender, COPYDATASTRUCT* CD )
{
guard(OnCopyData);
if( Exec )
{
debugf( TEXT("WM_COPYDATA: %s"), (TCHAR*)CD->lpData );
Exec->Exec( TEXT("TakeFocus"), *GLogWindow );
TCHAR NewURL[1024];
if
( ParseToken(*(TCHAR**)&CD->lpData,NewURL,ARRAY_COUNT(NewURL),0)
&& NewURL[0]!='-')
Exec->Exec( *(US+TEXT("Open ")+NewURL),*GLogWindow );
}
unguard;
}
void OnClose()
{
guard(WLog::OnClose);
Show( 0 );
throw TEXT("NoRoute");
unguard;
}
void OnCommand( INT Command )
{
guard(WLog::OnCommand);
if( Command==ID_LogFileExit || Command==ID_NotifyExit )
{
// Exit.
debugf( TEXT("WLog::OnCommand %s"), Command==ID_LogFileExit ? TEXT("ID_LogFileExit") : TEXT("ID_NotifyExit") );
appRequestExit( 0 );
}
else if( Command==ID_LogAdvancedOptions || Command==ID_NotifyAdvancedOptions )
{
// Advanced options.
if( Exec )
Exec->Exec( TEXT("PREFERENCES"), *GLogWindow );
}
else if( Command==ID_NotifyShowLog )
{
// Show log window.
ShowWindow( hWnd, SW_SHOWNORMAL );
SetForegroundWindow( hWnd );
}
unguard;
}
LONG WndProc( UINT Message, UINT wParam, LONG lParam )
{
guard(WLog::WndProc);
if( Message==NidMessage )
{
if( lParam==WM_RBUTTONDOWN || lParam==WM_LBUTTONDOWN )
{
// Options.
POINT P;
::GetCursorPos( &P );
HMENU hMenu = LoadLocalizedMenu( hInstanceWindow, IDMENU_NotifyIcon, TEXT("IDMENU_NotifyIcon"), TEXT("Window") );
SetForegroundWindow( hWnd );
TrackPopupMenu( GetSubMenu(hMenu,0), lParam==WM_LBUTTONDOWN ? TPM_LEFTBUTTON : TPM_RIGHTBUTTON, P.x, P.y, 0, hWnd, NULL );
PostMessageX( hWnd, WM_NULL, 0, 0 );
}
return 1;
}
else return WWindow::WndProc( Message, wParam, lParam );
unguard;
}
};
/*-----------------------------------------------------------------------------
WDialog.
-----------------------------------------------------------------------------*/
// A dialog window, always based on a Visual C++ dialog template.
class WINDOW_API WDialog : public WWindow
{
W_DECLARE_ABSTRACT_CLASS(WDialog,WWindow,CLASS_Transient);
// Constructors.
WDialog()
{}
WDialog( FName InPersistentName, INT InDialogId, WWindow* InOwnerWindow=NULL )
: WWindow( InPersistentName, InOwnerWindow )
{
ControlId = InDialogId;
}
// WDialog interface.
INT CallDefaultProc( UINT Message, UINT wParam, LONG lParam )
{
return 0;
}
virtual INT DoModal( HINSTANCE hInst=hInstanceWindow )
{
guard(WDialog::DoModal);
check(hWnd==NULL);
_Windows.AddItem( this );
ModalCount++;
INT Result = TCHAR_CALL_OS(DialogBoxParamW(hInst/*!!*/,MAKEINTRESOURCEW(ControlId),OwnerWindow?OwnerWindow->hWnd:NULL,(INT(APIENTRY*)(HWND,UINT,WPARAM,LPARAM))StaticWndProc,(LPARAM)this),DialogBoxParamA(hInst/*!!*/,MAKEINTRESOURCEA(ControlId),OwnerWindow?OwnerWindow->hWnd:NULL,(INT(APIENTRY*)(HWND,UINT,WPARAM,LPARAM))StaticWndProc,(LPARAM)this));
ModalCount--;
return Result;
unguard;
}
void OpenChildWindow( INT InControlId, UBOOL Visible )
{
guard(WDialog::OpenChildWindow);
check(!hWnd);
_Windows.AddItem( this );
HWND hWndParent = InControlId ? GetDlgItem(OwnerWindow->hWnd,InControlId) : OwnerWindow ? OwnerWindow->hWnd : NULL;
HWND hWndCreated = TCHAR_CALL_OS(CreateDialogParamW(hInstanceWindow/*!!*/,MAKEINTRESOURCEW(ControlId),hWndParent,(INT(APIENTRY*)(HWND,UINT,WPARAM,LPARAM))StaticWndProc,(LPARAM)this),CreateDialogParamA(hInstanceWindow/*!!*/,MAKEINTRESOURCEA(ControlId),hWndParent,(INT(APIENTRY*)(HWND,UINT,WPARAM,LPARAM))StaticWndProc,(LPARAM)this));
c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -