从键盘读取输入
创建单窗口项目
为键盘数据创建存储区——为doc类增加CString类
class CkeyboardDoc : public CDocument
{
protected: // 仅从序列化创建
CkeyboardDoc();
DECLARE_DYNCREATE(CkeyboardDoc)
CString StringData;
CkeyboardDoc::CkeyboardDoc()
{
// TODO: 在此添加一次性构造代码
StringData = "";
}
读取击键——为view类添加事件WM_CHAR
void CkeyboardView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CkeyboardDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->StringData += (char)nChar;
Invalidate();
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CkeyboardView::OnDraw(CDC* /*pDC*/)
{
CkeyboardDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->TextOut(0,0,pDoc->StringData);
}
在窗口中间显示文本
CRect rect;
GetWindowRect(&rect);
int x = rect.Width()/2;
int y = rect.Height()/2;
CSize size = pDC->GetTextExtent(pDoc->StringData);
x -= size.cx/2;
y -= size.cy/2;
pDC->TextOutW(x,y,pDoc->StringData);
显示光标
TEXTMETRIC textmetric;
pDC->GetTextMetrics(&textmetric);
CreateSolidCaret(textmetric.tmAveCharWidth/8,textmetric.tmHeight);
CaretPosition.x = CaretPosition.y = 0;
SetCaretPos(CaretPosition);
ShowCaret();
移动光标
pDC->TextOut(0,0,pDoc->StringData);
CSize size = pDC->GetTextExtent(pDoc->StringData);
HideCaret();
CaretPosition.x = size.cx;
SetCaretPos(CaretPosition);
ShowCaret();
获取/失去焦点
View类添加WM_KILLFOCUS/WM_SETFOCUS事件
鼠标事件
View类添加WM_LBUTTONDOWN事件
void CkeyboardView::OnLButtonDown(UINT nFlags, CPoint point)
{
x = point.x;
y = point.y;
CkeyboardDoc *pDoc = GetDocument();
ASSERT_VALID (pDoc);
pDoc->StringData.Empty();
Invalidate();
……
}