如何做一个象VC++6.0中OutPut一样的能够每次可以反映程序运行情况的编辑框,又象AUTO CAD界面中最下方的对话框一样,用户的每一次操作在编辑框中都有记录,而且都能显示出来。谢谢!

解决方案 »

  1.   

    可能楼主误会了吧!个人感觉SoLike(是我) 的信誉还是不错的!!
      

  2.   

    言归正传,楼主是值如何做那种编辑框,还是如何再编辑框上show信息!还是两者兼???
      

  3.   

    头文件
    #if !defined(AFX_DATINPUT_H__FDA7D7A5_1BE7_4DE6_8E2A_64DF0AD889C1__INCLUDED_)
    #define AFX_DATINPUT_H__FDA7D7A5_1BE7_4DE6_8E2A_64DF0AD889C1__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // DATInput.h : header file
    //
    #define MAX_STRINGS 100/////////////////////////////////////////////////////////////////////////////
    // DATInput viewclass DATInput : public CEditView
    {
    protected:
    DATInput();           // protected constructor used by dynamic creation
    DECLARE_DYNCREATE(DATInput)// Attributes
    public:// Operations
    protected:
    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(DATInput)
    public:
    virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
    //}}AFX_VIRTUAL// Implementation
    protected:
    virtual ~DATInput();
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endif // Generated message map functions
    protected:
        int n_CharWidth; // 字符宽
        int n_CharHeight; // 字符高
        int n_LineHeight; // 行间距
        int n_TextStar; // 开始位置
        int n_TextPos; // 字符位置
    int n_Number; // 总行数
    int n_LineWidth; // 总行宽
    UCHAR n_InputMode; //输入文本模式1命令2坐标
        POINT n_TextPoint; // 文本位置
        CPoint n_CursorPos; // 光标位置
        CString n_StarText; // 前缀文本
        CString n_InputText;        // 输入文本
        CString n_OutputText[MAX_STRINGS]; // 输出文本
    CRect n_Screen;
    SCROLLINFO n_Vert,n_Horz; //滑块信息
        CPoint n_ScrollSize; // 滑块比例
    bool n_Message;//消息
    ULONG n_OldCommand;//当前命令
    bool n_Cursor;//光标状态
    bool n_EnterFlag; void F_Draw();
    void F_SetScroll();
    void F_GetLineWidth(CString Text); 
    void F_GetStarLine();
    void F_SetCursor(bool Mode); 
    void F_SetMessage(bool View,UCHAR Look,UCHAR Data,USHORT Command);
    void F_SendMessage();
    void F_DrawText(CDC* pDC);
    void F_PointChangeText(CPoint Point);
    void F_MoveTextPoint(UCHAR Key);//键盘移动文本点
    void F_TextChangeCaret();
    void F_DeleteText(UCHAR Key);
    void F_SetMassageText(bool Mode);//设置消息文本
    void F_SendFocus();//取消焦点 
    bool F_SetKyeCommandText();//设置键盘命令文本
    bool F_GetKyeInputText();//处理键盘输入文本
    void F_AddLine();//增加行数 
    //{{AFX_MSG(DATInput)
    afx_msg void OnPaint();
    afx_msg void OnSetFocus(CWnd* pOldWnd);
    afx_msg void OnKillFocus(CWnd* pNewWnd);
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnSysChar (UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnSysKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnSysKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_DATINPUT_H__FDA7D7A5_1BE7_4DE6_8E2A_64DF0AD889C1__INCLUDED_)
      

  4.   

    执行文件
    // DATInput.cpp : implementation file
    //#include "stdafx.h"
    #include "catv.h"
    #include "CATVDAT.h"
    #include "MainFrm.h"
    #include "DATInput.h"
    #include "TabMap.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    extern CATVDATE DATA;//公共数据
    // DATInput
    IMPLEMENT_DYNCREATE(DATInput, CEditView)
    DATInput::DATInput()
    {
        n_CharWidth=10;n_CharHeight=0; // 字符高
    n_CursorPos.x=n_CursorPos.y=0; // 光标位置
        n_TextPos=n_LineWidth=0; //字符位置
    n_TextPoint.x=n_TextPoint.y=0;
    n_TextStar=5; //开始位置
    n_Vert.fMask=n_Horz.fMask=SIF_ALL;//滑块信息
    n_ScrollSize.x=n_ScrollSize.y=0;
    n_Vert.nMin=n_Horz.nMin=0;
    n_Number=1;n_StarText=_T("命令:");
    n_OutputText[0]=n_InputText=_T("");
    n_Message=n_Cursor=n_EnterFlag=false;
    n_InputMode=0;n_OldCommand=0;
    }
    DATInput::~DATInput()
    {
    }
    BEGIN_MESSAGE_MAP(DATInput, CEditView)
    //{{AFX_MSG_MAP(DATInput)
    ON_WM_PAINT()
    ON_WM_SETFOCUS()
    ON_WM_KILLFOCUS()
    ON_WM_SETCURSOR()
    ON_WM_VSCROLL()
    ON_WM_HSCROLL()
    ON_WM_LBUTTONDOWN()
    ON_WM_KEYDOWN()
        ON_WM_KEYUP ()
    ON_WM_CHAR()
        ON_WM_SYSCHAR ()
        ON_WM_SYSKEYDOWN ()
        ON_WM_SYSKEYUP ()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // DATInput drawing/////////////////////////////////////////////////////////////////////////////
    // DATInput diagnostics
    #ifdef _DEBUG
    void DATInput::AssertValid() const
    {
    CEditView::AssertValid();
    }
    void DATInput::Dump(CDumpContext& dc) const
    {
    CEditView::Dump(dc);
    }
    #endif //_DEBUG
    /////////////////////////////////////////////////////////////////////////////
    // DATInput message handlers
    BOOL DATInput::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
    {
    dwStyle |=WS_HSCROLL|WS_VSCROLL;
    return CWnd::Create(lpszClassName,lpszWindowName,dwStyle,rect,pParentWnd, nID, pContext);
    }
    ///////////////////////////////滑块
    //设置滑块
    void DATInput::F_SetScroll()
    {float dx,dy,sx,sy;
    GetClientRect(&n_Screen);
    dx=(float)(n_LineWidth*n_CharWidth)+(float)n_TextStar;//文本宽
    dy=(float)(n_Number*n_LineHeight);//文本高
    n_Horz.nMax=n_Screen.right;n_Vert.nMax=n_Screen.bottom;
    if (dx){sx=(float)n_Screen.right/dx;if (sx>1.0f)sx=1.0f;}
    else sx=1.0f;
    if (dy){sy=(float)n_Screen.bottom/dy;if (sy>1.0f)sy=1.0f;}
    else sy=1.0f;
    n_Horz.nPage=(int)((float)n_Horz.nMax*sx);
    n_Vert.nPage=(int)((float)n_Vert.nMax*sy);

    dx=(dx-(float)n_Screen.right)/(float)n_CharWidth;
    dy=(dy-(float)n_Screen.bottom)/(float)n_LineHeight;
    n_ScrollSize.x=(int)((float)(n_Horz.nMax-n_Horz.nPage)/dx);
    n_ScrollSize.y=(int)((float)(n_Vert.nMax-n_Vert.nPage)/dy);
    n_Horz.nPos=(int)((float)n_TextPoint.x*n_ScrollSize.x);
    n_Vert.nPos=(int)((float)n_TextPoint.y*n_ScrollSize.y); SetScrollInfo(SB_VERT,&n_Vert,true);
    SetScrollInfo(SB_HORZ,&n_Horz,true);
    }
    //水平滑块处理
    void DATInput::OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
    {int dx=n_TextPoint.x;
    if (nSBCode==SB_LINEUP)//顶部箭头
    {if (n_ScrollSize.x>0 && n_TextPoint.x)
    {n_TextPoint.x--;n_Horz.nPos-=n_ScrollSize.x;}}
    else if (nSBCode==SB_LINEDOWN)//底部箭头
    {if ((int)n_Horz.nPos<(int)(n_Horz.nMax-n_Horz.nPage))
    {n_TextPoint.x++;n_Horz.nPos+=n_ScrollSize.x;}}
    else if (nSBCode==SB_PAGEUP)//顶部条体
    {if (n_ScrollSize.x>0 && n_TextPoint.x>5)
    {n_TextPoint.x-=6;n_Horz.nPos-=(6*n_ScrollSize.x);}
    else if (n_ScrollSize.x>0 && n_TextPoint.x)
    {n_TextPoint.x=0;n_Horz.nPos=0;}}
    else if (nSBCode==SB_PAGEDOWN)//底部条体
    {if (n_ScrollSize.x>0 && n_TextPoint.x<n_LineWidth-6)
    {n_TextPoint.x+=6;n_Horz.nPos+=6*n_ScrollSize.x;}
    else if (n_ScrollSize.x>0 && 
    (int)n_Horz.nPos<(int)(n_Horz.nMax-n_Horz.nPage))//
    {n_TextPoint.x=n_LineWidth-1;
    n_Horz.nPos=n_Horz.nMax-n_Horz.nPage;}}
    else if (nSBCode==SB_THUMBTRACK)//滑块拖动
    {n_Horz.nPos=nPos;
    n_TextPoint.x=(int)((float)nPos/(float)n_ScrollSize.x);}
    SetScrollInfo(SB_HORZ,&n_Horz,true);
    if (dx!=n_TextPoint.x)F_Draw();//光标点
    }
      

  5.   

    //垂直滑块处理
    void DATInput::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar *pScrollBar) 
    {int dy=n_TextPoint.y;
    if (nSBCode==SB_LINEUP)//顶部箭头
    {if (n_ScrollSize.y>0 && n_TextPoint.y)
    {n_TextPoint.y--;n_Vert.nPos-=n_ScrollSize.y;}}
    else if (nSBCode==SB_LINEDOWN)//底部箭头
    {if ((int)n_Vert.nPos<(int)(n_Vert.nMax-n_Vert.nPage))
    {n_TextPoint.y++;n_Vert.nPos+=n_ScrollSize.y;}}
    else if (nSBCode==SB_PAGEUP)//顶部条体
    {if (n_ScrollSize.y>0 && n_TextPoint.y>5)
    {n_TextPoint.y-=6;n_Vert.nPos-=(6*n_ScrollSize.y);}
    else if (n_ScrollSize.y>0 && n_TextPoint.y)
    {n_TextPoint.y=0;n_Vert.nPos=0;}}
    else if (nSBCode==SB_PAGEDOWN)//底部条体
    {if (n_ScrollSize.y>0 && n_TextPoint.y<n_Number-6)
    {n_TextPoint.y+=6;n_Vert.nPos+=6*n_ScrollSize.y;}
    else if (n_ScrollSize.y>0 && 
    (int)n_Vert.nPos<(int)(n_Vert.nMax-n_Vert.nPage))
    {n_TextPoint.y=n_Number-1;
    n_Vert.nPos=n_Horz.nMax-n_Horz.nPage;}}
    else if (nSBCode==SB_THUMBTRACK)//滑块拖动
    {n_Vert.nPos=nPos;
    n_TextPoint.y=(int)((float)nPos/(float)n_ScrollSize.y);}
    SetScrollInfo(SB_VERT,&n_Vert,true);
    if (dy!=n_TextPoint.y)F_Draw();//光标点
    }
    //取得新的行宽
    void DATInput::F_GetLineWidth(CString Text) 
    {
    CClientDC dc(this);
    CPoint Size=dc.GetTextExtent(Text);
    int W=(int)((float)Size.x/(float)n_CharWidth)+1;
    if (W>n_LineWidth)n_LineWidth=W;
    }
    //取得新的起始行
    void DATInput::F_GetStarLine() 
    {int L,dl;
    L=(int)((float)n_Screen.bottom/(float)n_LineHeight);
    dl=L-(n_Number-n_TextPoint.y);
    if (dl>0)
    {n_TextPoint.y-=dl;
    if (n_TextPoint.y<0)n_TextPoint.y=0;}
    }
    //取得焦点
    void DATInput::OnSetFocus(CWnd* pOldWnd) 
    {
        CreateSolidCaret(max(2,::GetSystemMetrics(SM_CXBORDER)),16);
    SetCaretPos(n_CursorPos);
    if (n_Screen.PtInRect(n_CursorPos))F_SetCursor(true);
    }
    //失去焦点
    void DATInput::OnKillFocus(CWnd* pNewWnd) 
    {
    n_CursorPos=GetCaretPos();
        F_SetCursor(false);::DestroyCaret();
    }
    //发送焦点
    void DATInput::F_SendFocus() 
    {
    CMainFrame *OwnWnd;
    OwnWnd=(CMainFrame *)GetParentOwner();
    OwnWnd->SetFocus();
    }
    //光标
    BOOL DATInput::OnSetCursor(CWnd* pWnd,UINT nHitTest,UINT message) 
    {
        if (nHitTest==HTCLIENT)
    {CMainFrame MCursor;
            DWORD dwPos=::GetMessagePos();
            CPoint point(LOWORD(dwPos),HIWORD(dwPos));
            ScreenToClient(&point);
            if (n_Screen.PtInRect(point))SetCursor(MCursor.m_CS[C_TEXT]);
            else SetCursor(MCursor.m_CS[C_SELECTE]);}
        return TRUE;
    }
    //设置光标
    void DATInput::F_SetCursor(bool Mode) 
    {
    if (Mode && !n_Cursor){ShowCaret();n_Cursor=true;}
    else if(!Mode && n_Cursor){HideCaret();n_Cursor=false;}
    }
    //设置消息
    void DATInput::F_SetMessage(bool View,UCHAR Look,UCHAR Data,USHORT Command)
    {
    DATA.n_Massage.Main=V_INPUT;n_Message=true;
    DATA.n_Massage.TView=View;DATA.n_Massage.TLook=Look;
    DATA.n_Massage.TData=Data;DATA.n_Massage.Command=Command;
    }
    //发送消息
    void DATInput::F_SendMessage()
    {
    CMainFrame *OwnWnd;
    OwnWnd=(CMainFrame *)GetParentOwner();
    OwnWnd->SendMessage(WM_PAINT,0,0);
    n_Message=false;
    }
    //设置消息文本
    void DATInput::F_SetMassageText(bool Mode)
    {
    bool Met = false;
    USHORT N = DATA.N_MOUSEPOINT.Number;
    CString ST;

    if (n_InputText.GetLength())
    F_AddLine(); if (DATA.n_DrawType)
    {
    if (DATA.n_Massage.Command == CT_TRUE)
    {
    POINT2D PT = DATA.N_MOUSEPOINT.GetPoint(N - 1);

    ST.Format("%.2f", PT.x); n_InputText = ST;
    ST.Format("%.2f", PT.y); n_InputText += "," +ST;

    /* if ((N >= 2 && (DATA.T_Tool[CM_RECT] || DATA.T_Tool[CM_ELLIPSE])) 
    || (N >= 3 && DATA.T_Tool[CM_ARC]))
    {
    n_OutputText[n_Number - 1] = n_StarText + n_InputText;

    F_AddLine();

    n_StarText = _T("命令:");
    ST = _T("起点");
    n_InputText = DATA.n_Command[n_OldCommand];
    }
    else*/
    ST = _T("下一点");
    }
    else 
    {
    if (Mode)
    n_OldCommand = DATA.n_Massage.Command;

    n_StarText = "";//=_T("命令:");

    n_InputText = DATA.n_Command[n_OldCommand];

    ST = _T("起点");
    n_InputMode = 2;
    }

    n_OutputText[n_Number - 1] = n_StarText + n_InputText;
    n_StarText = ST + _T("坐标(X,Y):");
    n_InputText = _T("");

    if (Mode)
    F_AddLine();
    //n_InputMode = 2;
    }
    else
    Met = true; if (Met)
    {POINT2D PT = DATA.N_MOUSEPOINT.GetPoint(N - 1);

    ST.Format("%.2f", PT.x); n_InputText = ST;
    ST.Format("%.2f", PT.y); n_InputText += "," +ST;

    n_OutputText[n_Number-1]=_T("命令:")+DATA.n_Command[DATA.n_Massage.Command];
    switch (DATA.n_Massage.Command)
    {case CM_CLOSE:n_StarText=_T("命令:");break;
    case CV_SCALEMAP:n_StarText=_T("输入缩放值:");break;
    default:n_StarText=_T("输入:");break;}
    F_AddLine();n_InputText=_T("");}
    n_TextPos=n_InputText.GetLength();
    }
      

  6.   

    void DATInput::OnPaint() 
    {
    CPaintDC dc(this);
    if (!n_CharHeight)// 字符宽
    {CClientDC hDC(this);CPoint Size;
    Size=hDC.GetTextExtent("字符高");
    n_CharHeight=Size.y;n_LineHeight=n_CharHeight+2;}
    if (DATA.n_Massage.Command)
    F_SetMassageText(true);
    F_Draw();
    if (DATA.n_SetTreeMap)F_SendFocus();
    }
    //绘制
    void DATInput::F_Draw()
    {
    CDC* pDC = GetDC();
    GetClientRect(&n_Screen); n_OutputText[n_Number - 1] = n_StarText + n_InputText; F_GetStarLine();
    F_SetScroll();
    // F_DrawText(pDC);
    F_TextChangeCaret();
    F_DrawText(pDC);

    if (n_Message)
    F_SendMessage();
    }
    //绘制文本
    void DATInput::F_DrawText(CDC* pDC)
    {int i,di,dy;CRect rect;CString Text;
    rect.left=0;rect.right=n_Screen.right;
    for (i=n_TextPoint.y;i<n_Number;i++)
    {di=i-n_TextPoint.y;
    if (di*n_LineHeight<n_Screen.bottom)
    {dy=di*n_LineHeight;
    rect.top=dy;rect.bottom=dy+n_LineHeight;
    Text=n_OutputText[i];
    if (rect.bottom>n_Screen.bottom)rect.bottom=n_Screen.bottom;
    pDC->ExtTextOut(n_TextStar,dy,ETO_CLIPPED|ETO_OPAQUE,
    rect,Text,NULL);}
    else break;}
    dy+=n_LineHeight;//消除最后一行
    rect.top=dy;rect.bottom=dy+n_LineHeight;
    if (rect.bottom>n_Screen.bottom)rect.bottom=n_Screen.bottom;
    if (rect.bottom>rect.top)
    pDC->ExtTextOut(n_TextStar,dy,ETO_CLIPPED|ETO_OPAQUE,rect,"",NULL);
    }
    //鼠标左键
    void DATInput::OnLButtonDown(UINT nFlags,CPoint point) 
    {
        if (n_Screen.PtInRect(point))
    {int L,dl;
    L=(int)((float)n_Screen.bottom/(float)n_LineHeight);
    dl=n_Number-(L+n_TextPoint.y);
    if (dl>0)n_TextPoint.y+=dl;
    F_PointChangeText(point);
    F_Draw();F_SetCursor(true);}
    }
    //增加行数 
    void DATInput::F_AddLine() 
    {
    if (n_Number<MAX_STRINGS)
    {n_Number++;n_TextPoint.y=n_Number-1;}
    else 
    {for (ULONG i=0;i<MAX_STRINGS-1;i++)
    n_OutputText[i]=n_OutputText[i+1];
    n_OutputText[MAX_STRINGS-1]=_T("");}
    }
    void DATInput::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {UCHAR Key=0;bool Message=false,ReDraw=false;
     switch (nChar)
    {case VK_LEFT:Key=1;
    if (!n_InputText.GetLength())
    {DATA.K_WAY=K_LEFT;Message=true;}
    break;
    case VK_RIGHT:Key=2;
    if (!n_InputText.GetLength())
    {DATA.K_WAY=K_RIGHT;Message=true;}
    break;
    case VK_UP:DATA.K_WAY=K_UP;Message=true;break;
    case VK_DOWN:DATA.K_WAY=K_DOWN;Message=true;break;
    case VK_SHIFT:DATA.K_CONBIN=K_SHIFT;break;
    case VK_CONTROL:DATA.K_CONBIN=K_CONTROL;
    break;
    case VK_DELETE:
    {F_DeleteText(2);ReDraw=true;
    DATA.K_TAKE=K_DELETE;Message=true;}break;
    case VK_HOME:DATA.K_TAKE=K_HOME;Message=true;break;
    case VK_END:DATA.K_TAKE=K_END;Message=true;break;

    case VK_SPACE:
    if (n_InputText.GetLength())
    {F_GetKyeInputText();ReDraw=true;}
    else 
    {if (n_OldCommand)
    {F_SetMassageText(false);ReDraw=true;}
    F_SetMessage(true,V_NO,V_NO,CT_NO);}
    DATA.K_TAKE=K_RETURN;Message=true;
    break;
    case VK_F1:DATA.K_FUNCTION=K_F1;Message=true;break;
    case VK_F2:DATA.K_FUNCTION=K_F2;Message=true;break;
    case VK_F3:DATA.K_FUNCTION=K_F3;DATA.F_ToolContrl(CV_NEARPOINT);break;//磁点开关
    case VK_F4:DATA.F_VerticalCtrol();break;//垂线开关
    case VK_F5:DATA.F_ParallelCtrol();break;//平行线开关
    case VK_F6:DATA.K_FUNCTION=K_F6;Message=true;break;
    case VK_F7:DATA.K_FUNCTION=K_F7;Message=true;break;
    case VK_F8:DATA.K_FUNCTION=K_F8;Message=true;break;
    case VK_F9:DATA.K_FUNCTION=K_F9;Message=true;break;
    case VK_F10:DATA.K_FUNCTION=K_F10;Message=true;break;
    case VK_F11:DATA.K_FUNCTION=K_F11;Message=true;break;
    case VK_F12:DATA.K_FUNCTION=K_F12;Message=true;break;
        default:
            break;}
    if (DATA.K_TAKE==K_RETURN)
    {n_InputText.Empty();}
    if (Key)F_MoveTextPoint(Key);
    if (ReDraw)F_Draw();
    if (Message)
    {F_SetMessage(true,V_SEE,V_NO,CT_NO);F_SendMessage();}}
    void DATInput::OnKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags)
    {bool Message=false,ReDraw=false;
    DATA.K_KYE=0;
        switch (nChar)
    {case VK_ESCAPE:DATA.K_TAKE=K_ESCAPE;Message=true;
    F_SetMessage(true,V_NO,V_NO,CT_NO);break;

    case VK_RETURN:
    if (n_InputText.GetLength())
    {
    char ST;
    if (n_InputText.GetLength() >= 2)
    ST = n_InputText.GetAt(n_TextPos - 2);
    else
    n_EnterFlag = true;
    /*
    CString MN;
    MN.Format("%d",n_EnterFlag);
    AfxMessageBox(MN);
    //*/ if (n_EnterFlag || (UINT)ST <= 145)
    {
    F_GetKyeInputText();

    //F_SetMessage(true, V_NO, V_NO, CT_NO);
    n_InputMode = 1;
    F_SetMassageText(true); n_EnterFlag = false;

    ReDraw = true;
    }
    else
    {
    n_EnterFlag = true;
    return;
    }
    // F_SetMessage(true, V_SEE, V_NO, CT_TRUE);
    }
    else
    {
    if (n_OldCommand)
    {
    F_SetMassageText(false);

    ReDraw = true;
    }

    F_SetMessage(true, V_NO, V_NO, CT_NO);
    }
    DATA.K_TAKE = K_RETURN;
    Message = true;
    break;
    case VK_LEFT:DATA.K_WAY=0;break;
    case VK_RIGHT:DATA.K_WAY=0;break;
    case VK_UP:DATA.K_WAY=0;break;
    case VK_DOWN:DATA.K_WAY=0;break;
    case VK_DELETE:DATA.K_TAKE=0;break;
    case VK_SHIFT:DATA.K_CONBIN=0;break;
    case VK_CONTROL:DATA.K_CONBIN=0;break;
    case VK_HOME:DATA.K_TAKE=0;break;
    case VK_END:DATA.K_TAKE=0;break;
    //case VK_SPACE:DATA.K_TAKE=0;break;
        default:n_EnterFlag = true;break;}
    if (DATA.K_TAKE==K_RETURN)
    {n_InputText.Empty();}//F_AddLine();}
    if (ReDraw)F_Draw();
    if (Message)F_SendMessage();//发送消息}
    //字符
    void DATInput::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    n_EnterFlag = false;
    bool Retrun = false, Message = false, ReDraw = false;

    if (DATA.K_CONBIN == K_CONTROL)
    {
    DATA.K_KYE = nChar;
    Message = true;
    }
    else
    DATA.K_KYE = 0;

    if (DATA.K_KYE < 0 || DATA.K_KYE > 26)
    DATA.K_KYE = 0;
        
    switch (nChar)
    {
    case VK_ESCAPE:
    break;
    case VK_BACK:
    F_DeleteText(1);
    ReDraw = true;
    break;
    // case VK_SPACE:break;
    default:
    if (nChar <= 31)
    return;
    else if (n_TextPos >= n_InputText.GetLength())
    n_InputText += nChar;
    else //插入字符
    {
    int N = n_TextPos;
    CString S = n_InputText.Right(n_InputText.GetLength() - N);
    n_InputText = n_InputText.Left(N);
    n_InputText += nChar;
    n_InputText += S;
    }
    n_TextPos++;
    ReDraw = true;
    break;
    }

    if (ReDraw)
    F_Draw();
    if (Message)
    {
    F_SetMessage(true, V_SEE, V_NO, CT_NO);
    F_SendMessage();
    }// if (ReDraw)
    // F_Draw();
    }
      

  7.   

    void DATInput::OnSysKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    DATA.K_KYE=nChar-64;
    if (DATA.K_KYE<0 || DATA.K_KYE>26)DATA.K_KYE=0;
        switch (nChar)
    {case VK_MENU:DATA.K_CONBIN=K_ALT;break;
    default:break;}
    if (DATA.K_CONBIN==K_ALT && DATA.K_KYE)
    {if (F_SetKyeCommandText())
    {F_Draw();
    F_SetMessage(true,V_NO,V_NO,CT_NO);F_SendMessage();}}//发送消息
    }
    void DATInput::OnSysKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags)
    {
        switch (nChar)
    {case VK_MENU:DATA.K_CONBIN=0;break;
    default:break;}
    }
    void DATInput::OnSysChar (UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // DATA.K_KYE=nChar;
    }
    //设置键盘命令文本
    bool DATInput::F_SetKyeCommandText()
    {bool Mode=true;CString ST;
        switch (DATA.K_KYE)
    {case K_A:DATA.F_ToolContrl(CM_ARC);break;
    case K_B:DATA.F_ToolContrl(CM_BLOCK);break;
    case K_C:
    {UCHAR C=DATA.n_MouseLine.Class;
    if (DATA.n_DrawType==CM_LINE || DATA.n_DrawType==CM_BEZIER 
    || C==CM_LINE || C==CM_BEZIER)
    {n_OutputText[n_Number-1]=_T("命令:闭合多边形");
    F_AddLine();n_InputText=_T("");
    n_StarText=_T("第一个坐标点(X,Y):");}
    else Mode=false;}
    case K_D:break;
    case K_E:break;
    case K_F:break;
    case K_G:DATA.F_ToolContrl(CM_POLYGON);break;
    case K_H:break;
    case K_I:break;
    case K_J:break;
    case K_K:break;
    case K_L:DATA.F_ToolContrl(CM_LINE);break;
    case K_M:break;
    case K_N:break;
    case K_O:DATA.F_ToolContrl(CM_BLOCKOPEN);break;
    case K_P:DATA.F_ToolContrl(CM_POINT);break;
    case K_Q:DATA.F_ToolContrl(CM_BEZIER);break;
    case K_R:DATA.F_ToolContrl(CM_RECT);break;
    case K_S:break;
    case K_T:DATA.F_ToolContrl(CM_LINEBODY);break;
    case K_U:break;
    case K_V:break;
    case K_W:break;
    case K_X:break;
    case K_Y:DATA.F_ToolContrl(CM_ELLIPSE);break;
    case K_Z:break;
    default:break;}
    return Mode;
    }
    //处理键盘输入文本
    bool DATInput::F_GetKyeInputText()
    {bool Met=true,Flag=true;
    char ST;int SS,NN,N,F1 = 0,F2 = 0,F3 = 0;CString S1="",S2="",N1="",N2="";
    N=n_InputText.GetLength();SS=NN=0;


    if (((int)n_InputText.GetAt(0) == 45 
    || ((int)n_InputText.GetAt(0) > 47 && (int)n_InputText.GetAt(0) < 58))
    && ((int)n_InputText.GetAt(N-1) > 47 && (int)n_InputText.GetAt(N-1) < 58))
    {
    for (int i = 0; Flag && i < N; i++)
    {
    ST = n_InputText.GetAt(i);
    if ((int)ST == 47 || (int)ST < 44 || (int)ST > 57)
    Flag = false;
    if ((int)ST == 44)
    F1++;
    else if ((int)ST == 45)
    F2++;
    else if ((int)ST == 46)
    F3++;
    if (F1 > 1 || F2 > 2 || F3 > 2 || (F2 - F1) > 2 || (F3 - F1) > 2)
    Flag = false;
    if ((int)ST == 45 && (i != 0 && (int)n_InputText.GetAt(i-1) != 44))
    Flag = false;
    if ((int)ST == 46 && !((int)n_InputText.GetAt(i-1) > 47 && (int)n_InputText.GetAt(i-1) < 58))
    Flag = false;
    }
    if (Flag)
    {
    F1 = 0;
    for (int i = 0; i < N; i++)
    {
    ST = n_InputText.GetAt(i);
    if ((int)ST != 44)
    {
    if (!F1)
    N1 += ST;
    else
    N2 += ST;
    }
    else
    F1 = 1;
    }
    }
    }
    else if (n_InputText == "a" || n_InputText == "A")
    {
    DATA.F_ToolContrl(CM_ARC);
    F_SetMessage(true,V_NO,V_NO,CM_ARC);
    }
    else if (n_InputText == "b" || n_InputText == "B")
    {
    DATA.F_ToolContrl(CM_BLOCK);
    F_SetMessage(true,V_NO,V_NO,CM_BLOCK);
    }
    else if (n_InputText == "g" || n_InputText == "G")
    {
    DATA.F_ToolContrl(CM_POLYGON);
    F_SetMessage(true,V_NO,V_NO,CM_POLYGON);
    }
    else if (n_InputText == "l" || n_InputText == "L")
    {
    DATA.F_ToolContrl(CM_LINE);
    F_SetMessage(true,V_NO,V_NO,CM_LINE);
    }
    else if (n_InputText == "o" || n_InputText == "O")
    {
    DATA.F_ToolContrl(CM_BLOCKOPEN);
    F_SetMessage(true,V_NO,V_NO,CM_BLOCKOPEN);
    }
    else if (n_InputText == "p" || n_InputText == "P")
    {
    DATA.F_ToolContrl(CM_POINT);
    F_SetMessage(true,V_NO,V_NO,CM_POINT);
    }
    else if (n_InputText == "q" || n_InputText == "Q")
    {
    DATA.F_ToolContrl(CM_BEZIER);
    F_SetMessage(true,V_NO,V_NO,CM_BEZIER);
    }
    else if (n_InputText == "r" || n_InputText == "R")
    {
    DATA.F_ToolContrl(CM_RECT);
    F_SetMessage(true,V_NO,V_NO,CM_RECT);
    }
    else if (n_InputText == "t" || n_InputText == "T")
    {
    DATA.F_ToolContrl(CM_ELLIPSE);
    F_SetMessage(true,V_NO,V_NO,CM_ELLIPSE);
    }
    else if (n_InputText == "x" || n_InputText == "X")
    {
    DATA.F_ToolContrl(CM_LINEBODY);
    F_SetMessage(true,V_NO,V_NO,CM_LINEBODY);
    }
    /*
    CString MN = "";
    MN += "X="+N1+"\n"+"Y="+N2+"\n";
    AfxMessageBox(MN);
    //*/
    /* if (n_InputMode==1)//命令
    {if (S1!="" && S1=="" && N1=="" && N2==""){}
    else {}}//非法
    else if (n_InputMode==2)//坐标
    {if (S1==_T(",") && S2==_T("") && N1!=_T("") && N2!=_T(""))
    {
    DATA.K_POINT.x=CT_StringChangeFloat(N1);
    DATA.K_POINT.y=CT_StringChangeFloat(N2);
    n_TextPoint.y=n_Number-1;n_TextPos=0;
    n_StarText=_T("输入下一个坐标点(X,Y):");n_InputText=_T("");
    F_SetMessage(true,V_NO,V_NO,CT_TRUE);}
    else {}}//非法
    */
    return Met;
    }
    //鼠标点转换为文本点
    void DATInput::F_PointChangeText(CPoint Point)
    {
    CClientDC dc(this);char ST;CPoint Size;int N,SN,EN,LX=0;
    N=n_InputText.GetLength();
    Size=dc.GetTextExtent(n_StarText);SN=Size.x+n_TextStar;
    Size=dc.GetTextExtent(n_InputText);EN=Size.x;Point.x-=SN;
    if (Point.x<0)n_TextPos=0;
    else if (Point.x>EN)n_TextPos=N;
    else
    {for (int i=1;i<N;i++)
    {ST=n_InputText.GetAt(i-1);
    if ((int)ST>145 || (int)ST<0)i++;
    Size=dc.GetTextExtent(n_InputText.Left(i));
    if (Size.x<Point.x){n_TextPos=i;LX=Size.x;}
    else 
    {if (Point.x>(LX+Size.x)/2)n_TextPos=i;
    break;}}}
    F_Draw();
    // F_TextChangeCaret();
    }
    //键盘移动文本点
    void DATInput::F_MoveTextPoint(UCHAR Key)
    {
    CClientDC dc(this);char ST;
    int N=n_InputText.GetLength();
    if (Key==1 && n_TextPos>0)//左
    {n_TextPos--;
    ST=n_InputText.GetAt(n_TextPos);
    if ((UINT)ST>145)n_TextPos--;}
    else if (Key==2 && n_TextPos<N)//右
    {ST=n_InputText.GetAt(n_TextPos);
    if ((UINT)ST>145)n_TextPos++;
    n_TextPos++;}
    F_Draw();
    // F_TextChangeCaret();
    }//文本点转换为光标点
    void DATInput::F_TextChangeCaret()
    {
    CClientDC dc(this);CPoint Size;int SN;
    Size=dc.GetTextExtent(n_StarText);SN=Size.x+n_TextStar;
    Size=dc.GetTextExtent(n_InputText.Left(n_TextPos));
    n_CursorPos.x=SN+Size.x;
    n_CursorPos.y=(n_Number-1-n_TextPoint.y)*n_LineHeight;
        SetCaretPos(n_CursorPos);
    if (n_Screen.PtInRect(n_CursorPos))F_SetCursor(true);
    else F_SetCursor(false);
    }
    //删除文本
    void DATInput::F_DeleteText(UCHAR Key)
    {
    CClientDC dc(this);char S;
    CString Text=n_InputText;
    int N=n_InputText.GetLength();
    if (Key==1 && n_TextPos)//左
    {
    S=Text.GetAt(n_TextPos-1);
    if ((UINT)S<146)
    {Text=Text.Left(n_TextPos-1)+Text.Right(N-n_TextPos);
    n_TextPos--;}
    else 
    {Text=Text.Left(n_TextPos-2)+Text.Right(N-n_TextPos);
    n_TextPos-=2;}}
    else if (Key==2 && n_TextPos<N)//右
    {S=Text.GetAt(n_TextPos);
    if ((UINT)S<146)Text=Text.Left(n_TextPos)+Text.Right(N-n_TextPos-1);
    else Text=Text.Left(n_TextPos)+Text.Right(N-n_TextPos-2);}
    n_InputText=Text;
    }
      

  8.   

    昨天下班正好赶上有事,所以没有来得急查阅,本来还以为不会有人帮忙我了......
    谢谢了,我的qq号码是:101982174 有事情可以联系我。可是我是VC新手,所以技术上的事情我可能帮不上什么忙......谢谢寒羽!