如何做一个象VC++6.0中OutPut一样的能够每次可以反映程序运行情况的编辑框,又象AUTO CAD界面中最下方的对话框一样,用户的每一次操作在编辑框中都有记录,而且都能显示出来。谢谢!
解决方案 »
- 一个路径算法的小问题
- 控件的值超出范围 vc
- CxImage和corona中重定义了
- report 风格的 ListCtrl 如何在一个条目里显示多行字符串呢?
- vc 简单问题!!
- 如何读写文件中任一范围内的数据
- 哪位朋友可以给我一个打印的例子
- 听说过珠海优特吗,这公司怎么样?
- fwrite为什么会卡死十几分钟?
- 在Com接口方法中,有些参数是[out]属性,此时到底是调用者分配内存,还是被调用者分配内存,我查了几本书,但是否说的都不一样,我快要搞昏了,那位明白的大侠能否解释在com中参数传递到底是怎么回事!
- (x1,y1),(x2,y2).......(xn,yn),对这些n组数据进行拟合的算法
- 在坐标轴,x是时间轴,怎么实现显示时间的时候,原点显示的时间比x轴右侧时间慢30秒。???
#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_)
// 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();//光标点
}
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();
}
{
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();
}
{
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;
}
谢谢了,我的qq号码是:101982174 有事情可以联系我。可是我是VC新手,所以技术上的事情我可能帮不上什么忙......谢谢寒羽!