📄 window.h
字号:
}
else if( Message==WM_COMMAND || Message==WM_HSCROLL || Message==WM_VSCROLL )
{
for( INT i=0; i<Controls.Num(); i++ )
if
( (HWND)lParam==((WWindow*)Controls(i))->hWnd
&& ((WWindow*)Controls(i))->InterceptControlCommand(Message,wParam,lParam) )
return 1;
OnCommand( wParam );
}
return CallDefaultProc( Message, wParam, lParam );
}
catch( const TCHAR* )
{
// This exception prevents the message from being routed to the default proc.
return 0;
}
unguard;
}
virtual INT CallDefaultProc( UINT Message, UINT wParam, LONG lParam )
{
if( MdiChild )
return DefMDIChildProcX( hWnd, Message, wParam, lParam );
else
return DefWindowProcX( hWnd, Message, wParam, lParam );
}
virtual UBOOL InterceptControlCommand( UINT Message, UINT wParam, LONG lParam )
{
return 0;
}
virtual FString GetText()
{
guard(WWindow::GetText);
check(hWnd);
INT Length = GetLength();
#if UNICODE
if( GUnicode && !GUnicodeOS )
{
ANSICHAR* ACh = (ANSICHAR*)appAlloca((Length+1)*sizeof(ANSICHAR));
SendMessageA( *this, WM_GETTEXT, Length+1, (LPARAM)ACh );
return appFromAnsi(ACh);
}
else
#endif
{
TCHAR* Text = (TCHAR*)appAlloca((Length+1)*sizeof(TCHAR));
SendMessage( *this, WM_GETTEXT, Length+1, (LPARAM)Text );
return Text;
}
unguard;
}
virtual void SetText( const TCHAR* Text )
{
guard(WWindow::SetText);
check(hWnd);
SendMessageLX( *this, WM_SETTEXT, 0, Text );
unguard;
}
virtual INT GetLength()
{
guard(WWindow::GetLength);
check(hWnd);
return SendMessageX( *this, WM_GETTEXTLENGTH, 0, 0 );
unguard;
}
void SetNotifyHook( FNotifyHook* InNotifyHook )
{
guard(WWindow::SetNotifyHook);
NotifyHook = InNotifyHook;
unguard;
}
// WWindow notifications.
virtual void OnCopyData( HWND hWndSender, COPYDATASTRUCT* CD )
{}
virtual void OnSetFocus( HWND hWndLosingFocus )
{}
virtual void OnKillFocus( HWND hWndGaininFocus )
{}
virtual void OnSize( DWORD Flags, INT NewX, INT NewY )
{}
virtual void OnCommand( INT Command )
{}
virtual void OnActivate( UBOOL Active )
{}
virtual void OnChar( TCHAR Ch )
{}
virtual void OnKeyDown( TCHAR Ch )
{}
virtual void OnCut()
{}
virtual void OnCopy()
{}
virtual void OnPaste()
{}
virtual void OnShowWindow( UBOOL bShow )
{}
virtual void OnUndo()
{}
virtual void OnPaint()
{}
virtual void OnCreate()
{}
virtual void OnDrawItem( DRAWITEMSTRUCT* Info )
{}
virtual void OnMeasureItem( MEASUREITEMSTRUCT* Info )
{}
virtual void OnInitDialog()
{}
virtual void OnMouseEnter()
{}
virtual void OnMouseLeave()
{}
virtual void OnMouseHover()
{}
virtual void OnTimer()
{}
virtual void OnReleaseCapture()
{}
virtual void OnMdiActivate( UBOOL Active )
{}
virtual void OnMouseMove( DWORD Flags, FPoint Location )
{}
virtual void OnLeftButtonDown()
{}
virtual void OnRightButtonDown()
{}
virtual void OnLeftButtonUp()
{}
virtual void OnRightButtonUp()
{}
virtual void OnFinishSplitterDrag( WDragInterceptor* Drag, UBOOL Success )
{}
virtual INT OnSetCursor()
{
return 0;
}
virtual void OnClose()
{
guard(WWindow::OnClose);
DestroyWindow( *this );
unguard;
}
virtual void OnDestroy()
{
guard(WWindow::OnDestroy);
check(hWnd);
if( PersistentName!=NAME_None )
{
FRect R = GetWindowRect();
GConfig->SetString( TEXT("WindowPositions"), *PersistentName, *FString::Printf( TEXT("(X=%i,Y=%i,XL=%i,YL=%i)"), R.Min.X, R.Min.Y, R.Width(), R.Height() ) );
}
_Windows.RemoveItem( this );
hWnd = NULL;
unguard;
}
// WWindow functions.
void MaybeDestroy()
{
guard(WWindow::MaybeDestroy);
if( !Destroyed )
{
Destroyed=1;
DoDestroy();
}
unguard;
}
void _CloseWindow()
{
guard(WWindow::_CloseWindow);
check(hWnd);
DestroyWindow( *this );
unguard;
}
operator HWND() const
{
return hWnd;
}
void SetFont( HFONT hFont )
{
guard(WWindow::SetFont);
SendMessageX( *this, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(0,0) );
unguard;
}
void PerformCreateWindowEx( DWORD dwExStyle, LPCTSTR lpWindowName, DWORD dwStyle, INT x, INT y, INT nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance )
{
guard(PerformCreateWindowEx);
check(hWnd==NULL);
// Retrieve remembered position.
TCHAR Pos[256];
if
( PersistentName!=NAME_None
&& GConfig->GetString( TEXT("WindowPositions"), *PersistentName, Pos, ARRAY_COUNT(Pos) ) )
{
// Get saved position.
Parse( Pos, TEXT("X="), x );
Parse( Pos, TEXT("Y="), y );
if( dwStyle & WS_SIZEBOX )
{
Parse( Pos, TEXT("XL="), nWidth );
Parse( Pos, TEXT("YL="), nHeight );
}
// Count identical windows already opened.
INT Count=0;
for( INT i=0; i<_Windows.Num(); i++ )
{
Count += _Windows(i)->PersistentName==PersistentName;
}
if( Count )
{
// Move away.
x += Count*16;
y += Count*16;
// Clip size to screen.
RECT Desktop;
::GetWindowRect( GetDesktopWindow(), &Desktop );
if( x+nWidth > Desktop.right ) x = Desktop.right - nWidth;
if( y+nHeight > Desktop.bottom ) y = Desktop.bottom - nHeight;
if( x<0 )
{
if( dwStyle & WS_SIZEBOX )
nWidth += x;
x=0;
}
if( y<0 )
{
if( dwStyle & WS_SIZEBOX )
nHeight += y;
y=0;
}
}
}
// Create window.
_Windows.AddItem( this );
TCHAR ClassName[256];
GetWindowClassName( ClassName );
//hinstance must match window class hinstance!!
HWND hWndCreated = TCHAR_CALL_OS(CreateWindowEx(dwExStyle,ClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstanceWindow,this),CreateWindowExA(dwExStyle,TCHAR_TO_ANSI(ClassName),TCHAR_TO_ANSI(lpWindowName),dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstanceWindow,this));
if( !hWndCreated )
appErrorf( TEXT("CreateWindowEx failed: %s"), appGetSystemErrorMessage() );
check(hWndCreated);
check(hWndCreated==hWnd);
unguard;
}
void SetRedraw( UBOOL Redraw )
{
guard(WWindow::SetRedraw);
SendMessageX( *this, WM_SETREDRAW, Redraw, 0 );
unguard;
}
};
/*-----------------------------------------------------------------------------
WControl.
-----------------------------------------------------------------------------*/
// A control which exists inside an owner window.
class WINDOW_API WControl : public WWindow
{
W_DECLARE_ABSTRACT_CLASS(WControl,WWindow,CLASS_Transient);
// Variables.
WNDPROC WindowDefWndProc;
// Structors.
WControl()
{}
WControl( WWindow* InOwnerWindow, INT InId, WNDPROC InSuperProc )
: WWindow( NAME_None, InOwnerWindow )
{
check(OwnerWindow);
WindowDefWndProc = InSuperProc;
ControlId = InId ? InId : InOwnerWindow->TopControlId++;
OwnerWindow->Controls.AddItem( this );
}
#if WIN_OBJ
void Destroy()
{
Super::Destroy();
check(OwnerWindow);
OwnerWindow->Controls.RemoveItem( this );
}
#else
~WControl()
{
check(OwnerWindow);
OwnerWindow->Controls.RemoveItem( this );
}
#endif
// WWindow interface.
virtual INT CallDefaultProc( UINT Message, UINT wParam, LONG lParam )
{
return CallWindowProcX( WindowDefWndProc, hWnd, Message, wParam, lParam );
}
static WNDPROC RegisterWindowClass( const TCHAR* Name, const TCHAR* WinBaseClass )
{
guard(WControl::RegisterWindowClass);
WNDPROC SuperProc=NULL;
#if UNICODE
if( GUnicodeOS )
{
WNDCLASSEXW Cls;
appMemzero( &Cls, sizeof(Cls) );
Cls.cbSize = sizeof(Cls);
verify( GetClassInfoExW( NULL, WinBaseClass, &Cls ) );
SuperProc = Cls.lpfnWndProc;
Cls.lpfnWndProc = WWindow::StaticWndProc;
Cls.lpszClassName = Name;
Cls.hInstance = hInstanceWindow;
check(Cls.lpszMenuName==NULL);
verify(RegisterClassExW( &Cls ));
}
else
#endif
{
WNDCLASSEXA Cls;
appMemzero( &Cls, sizeof(Cls) );
Cls.cbSize = sizeof(Cls);
verify( GetClassInfoExA( NULL, TCHAR_TO_ANSI(WinBaseClass), &Cls ) );
SuperProc = Cls.lpfnWndProc;
Cls.lpfnWndProc = WWindow::StaticWndProc;
Cls.lpszClassName = TCHAR_TO_ANSI(Name);
Cls.hInstance = hInstanceWindow;
check(Cls.lpszMenuName==NULL);
verify(RegisterClassExA( &Cls ));
}
return SuperProc;
unguard;
}
};
/*-----------------------------------------------------------------------------
WLabel.
-----------------------------------------------------------------------------*/
// A non-interactive label control.
class WINDOW_API WLabel : public WControl
{
W_DECLARE_CLASS(WLabel,WControl,CLASS_Transient)
DECLARE_WINDOWSUBCLASS(WLabel,WControl,Window)
// Constructor.
WLabel()
{}
WLabel( WWindow* InOwner, INT InId=0, WNDPROC InSuperProc=NULL )
: WControl( InOwner, InId, InSuperProc?InSuperProc:SuperProc )
{}
// WWindow interface.
void OpenWindow( UBOOL Visible )
{
guard(WLabel::OpenWindow);
PerformCreateWindowEx
(
WS_EX_CLIENTEDGE,
NULL,
WS_CHILD | (Visible?WS_VISIBLE:0),
0, 0,
0, 0,
*OwnerWindow,
(HMENU)ControlId,
hInstance
);
SendMessageX( *this, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(0,0) );
unguard;
}
};
/*-----------------------------------------------------------------------------
WButton.
-----------------------------------------------------------------------------*/
// A button.
class WINDOW_API WButton : public WControl
{
W_DECLARE_CLASS(WButton,WControl,CLASS_Transient);
DECLARE_WINDOWSUBCLASS(WButton,WControl,Window)
// Delegates.
FDelegate ClickDelegate;
FDelegate DoubleClickDelegate;
FDelegate PushDelegate;
FDelegate UnPushDelegate;
FDelegate SetFocusDelegate;
FDelegate KillFocusDelegate;
// Constructor.
WButton()
{}
WButton( WWindow* InOwner, INT InId=0, FDelegate InClicked=FDelegate(), WNDPROC InSuperProc=NULL )
: WControl( InOwner, InId, InSuperProc?InSuperProc:SuperProc )
, ClickDelegate( InClicked )
{}
// 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,
X, Y,
XL, YL,
*OwnerWindow,
(HMENU)ControlId,
hInstance
);
SendMessageX( *this, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(0,0) );
SetText( Text );
if( Visible )
ShowWindow( *this, SW_SHOWNOACTIVATE );
unguard;
}
void SetVisibleText( const TCHAR* Text )
{
guard(WWindow::SetText);
check(hWnd);
if( Text )
SetText( Text );
Show( Text!=NULL );
unguard;
}
// WControl interface.
UBOOL InterceptControlCommand( UINT Message, UINT wParam, LONG lParam )
{
guard(WButton::InterceptControlCommand);
if ( HIWORD(wParam)==BN_CLICKED ) {ClickDelegate(); return 1;}
else if( HIWORD(wParam)==BN_DBLCLK ) {DoubleClickDelegate(); return 1;}
else if( HIWORD(wParam)==BN_PUSHED ) {PushDelegate(); return 1;}
else if( HIWORD(wParam)==BN_UNPUSHED ) {UnPushDelegate(); return 1;}
else if( HIWORD(wParam)==BN_SETFOCUS ) {SetFocusDelegate(); return 1;}
else if( HIWORD(wParam)==BN_KILLFOCUS ) {UnPushDelegate(); return 1;}
else return 0;
unguard;
}
};
/*-----------------------------------------------------------------------------
WCoolButton.
-----------------------------------------------------------------------------*/
// Frame showing styles.
enum EFrameFlags
{
CBFF_ShowOver = 0x01,
CBFF_ShowAway = 0x02,
CBFF_DimAway = 0x04,
CBFF_UrlStyle = 0x08,
CBFF_NoCenter = 0x10
};
// A coolbar-style button.
class WINDOW_API WCoolButton : public WButton
{
W_DECLARE_CLASS(WCoolButton,WButton,CLASS_Transient);
DECLARE_WINDOWSUBCLASS(WCoolButton,WButton,Window)
// Variables.
static WCoolButton* GlobalCoolButton;
HICON hIcon;
DWORD FrameFlags;
// Constructor.
WCoolButton()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -