📄 comdial.c
字号:
BOOL NEAR ScrollTTYVert( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
{
int nScrollAmt ;
PTTYINFO pTTYInfo ;
if (NULL == (pTTYInfo = (PTTYINFO) GetWindowLong( hWnd, GWL_PTTYINFO )))
return ( FALSE ) ;
switch (wScrollCmd)
{
case SB_TOP:
nScrollAmt = -YOFFSET( pTTYInfo ) ;
break ;
case SB_BOTTOM:
nScrollAmt = YSCROLL( pTTYInfo ) - YOFFSET( pTTYInfo ) ;
break ;
case SB_PAGEUP:
nScrollAmt = -YSIZE( pTTYInfo ) ;
break ;
case SB_PAGEDOWN:
nScrollAmt = YSIZE( pTTYInfo ) ;
break ;
case SB_LINEUP:
nScrollAmt = -YCHAR( pTTYInfo ) ;
break ;
case SB_LINEDOWN:
nScrollAmt = YCHAR( pTTYInfo ) ;
break ;
case SB_THUMBPOSITION:
nScrollAmt = wScrollPos - YOFFSET( pTTYInfo ) ;
break ;
default:
return ( FALSE ) ;
}
if ((YOFFSET( pTTYInfo ) + nScrollAmt) > YSCROLL( pTTYInfo ))
nScrollAmt = YSCROLL( pTTYInfo ) - YOFFSET( pTTYInfo ) ;
if ((YOFFSET( pTTYInfo ) + nScrollAmt) < 0)
nScrollAmt = -YOFFSET( pTTYInfo ) ;
ScrollWindow( hWnd, 0, -nScrollAmt, NULL, NULL ) ;
YOFFSET( pTTYInfo ) = YOFFSET( pTTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_VERT, YOFFSET( pTTYInfo ), 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
//
//---------------------------------------------------------------------------
BOOL NEAR ScrollTTYHorz( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
{
int nScrollAmt ;
PTTYINFO pTTYInfo ;
if (NULL == (pTTYInfo = (PTTYINFO) GetWindowLong( hWnd, GWL_PTTYINFO )))
return ( FALSE ) ;
switch (wScrollCmd)
{
case SB_TOP:
nScrollAmt = -XOFFSET( pTTYInfo ) ;
break ;
case SB_BOTTOM:
nScrollAmt = XSCROLL( pTTYInfo ) - XOFFSET( pTTYInfo ) ;
break ;
case SB_PAGEUP:
nScrollAmt = -XSIZE( pTTYInfo ) ;
break ;
case SB_PAGEDOWN:
nScrollAmt = XSIZE( pTTYInfo ) ;
break ;
case SB_LINEUP:
nScrollAmt = -XCHAR( pTTYInfo ) ;
break ;
case SB_LINEDOWN:
nScrollAmt = XCHAR( pTTYInfo ) ;
break ;
case SB_THUMBPOSITION:
nScrollAmt = wScrollPos - XOFFSET( pTTYInfo ) ;
break ;
default:
return ( FALSE ) ;
}
if ((XOFFSET( pTTYInfo ) + nScrollAmt) > XSCROLL( pTTYInfo ))
nScrollAmt = XSCROLL( pTTYInfo ) - XOFFSET( pTTYInfo ) ;
if ((XOFFSET( pTTYInfo ) + nScrollAmt) < 0)
nScrollAmt = -XOFFSET( pTTYInfo ) ;
ScrollWindow( hWnd, -nScrollAmt, 0, NULL, NULL ) ;
XOFFSET( pTTYInfo ) = XOFFSET( pTTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_HORZ, XOFFSET( pTTYInfo ), TRUE ) ;
return ( TRUE ) ;
} // end of ScrollTTYHorz()
//---------------------------------------------------------------------------
// BOOL NEAR SetTTYFocus( HWND hWnd )
//
// Description:
// Sets the focus to the TTY window also creates caret.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
//---------------------------------------------------------------------------
BOOL NEAR SetTTYFocus( HWND hWnd )
{
PTTYINFO pTTYInfo ;
if (NULL == (pTTYInfo = (PTTYINFO) GetWindowLong( hWnd, GWL_PTTYINFO )))
return ( FALSE ) ;
if (CURSORSTATE( pTTYInfo ) != CS_SHOW)
{
CreateCaret( hWnd, NULL, XCHAR( pTTYInfo ), YCHAR( pTTYInfo ) ) ;
ShowCaret( hWnd ) ;
CURSORSTATE( pTTYInfo ) = 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
//
//---------------------------------------------------------------------------
BOOL NEAR KillTTYFocus( HWND hWnd )
{
PTTYINFO pTTYInfo ;
if (NULL == (pTTYInfo = (PTTYINFO) GetWindowLong( hWnd, GWL_PTTYINFO )))
return ( FALSE ) ;
if (CURSORSTATE( pTTYInfo ) != CS_HIDE)
{
HideCaret( hWnd ) ;
DestroyCaret() ;
CURSORSTATE( pTTYInfo ) = CS_HIDE ;
}
return ( TRUE ) ;
} // end of KillTTYFocus()
//---------------------------------------------------------------------------
// BOOL NEAR MoveTTYCursor( HWND hWnd )
//
// Description:
// Moves caret to current position.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
//---------------------------------------------------------------------------
BOOL NEAR MoveTTYCursor( HWND hWnd )
{
PTTYINFO pTTYInfo ;
if (NULL == (pTTYInfo = (PTTYINFO) GetWindowLong( hWnd, GWL_PTTYINFO )))
return ( FALSE ) ;
if (CURSORSTATE( pTTYInfo ) & CS_SHOW)
SetCaretPos( (COLUMN( pTTYInfo ) * XCHAR( pTTYInfo )) -
XOFFSET( pTTYInfo ),
(ROW( pTTYInfo ) * YCHAR( pTTYInfo )) -
YOFFSET( pTTYInfo ) ) ;
return ( TRUE ) ;
} // end of MoveTTYCursor()
//---------------------------------------------------------------------------
// BOOL WriteTTYBlock( HWND hWnd, LPSTR lpBlock, int nLength )
//
// Description:
// Writes block to TTY screen. Nothing fancy - just
// straight TTY.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// LPSTR lpBlock
// far pointer to block of data
//
// int nLength
// length of block
//
//---------------------------------------------------------------------------
BOOL WriteTTYBlock( HWND hWnd, LPSTR lpBlock, int nLength )
{
int i ;
PTTYINFO pTTYInfo ;
RECT rect ;
if (NULL == (pTTYInfo = (PTTYINFO) GetWindowLong( hWnd, GWL_PTTYINFO )))
return ( FALSE ) ;
for (i = 0 ; i < nLength; i++)
{
switch (lpBlock[ i ])
{
case ASCII_BEL:
// Bell
MessageBeep( 0 ) ;
break ;
case ASCII_BS:
// Backspace
if (COLUMN( pTTYInfo ) > 0)
COLUMN( pTTYInfo ) -- ;
MoveTTYCursor( hWnd ) ;
break ;
case ASCII_CR:
// Carriage return
COLUMN( pTTYInfo ) = 0 ;
MoveTTYCursor( hWnd ) ;
if (!NEWLINE( pTTYInfo ))
break;
// fall through
case ASCII_LF:
// Line feed
if (ROW( pTTYInfo )++ == MAXROWS - 1)
{
memmove( (LPSTR) (SCREEN( pTTYInfo )),
(LPSTR) (SCREEN( pTTYInfo ) + MAXCOLS),
(MAXROWS - 1) * MAXCOLS ) ;
memset( (LPSTR) (SCREEN( pTTYInfo ) + (MAXROWS - 1) * MAXCOLS),
' ', MAXCOLS ) ;
InvalidateRect( hWnd, NULL, FALSE ) ;
ROW( pTTYInfo )-- ;
}
MoveTTYCursor( hWnd ) ;
break ;
default:
*(SCREEN( pTTYInfo ) + ROW( pTTYInfo ) * MAXCOLS +
COLUMN( pTTYInfo )) = lpBlock[ i ] ;
rect.left = (COLUMN( pTTYInfo ) * XCHAR( pTTYInfo )) -
XOFFSET( pTTYInfo ) ;
rect.right = rect.left + XCHAR( pTTYInfo ) ;
rect.top = (ROW( pTTYInfo ) * YCHAR( pTTYInfo )) -
YOFFSET( pTTYInfo ) ;
rect.bottom = rect.top + YCHAR( pTTYInfo ) ;
InvalidateRect( hWnd, &rect, FALSE ) ;
// Line wrap
if (COLUMN( pTTYInfo ) < MAXCOLS - 1)
COLUMN( pTTYInfo )++ ;
else if (AUTOWRAP( pTTYInfo ))
WriteTTYBlock( hWnd, "\r\n", 2 ) ;
break;
}
}
return ( TRUE ) ;
} // end of WriteTTYBlock()
//---------------------------------------------------------------------------
// BOOL SelectTTYFont( HWND hDlg )
//
// Description:
// Selects the current font for the TTY screen.
// Uses the Common Dialog ChooseFont() API.
//
// Parameters:
// HWND hDlg
// handle to settings dialog
//
//---------------------------------------------------------------------------
BOOL SelectTTYFont( HWND hDlg )
{
CHOOSEFONT cfTTYFont ;
PTTYINFO pTTYInfo ;
if (NULL == (pTTYInfo = (PTTYINFO) GET_PROP( hDlg, ATOM_TTYINFO )))
return ( FALSE ) ;
cfTTYFont.lStructSize = sizeof( CHOOSEFONT ) ;
cfTTYFont.hwndOwner = hDlg ;
cfTTYFont.hDC = NULL ;
cfTTYFont.rgbColors = FGCOLOR( pTTYInfo ) ;
cfTTYFont.lpLogFont = &LFTTYFONT( pTTYInfo ) ;
cfTTYFont.Flags = CF_SCREENFONTS | CF_FIXEDPITCHONLY |
CF_EFFECTS | CF_INITTOLOGFONTSTRUCT ;
cfTTYFont.lCustData = 0 ;
cfTTYFont.lpfnHook = NULL ;
cfTTYFont.lpTemplateName = NULL ;
cfTTYFont.hInstance = GETHINST( hDlg ) ;
if (ChooseFont( &cfTTYFont ))
{
FGCOLOR( pTTYInfo ) = cfTTYFont.rgbColors ;
ResetTTYScreen( GetParent( hDlg ), pTTYInfo ) ;
}
return ( TRUE ) ;
} // end of SelectTTYFont()
DWORD ReadThread (LPDWORD lpdwParam1)
{
BYTE inbuff[100];
DWORD nBytesRead;
COMMTIMEOUTS to;
LONG lrc;
/* The next two lines check to make sure that interval
timeouts are supported by the port */
if (!(mytapi.pCommprop->dwProvCapabilities & PCF_INTTIMEOUTS)) {
return 1L; /* error; can抰 set interval timeouts */
}
// get the modem handle for the call
lrc = mylineGetCallID ();
if (lrc) {
MessageBox (NULL,
"Error getting modem handle for data transfer", "", MB_OK);
return 1L;
}
/* the next three lines tell the read function to return
immediately even when there are no bytes waiting in the
port抯 receive queue */
memset (&to, 0, sizeof(to));
to.ReadIntervalTimeout = MAXDWORD;
SetCommTimeouts (mytapi.hComm, &to);
/* this loop polls the port reading bytes until the control
variable bReading is set to FALSE
by the controlling process */
while (mytapi.bReading) {
/* poll the port and read bytes if available */
if (!ReadFile(mytapi.hComm, inbuff, 100, &nBytesRead, NULL)) {
/* handle error */
locProcessCommError(GetLastError ());
} /* end if (error reading bytes) */
else {
/* if there were bytes waiting, display them in TTY
window */
if (nBytesRead)
locProcessBytes(inbuff, nBytesRead);
}
} /* end while (thread active) */
/* clean out any pending bytes in the receive buffer */
PurgeComm(mytapi.hComm, PURGE_RXCLEAR);
// close the use of the modem for data transfer
CloseHandle (mytapi.hComm);
mytapi.bGotcommhandle = FALSE;
return 0L;
} /* end function (ReadThread) */
// local function to process COM errors - fill in your own error
// handler
void locProcessCommError (DWORD dwError)
{
DWORD lrc;
COMSTAT cs;
/* clear error */
ClearCommError (mytapi.hComm, &lrc, &cs);
} /* end function (locProcessCommError) */
// local function to process bytes read from the COM port - just
// displays them in the terminal window;
// put your own handler code here
void locProcessBytes (LPBYTE buf, DWORD dwBytes)
{
WriteTTYBlock(hTTYWnd, buf, dwBytes);
} /* end function (locProcessBytes) */
//---------------------------------------------------------------------------
// End of File: comdial.c
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -