⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ansiwinterm.h

📁 DOS下采用中断接收数据的串口通讯的例子,很难找到的好东西!
💻 H
字号:
//
//  AnsiWinTerm.h
//
//  Source code from:
//
//  Serial Communications: A C++ Developer's Guide, 2nd Edition
//  by Mark Nelson, M&T Books, 1999
//
//  Please see the book for information on usage.
//
// This file contains the declarations for class AnsiWinTerm, 
// the glue class that holds together all the pieces needed to 
// create a Win32 terminal emulator. This class is used in the 
// example program for Chapter 13.
//

#ifndef _ANSI_WIN_TERM_DOT_H
#define _ANSI_WIN_TERM_DOT_H

#include "AnsiTerm.h"
#include "Win32Port.h"
#include "Win32Term.h"

//
// To use notification with class Win32Port, you need to
// create a derived class that overrides all of the notification
// functions that you plan on using. This class, MyWin32Port,
// does just that, overriding the RxNotify() function so that
// we can be notified every time new data comes in.
//
// The notification function is simple as can be, it just 
// sends a proprietary message to the window that was specified
// in the constructor. It's then up to that window to decide 
// what to do.
//
// This is a stripped down port class, it uses a fixed baud
// rate, only allowing you to specify the actual port to be
// opened. The steps that would be needed to beef up the class
// to production quality should be pretty straightforward.
//
// Fortunately, if you need to modify the baud rate or any
// other parameters you can do so immediately after opening
// the port.
//
const int WM_SERIAL_RX_NOTIFY              = WM_USER + 0x1000;

class MyWin32Port : public Win32Port  
{
public:
    MyWin32Port( const string &name, HWND notify_window ) 
        : Win32Port( name, 19200, 'N', 8, 1 ),
          m_hNotifyWindow( notify_window )
    {}
    virtual ~MyWin32Port(){} 
protected :
    void RxNotify( int byte_count )
    {
        ::PostMessage( m_hNotifyWindow, WM_SERIAL_RX_NOTIFY, byte_count, 0 );
    }
    const HWND m_hNotifyWindow;
};

//
// Class AnsiWinTerm is the only class in the entire book
// that uses multiple inheritance. This class inherits all
// the attributes of Win32Term, which is capable of 
// keeping a console-style text window up on the screen. 
// To work with the Emulator classes, it also has to support
// the abstract interface defined for BaseWindow, so it 
// derives itself from that as well. It then has to implement
// the eight pure virtual functions defined for class
// BaseWindow. Fortunately, all of those functions turn out
// to be trivially simple.
//
class AnsiWinTerm : public Win32Term, public BaseWindow
{
public:
	//
	// The parameters we need to construct the window are
	// actually only used by the base class. We pass all the
	// arguments up to the Win32Term constructor without
	// any changes. All we do with our data is to make sure
	// the two members are set to null pointers, so we don't
	// inadvertently treat them as if they were instantiated.
	//
    AnsiWinTerm( HWND hParent,
                 const char *window_name,
                 int rows, 
                 int cols ) : Win32Term( hParent, window_name, rows, cols )
    {
        m_pPort = 0;
        m_pTerminal = 0;
    }
	//
	// Upon destruction we need to be sure that we
	// destroy our two member objects.
	//
    virtual ~AnsiWinTerm()
    {
        if ( m_pTerminal )
            delete m_pTerminal;
        if ( m_pPort )
            delete m_pPort;
    }
    
public:
    bool OpenPort( const string &name );
    void ClosePort();
	//
	// The eight pure virtual functions from 
	// class BaseWindow. Each of them is implemented
	// as a simple inline function.
	//
    virtual BaseWindow &operator<<( char c )
    {
        Output( c );
        return *this;
    }
    virtual BaseWindow &operator<<( char *pStr )
    {
        Output( pStr );
        return *this;
    }
    virtual void Clear( void )
    {
        Win32Term::Clear();
    }
    virtual void Goto( void )
    {
        ::SetFocus( m_hWnd );
    }
	virtual void AnsiWinTerm::SetAttribute( int att )
	{
		attribute = (DisplayAttribute) att;
		SetForegroundColor( ForegroundPalette[ att & 0xf ] );
		SetBackgroundColor( BackgroundPalette[ (att >> 4) & 0x7 ] );
	}
    virtual int SetPosition( int row, int col )
    {
        return Win32Term::SetCursorPosition( row, col );
    }
    virtual void GetPosition( int &row, int &col )
    {
        Win32Term::GetCursorPosition( row, col );
    }
    virtual void GetDimensions( int &width, int &height )
    {
        width = m_ScreenText[ 0 ].size();
        height = m_ScreenText.size();
    }
    static const COLORREF ForegroundPalette[ 16 ];
    static const COLORREF BackgroundPalette[ 8 ];

protected :
    //
	// This is the dispatcher for all window messages
	// that are sent to the terminal emulator window.
	// We intercept the RX notification messages and
	// any keystroke messages, but pass everything else
	// up to the base class for handling.
	//
	virtual LRESULT Dispatch( HWND hwnd, 
                              UINT uMsg, 
                              WPARAM wParam, 
                              LPARAM lParam ); 
protected :
	//
	// The two data member used here, an RS232 port and
	// a terminal emulator. Add in the window that this
	// class implements and you have all the components 
	// needed for a terminal emulation program.
	//
    MyWin32Port *   m_pPort;                
    AnsiTerminal *  m_pTerminal;
};

#endif //#ifndef _ANSI_WIN_TERM_DOT_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -