📄 window.h
字号:
{}
WCoolButton( WWindow* InOwner, INT InId=0, FDelegate InClicked=FDelegate(), DWORD InFlags=CBFF_ShowOver|CBFF_DimAway )
: WButton( InOwner, InId, InClicked )
, hIcon( NULL )
, FrameFlags( InFlags )
{}
// WWindow interface.
void OpenWindow( UBOOL Visible, INT X, INT Y, INT XL, INT YL, const TCHAR* Text )
{
guard(WButton::OpenWindow);
PerformCreateWindowEx
(
0,
NULL,
WS_CHILD | BS_OWNERDRAW,
X, Y,
XL, YL,
*OwnerWindow,
(HMENU)ControlId,
hInstance
);
SetText( Text );
SendMessageX( *this, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(0,0) );
if( Visible )
ShowWindow( *this, SW_SHOWNOACTIVATE );
unguard;
}
void OnDestroy()
{
if( GlobalCoolButton==this )
GlobalCoolButton=NULL;
WButton::OnDestroy();
}
void OnCreate()
{
WButton::OnCreate();
SetClassLongX( *this, GCL_STYLE, GetClassLongX(*this,GCL_STYLE) & ~CS_DBLCLKS);
}
// WCoolButton interface.
void UpdateHighlight( UBOOL TurnOff )
{
guard(WCoolButton::UpdateHighlight);
FPoint P;
FRect R;
::GetCursorPos((POINT*)&P);
::GetWindowRect(*this,(RECT*)&R);
UBOOL ShouldHighlight = (R.Contains(P) || GetCapture()==hWnd) && !TurnOff;
if( (GlobalCoolButton==this) != (ShouldHighlight) )
{
if( GlobalCoolButton==this )
{
GlobalCoolButton = NULL;
KillTimer( hWnd, 0 );
}
else
{
if( GlobalCoolButton )
GlobalCoolButton->UpdateHighlight( 1 );
GlobalCoolButton = this;
SetTimer( hWnd, 0, 50, NULL );
}
InvalidateRect( *this, NULL, 1 );
UpdateWindow( *this );
}
unguard;
}
void OnTimer()
{
guard(WCoolButton::OnTimer);
UpdateHighlight(0);
unguard;
}
INT OnSetCursor()
{
guard(WUrlButton::OnSetCursor);
WButton::OnSetCursor();
UpdateHighlight(0);
if( FrameFlags & CBFF_UrlStyle )
SetCursor(LoadCursorIdX(hInstanceWindow,IDC_Hand));
return 1;
unguard;
}
// WWindow interface.
void OnDrawItem( DRAWITEMSTRUCT* Item )
{
guard(WCoolButton::OnDrawItem);
RECT R=Item->rcItem;
UBOOL Pressed = (Item->itemState&ODS_SELECTED)!=0;
FillRect( Item->hDC, &Item->rcItem, (HBRUSH)(COLOR_BTNFACE+1));
if( GlobalCoolButton==this )
{
if( FrameFlags & CBFF_ShowOver )
DrawEdge( Item->hDC, &Item->rcItem, Pressed?EDGE_SUNKEN:EDGE_RAISED, BF_RECT );
}
else
{
if( FrameFlags & CBFF_DimAway )
DrawEdge( Item->hDC, &Item->rcItem, Pressed?BDR_SUNKENINNER:BDR_RAISEDINNER, BF_RECT );
else if( FrameFlags & CBFF_ShowAway )
DrawEdge( Item->hDC, &Item->rcItem, Pressed?EDGE_SUNKEN:EDGE_RAISED, BF_RECT );
}
R.left += Pressed;
R.right += Pressed;
R.top += Pressed;
R.bottom += Pressed;
if( hIcon )
{
ICONINFO II;
GetIconInfo( hIcon, &II );
DrawIcon( Item->hDC, R.left, R.top + (R.bottom-R.top)/2-II.yHotspot, hIcon );
R.left += II.xHotspot * 2;
}
FString Text = GetText();
DWORD TextFlags
= DT_END_ELLIPSIS
| DT_VCENTER
| DT_SINGLELINE
| ((FrameFlags & CBFF_NoCenter) ? 0 : DT_CENTER);
if( FrameFlags & CBFF_UrlStyle )
{
R.left += 8;
SetTextColor( Item->hDC, RGB(0,0,255) );
SelectObject( Item->hDC, hFontUrl );
}
SetBkMode( Item->hDC, TRANSPARENT );
DrawTextX( Item->hDC, *Text, Text.Len(), &R, TextFlags );
unguard;
}
};
/*-----------------------------------------------------------------------------
WUrlButton.
-----------------------------------------------------------------------------*/
// A URL button.
class WINDOW_API WUrlButton : public WCoolButton
{
W_DECLARE_CLASS(WUrlButton,WCoolButton,CLASS_Transient);
DECLARE_WINDOWSUBCLASS(WUrlButton,WCoolButton,Window)
// Variables.
FString URL;
// Constructor.
WUrlButton()
{}
WUrlButton( WWindow* InOwner, const TCHAR* InURL, INT InId=0 )
: WCoolButton( InOwner, InId, FDelegate(this,(TDelegate)OnClick) )
, URL( InURL )
{
FrameFlags = CBFF_ShowOver | CBFF_UrlStyle | CBFF_NoCenter;
}
// WUrlButton interface.
void OnClick()
{
guard(WUrlButton::OnClick);
ShellExecuteX( GetActiveWindow(), TEXT("open"), *URL, TEXT(""), TEXT(""), SW_SHOWNORMAL );
unguard;
}
};
/*-----------------------------------------------------------------------------
WComboBox.
-----------------------------------------------------------------------------*/
// A combo box control.
class WINDOW_API WComboBox : public WControl
{
W_DECLARE_CLASS(WComboBox,WControl,CLASS_Transient);
DECLARE_WINDOWSUBCLASS(WComboBox,WControl,Window)
// Delegates.
FDelegate DoubleClickDelegate;
FDelegate DropDownDelegate;
FDelegate CloseComboDelegate;
FDelegate EditChangeDelegate;
FDelegate EditUpdateDelegate;
FDelegate SetFocusDelegate;
FDelegate KillFocusDelegate;
FDelegate SelectionChangeDelegate;
FDelegate SelectionEndOkDelegate;
FDelegate SelectionEndCancelDelegate;
// Constructor.
WComboBox()
{}
WComboBox( WWindow* InOwner, INT InId=0, WNDPROC InSuperProc=NULL )
: WControl( InOwner, InId, InSuperProc?InSuperProc:SuperProc )
{}
// WWindow interface.
void OpenWindow( UBOOL Visible )
{
guard(WLabel::OpenWindow);
PerformCreateWindowEx
(
0,
NULL,
WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST | (Visible?WS_VISIBLE:0),
0, 0,
64, 384,
*OwnerWindow,
(HMENU)ControlId,
hInstance
);
SendMessageX( *this, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(0,0) );
unguard;
}
virtual LONG WndProc( UINT Message, UINT wParam, LONG lParam )
{
if( Message==WM_KEYDOWN && (wParam==VK_UP || wParam==VK_DOWN) )
{
// Suppress arrow keys.
if( Snoop )
Snoop->SnoopKeyDown( this, wParam );
return 1;
}
else return WControl::WndProc( Message, wParam, lParam );
}
// WControl interface.
UBOOL InterceptControlCommand( UINT Message, UINT wParam, LONG lParam )
{
guard(WComboBox::InterceptControlCommand);
if ( HIWORD(wParam)==CBN_DBLCLK ) {DoubleClickDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_DROPDOWN ) {DropDownDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_CLOSEUP ) {CloseComboDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_EDITCHANGE ) {EditChangeDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_EDITUPDATE ) {EditUpdateDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_SETFOCUS ) {SetFocusDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_KILLFOCUS ) {KillFocusDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_SELCHANGE ) {SelectionChangeDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_SELENDOK ) {SelectionEndOkDelegate(); return 1;}
else if( HIWORD(wParam)==CBN_SELENDCANCEL ) {SelectionEndCancelDelegate(); return 1;}
else return 0;
unguard;
}
// WComboBox interface.
virtual void AddString( const TCHAR* Str )
{
guard(WComboBox::AddString);
SendMessageLX( *this, CB_ADDSTRING, 0, Str );
unguard;
}
virtual FString GetString( INT Index )
{
guard(WComboBox::GetString);
INT Length = SendMessageX( *this, CB_GETLBTEXTLEN, Index, 0 );
if( Length==CB_ERR )
return TEXT("");
#if UNICODE
if( GUnicode && !GUnicodeOS )
{
ANSICHAR* Text = (ANSICHAR*)appAlloca((Length+1)*sizeof(ANSICHAR));
SendMessageA( *this, CB_GETLBTEXT, Index, (LPARAM)Text );
return appFromAnsi( Text );
}
else
#endif
{
TCHAR* Text = (TCHAR*)appAlloca((Length+1)*sizeof(TCHAR));
SendMessage( *this, CB_GETLBTEXT, Index, (LPARAM)Text );
return Text;
}
unguard;
}
virtual INT GetCount()
{
guard(WComboBox::GetCount);
return SendMessageX( *this, CB_GETCOUNT, 0, 0 );
unguard;
}
virtual void SetCurrent( INT Index )
{
guard(WComboBox::SetCurrent);
SendMessageX( *this, CB_SETCURSEL, Index, 0 );
unguard;
}
virtual INT GetCurrent()
{
guard(WComboBox::GetCurrent);
return SendMessageX( *this, CB_GETCURSEL, 0, 0 );
unguard;
}
virtual INT FindString( const TCHAR* String )
{
guard(WComboBox::FindString);
INT Index = SendMessageLX( *this, CB_FINDSTRING, -1, String );
return Index!=CB_ERR ? Index : -1;
unguard;
}
};
/*-----------------------------------------------------------------------------
WEdit.
-----------------------------------------------------------------------------*/
// A single-line or multiline edit control.
class WINDOW_API WEdit : public WControl
{
W_DECLARE_CLASS(WEdit,WControl,CLASS_Transient);
DECLARE_WINDOWSUBCLASS(WEdit,WControl,Window)
// Variables.
FDelegate ChangeDelegate;
// Constructor.
WEdit()
{}
WEdit( WWindow* InOwner, INT InId=0, WNDPROC InSuperProc=NULL )
: WControl( InOwner, InId, InSuperProc?InSuperProc:SuperProc )
{}
// WWindow interface.
void OpenWindow( UBOOL Visible, UBOOL Multiline, UBOOL ReadOnly )
{
guard(WEdit::OpenWindow);
PerformCreateWindowEx
(
WS_EX_CLIENTEDGE,
NULL,
WS_CHILD | (Visible?WS_VISIBLE:0) | ES_LEFT | (Multiline?(ES_MULTILINE|WS_VSCROLL):0) | ES_AUTOVSCROLL | ES_AUTOHSCROLL | (ReadOnly?ES_READONLY:0),
0, 0,
0, 0,
*OwnerWindow,
(HMENU)ControlId,
hInstance
);
SendMessageX( *this, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(0,0) );
unguard;
}
UBOOL InterceptControlCommand( UINT Message, UINT wParam, LONG lParam )
{
guard(WEdit::InterceptControlCommand);
if( HIWORD(wParam)==EN_CHANGE )
{
ChangeDelegate();
return 1;
}
else return 0;
unguard;
}
// WEdit interface.
UBOOL GetReadOnly()
{
guard(WEdit::GetReadOnly);
check(hWnd);
return (GetWindowLongX( *this, GWL_STYLE )&ES_READONLY)!=0;
unguard;
}
void SetReadOnly( UBOOL ReadOnly )
{
guard(WEdit::SetReadOnly);
check(hWnd);
SendMessageX( *this, EM_SETREADONLY, ReadOnly, 0 );
unguard;
}
INT GetLineCount()
{
guard(WEdit::GetLineCount);
check(hWnd);
return SendMessageX( *this, EM_GETLINECOUNT, 0, 0 );
unguard;
}
INT GetLineIndex( INT Line )
{
guard(WEdit::GetLineIndex);
check(hWnd);
return SendMessageX( *this, EM_LINEINDEX, Line, 0 );
unguard;
}
void GetSelection( INT& Start, INT& End )
{
guard(WEdit::GetSelection);
check(hWnd);
SendMessageX( *this, EM_GETSEL, (WPARAM)&Start, (LPARAM)&End );
unguard;
}
void SetSelection( INT Start, INT End )
{
guard(WEdit::SetSelection);
check(hWnd);
SendMessageX( *this, EM_SETSEL, Start, End );
unguard;
}
void SetSelectedText( const TCHAR* Text )
{
guard(WEdit::SetSelectedText);
check(hWnd);
SendMessageLX( *this, EM_REPLACESEL, 1, Text );
unguard;
}
UBOOL GetModify()
{
guard(WEdit::GetModify);
return SendMessageX( *this, EM_GETMODIFY, 0, 0 )!=0;
unguard;
}
void SetModify( UBOOL Modified )
{
guard(WEdit::SetModify);
SendMessageX( *this, EM_SETMODIFY, Modified, 0 );
unguard;
}
void ScrollCaret()
{
guard(WEdit::ScrollCaret);
SendMessageX( *this, EM_SCROLLCARET, 0, 0 );
unguard;
}
};
/*-----------------------------------------------------------------------------
WTerminal.
-----------------------------------------------------------------------------*/
// Base class of terminal edit windows.
class WINDOW_API WTerminalBase : public WWindow
{
W_DECLARE_ABSTRACT_CLASS(WTerminalBase,WWindow,CLASS_Transient);
DECLARE_WINDOWCLASS(WTerminalBase,WWindow,Window)
// Constructor.
WTerminalBase()
{}
WTerminalBase( FName InPersistentName, WWindow* InOwnerWindow )
: WWindow( InPersistentName, InOwnerWindow )
{}
// WTerminalBase interface.
virtual void TypeChar( TCHAR Ch )=0;
virtual void Paste()=0;
};
// A terminal edit window.
class WINDOW_API WEditTerminal : public WEdit
{
W_DECLARE_ABSTRACT_CLASS(WEditTerminal,WEdit,CLASS_Transient)
DECLARE_WINDOWCLASS(WEditTerminal,WEdit,Window)
// Variables.
WTerminalBase* OwnerTerminal;
// Constructor.
WEditTerminal( WTerminalBase* InOwner=NULL )
: WEdit( InOwner )
, OwnerTerminal( InOwner )
{}
// WWindow interface.
void OnChar( TCHAR Ch )
{
if( Ch!=('C'-'@') )
{
OwnerTerminal->TypeChar( Ch );
throw TEXT("NoRoute");
}
}
void OnRightButtonDown()
{
throw TEXT("NoRoute");
}
void OnPaste()
{
OwnerTerminal->Paste();
throw TEXT("NoRoute");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -