📄 mttty.c
字号:
}
return;
}
/*-----------------------------------------------------------------------------
FUNCTION: OpenTTYChildWindow(HWND)
PURPOSE: Creates the TTY Child Window
PARAMETERS:
hWnd - parent window handle of TTY child window
COMMENTS: This window is actually the TTY Screen
HISTORY: Date: Author: Comment:
10/27/95 AllenD Wrote it
/*-----------------------------------------------------------------------------*/
void OpenTTYChildWindow(HWND hWnd)
{
ghWndTTY = CreateWindow( "MTTTYChildClass", "TTY Window",
WS_CHILD | WS_VISIBLE | WS_VSCROLL,
0,0,
0,0,
hWnd, (HMENU)ID_TTYWINDOW, ghInst, NULL);
if (ghWndTTY == NULL)
ErrorReporter("Can't Create TTY Child Window");
return;
}
//---------------------------------------------------------------------------
// BOOL NEAR ScrollTTYVert( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
//
// Description:
// Scrolls TTY window vertically.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// WORD wScrollCmd
// type of scrolling we're doing
//
// WORD wScrollPos
// scroll position
//
// History: Date Author Comment
// 5/ 8/91 BryanW Wrote it.
// 10/27/95 AllenD Included it for MTTTY Sample.
//
//---------------------------------------------------------------------------
BOOL NEAR ScrollTTYVert( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
{
int nScrollAmt ;
switch (wScrollCmd)
{
case SB_TOP:
nScrollAmt = -YOFFSET( TTYInfo ) ;
break ;
case SB_BOTTOM:
nScrollAmt = YSCROLL( TTYInfo ) - YOFFSET( TTYInfo ) ;
break ;
case SB_PAGEUP:
nScrollAmt = -YSIZE( TTYInfo ) ;
break ;
case SB_PAGEDOWN:
nScrollAmt = YSIZE( TTYInfo ) ;
break ;
case SB_LINEUP:
nScrollAmt = -YCHAR( TTYInfo ) ;
break ;
case SB_LINEDOWN:
nScrollAmt = YCHAR( TTYInfo ) ;
break ;
case SB_THUMBPOSITION:
nScrollAmt = wScrollPos - YOFFSET( TTYInfo ) ;
break ;
default:
return ( FALSE ) ;
}
if ((YOFFSET( TTYInfo ) + nScrollAmt) > YSCROLL( TTYInfo ))
nScrollAmt = YSCROLL( TTYInfo ) - YOFFSET( TTYInfo ) ;
if ((YOFFSET( TTYInfo ) + nScrollAmt) < 0)
nScrollAmt = -YOFFSET( TTYInfo ) ;
ScrollWindowEx( hWnd, 0, -nScrollAmt, NULL, NULL, NULL, NULL, SW_INVALIDATE | SW_ERASE) ;
YOFFSET( TTYInfo ) = YOFFSET( TTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_VERT, YOFFSET( TTYInfo ), TRUE ) ;
return ( TRUE ) ;
} // end of ScrollTTYVert()
//---------------------------------------------------------------------------
// BOOL NEAR ScrollTTYHorz( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
//
// Description:
// Scrolls TTY window horizontally.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// WORD wScrollCmd
// type of scrolling we're doing
//
// WORD wScrollPos
// scroll position
//
// History: Date Author Comment
// 5/ 8/91 BryanW Wrote it.
// 10/27/95 AllenD Included it for MTTTY Sample.
//
//---------------------------------------------------------------------------
BOOL NEAR ScrollTTYHorz( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
{
int nScrollAmt ;
switch (wScrollCmd)
{
case SB_TOP:
nScrollAmt = -XOFFSET( TTYInfo ) ;
break ;
case SB_BOTTOM:
nScrollAmt = XSCROLL( TTYInfo ) - XOFFSET( TTYInfo ) ;
break ;
case SB_PAGEUP:
nScrollAmt = -XSIZE( TTYInfo ) ;
break ;
case SB_PAGEDOWN:
nScrollAmt = XSIZE( TTYInfo ) ;
break ;
case SB_LINEUP:
nScrollAmt = -XCHAR( TTYInfo ) ;
break ;
case SB_LINEDOWN:
nScrollAmt = XCHAR( TTYInfo ) ;
break ;
case SB_THUMBPOSITION:
nScrollAmt = wScrollPos - XOFFSET( TTYInfo ) ;
break ;
default:
return ( FALSE ) ;
}
if ((XOFFSET( TTYInfo ) + nScrollAmt) > XSCROLL( TTYInfo ))
nScrollAmt = XSCROLL( TTYInfo ) - XOFFSET( TTYInfo ) ;
if ((XOFFSET( TTYInfo ) + nScrollAmt) < 0)
nScrollAmt = -XOFFSET( TTYInfo ) ;
ScrollWindowEx( hWnd, -nScrollAmt, 0, NULL, NULL, NULL, NULL, SW_INVALIDATE | SW_ERASE) ;
XOFFSET( TTYInfo ) = XOFFSET( TTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_HORZ, XOFFSET( TTYInfo ), TRUE ) ;
return ( TRUE ) ;
} // end of ScrollTTYHorz()
//---------------------------------------------------------------------------
// BOOL NEAR PaintTTY( HWND hWnd )
//
// Description:
// Paints the rectangle determined by the paint struct of
// the DC.
//
// Parameters:
// HWND hWnd
// handle to TTY window (as always)
//
// History: Date Author Comment
// 5/ 9/91 BryanW Wrote it.
// 10/22/91 BryanW Problem with background color
// and "off by one" fixed.
//
// 2/25/92 BryanW Off-by-one not quite fixed...
// also resolved min/max problem
// for windows extended beyond
// the "TTY display".
//
// 10/27/95 AllenD Included it for MTTTY Sample.
//
//---------------------------------------------------------------------------
BOOL NEAR PaintTTY( HWND hWnd )
{
PAINTSTRUCT ps ;
HFONT hOldFont ;
RECT rect ;
HDC hDC ;
int nRow, nCol, nEndRow, nEndCol;
int nCount, nHorzPos, nVertPos ;
hDC = BeginPaint( hWnd, &ps ) ;
hOldFont = SelectObject( hDC, HTTYFONT( TTYInfo ) ) ;
SetTextColor( hDC, FGCOLOR( TTYInfo ) ) ;
SetBkColor( hDC, GetSysColor( COLOR_WINDOW ) ) ;
rect = ps.rcPaint ;
nRow =
min( MAXROWS - 1,
max( 0, (rect.top + YOFFSET( TTYInfo )) / YCHAR( TTYInfo ) ) ) ;
nEndRow =
min( MAXROWS - 1,
((rect.bottom + YOFFSET( TTYInfo ) - 1) / YCHAR( TTYInfo ) ) ) ;
nCol =
min( MAXCOLS - 1,
max( 0, (rect.left + XOFFSET( TTYInfo )) / XCHAR( TTYInfo ) ) ) ;
nEndCol =
min( MAXCOLS - 1,
((rect.right + XOFFSET( TTYInfo ) - 1) / XCHAR( TTYInfo ) ) ) ;
nCount = nEndCol - nCol + 1 ;
for (; nRow <= nEndRow; nRow++)
{
nVertPos = (nRow * YCHAR( TTYInfo )) - YOFFSET( TTYInfo ) ;
nHorzPos = (nCol * XCHAR( TTYInfo )) - XOFFSET( TTYInfo ) ;
rect.top = nVertPos ;
rect.bottom = nVertPos + YCHAR( TTYInfo ) ;
rect.left = nHorzPos ;
rect.right = nHorzPos + XCHAR( TTYInfo ) * nCount ;
SetBkMode( hDC, OPAQUE ) ;
ExtTextOut( hDC, nHorzPos, nVertPos, ETO_OPAQUE | ETO_CLIPPED, &rect,
(LPSTR)( SCREEN( TTYInfo ) + nRow * MAXCOLS + nCol ),
nCount, NULL ) ;
}
SelectObject( hDC, hOldFont ) ;
EndPaint( hWnd, &ps ) ;
MoveTTYCursor( hWnd ) ;
return ( TRUE ) ;
} // end of PaintTTY()
//---------------------------------------------------------------------------
// BOOL NEAR MoveTTYCursor( HWND hWnd )
//
// Description:
// Moves caret to current position.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// History: Date Author Comment
// 5/ 9/91 BryanW Wrote it.
// 10/27/95 AllenD Included it for MTTTY Sample.
//
//---------------------------------------------------------------------------
BOOL NEAR MoveTTYCursor( HWND hWnd )
{
if (CONNECTED( TTYInfo ) && (CURSORSTATE( TTYInfo ) & CS_SHOW))
SetCaretPos( (COLUMN( TTYInfo ) * XCHAR( TTYInfo )) -
XOFFSET( TTYInfo ),
(ROW( TTYInfo ) * YCHAR( TTYInfo )) -
YOFFSET( TTYInfo ) ) ;
return ( TRUE ) ;
} // end of MoveTTYCursor()
//---------------------------------------------------------------------------
// BOOL NEAR SetTTYFocus( HWND hWnd )
//
// Description:
// Sets the focus to the TTY window also creates caret.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// History: Date Author Comment
// 5/ 9/91 BryanW Wrote it.
// 10/27/95 AllenD Included it for MTTTY Sample.
//
//---------------------------------------------------------------------------
BOOL NEAR SetTTYFocus( HWND hWnd )
{
if (CONNECTED(TTYInfo) && (CURSORSTATE( TTYInfo ) != CS_SHOW) )
{
CreateCaret( hWnd, NULL, XCHAR( TTYInfo ), YCHAR( TTYInfo ) ) ;
ShowCaret( hWnd ) ;
CURSORSTATE( TTYInfo ) = CS_SHOW ;
}
MoveTTYCursor( hWnd ) ;
return ( TRUE ) ;
} // end of SetTTYFocus()
//---------------------------------------------------------------------------
// BOOL NEAR KillTTYFocus( HWND hWnd )
//
// Description:
// Kills TTY focus and destroys the caret.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// History: Date Author Comment
// 5/ 9/91 BryanW Wrote it.
// 10/27/95 AllenD Included it for MTTTY Sample.
//
//---------------------------------------------------------------------------
BOOL NEAR KillTTYFocus( HWND hWnd )
{
if (CURSORSTATE( TTYInfo ) != CS_HIDE)
{
HideCaret( hWnd ) ;
DestroyCaret() ;
CURSORSTATE( TTYInfo ) = CS_HIDE ;
}
return ( TRUE ) ;
} // end of KillTTYFocus()
//---------------------------------------------------------------------------
// BOOL NEAR SizeTTY( HWND hWnd, WORD wVertSize, WORD wHorzSize )
//
// Description:
// Sizes TTY and sets up scrolling regions.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// WORD wVertSize
// new vertical size
//
// WORD wHorzSize
// new horizontal size
//
// History: Date Author Comment
// 5/ 8/ 91 BryanW Wrote it
// 10/27/95 AllenD Included it for MTTTY Sample.
//
//---------------------------------------------------------------------------
BOOL NEAR SizeTTY( HWND hWnd, WORD wWidth, WORD wHeight )
{
int nScrollAmt ;
//
// adjust vert settings
//
YSIZE( TTYInfo ) = (int) wHeight ;
YSCROLL( TTYInfo ) = max( 0, (MAXROWS * YCHAR( TTYInfo )) -
YSIZE( TTYInfo ) ) ;
nScrollAmt = min( YSCROLL( TTYInfo ), YOFFSET( TTYInfo ) ) -
YOFFSET( TTYInfo ) ;
ScrollWindow( hWnd, 0, -nScrollAmt, NULL, NULL ) ;
YOFFSET( TTYInfo ) = YOFFSET( TTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_VERT, YOFFSET( TTYInfo ), FALSE ) ;
SetScrollRange( hWnd, SB_VERT, 0, YSCROLL( TTYInfo ), TRUE ) ;
//
// adjust horz settings
//
XSIZE( TTYInfo ) = (int) wHeight ;
XSCROLL( TTYInfo ) = max( 0, (MAXCOLS * XCHAR( TTYInfo )) -
XSIZE( TTYInfo ) ) ;
nScrollAmt = min( XSCROLL( TTYInfo ), XOFFSET( TTYInfo )) -
XOFFSET( TTYInfo ) ;
ScrollWindow( hWnd, nScrollAmt, 0, NULL, NULL );
XOFFSET( TTYInfo ) = XOFFSET( TTYInfo ) + nScrollAmt ;
SetScrollRange( hWnd, SB_HORZ, 0, XSCROLL( TTYInfo ), FALSE ) ;
SetScrollPos( hWnd, SB_HORZ, XOFFSET( TTYInfo ), TRUE ) ;
InvalidateRect( hWnd, NULL, FALSE ) ; // redraw entire window
return ( TRUE ) ;
} // end of SizeTTY()
/*-----------------------------------------------------------------------------
FUNCTION: TTYChildProc(HWND, UINT, WPARAM, LPARAM)
PURPOSE: Window Procedure to process message for the TTY Child Window
PARAMETERS:
hwnd - window handle
message - window message
wParam - window message parameter (depends on message)
lParam - window message parameter (depends on message)
HISTORY: Date: Author: Comment:
10/27/95 AllenD Wrote it
-----------------------------------------------------------------------------*/
int WINAPI TTYChildProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
switch(uMessage)
{
case WM_VSCROLL:
ScrollTTYVert( hWnd, LOWORD( wParam ), HIWORD( wParam ) ) ;
break ;
case WM_HSCROLL:
ScrollTTYHorz( hWnd, LOWORD( wParam ), HIWORD( wParam ) ) ;
break ;
case WM_SIZE:
SizeTTY(hWnd, LOWORD(lParam), HIWORD(lParam));
break;
case WM_PAINT:
PaintTTY(hWnd);
break;
case WM_CHAR:
{
//
// keyboard activity in TTY Window
//
if (CONNECTED(TTYInfo)) {
if (!WriterAddNewNode(WRITE_CHAR, 0, (char) wParam, NULL, NULL, NULL))
return FALSE;
if (LOCALECHO(TTYInfo))
OutputABufferToWindow(ghWndTTY, (CHAR *) &wParam, 1);
}
}
break;
case WM_SETFOCUS:
SetTTYFocus( ghWndTTY ) ;
break ;
case WM_KILLFOCUS:
KillTTYFocus( ghWndTTY ) ;
break ;
case WM_MOUSEACTIVATE:
/*
If mouse is clicked in me (the tty child window)
then I need to get the focus.
*/
SetFocus(hWnd);
return MA_ACTIVATE;
break;
default:
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
return 0L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -