一、新建一个单文档应用程序工程,取名叫usekey
二、我们的目标是这样的,如果依次键入a、b、c,则分别显示a、ab、abc,所以应该有一个变量来存放。而MFC是文档视图结构的,所以在文档中建立一个变量是合适的。
在类CUsekeyDoc的定义(usekeyDoc.h头文件中)中加入一个成员
class CUsekeyDoc : public CDocument { protected: // create from serialization only CUsekeyDoc(); DECLARE_DYNCREATE(CUsekeyDoc) CString StringData;//用于保存键入的字符串 // Attributes public:
CUsekeyDoc::CUsekeyDoc() { // TODO: add one-time construction code here StringData=" ";//置为空串 }三、建立键盘消息的处理函数
在view菜单中启动classwizad,Class name中选CUsekeyView,Object IDs处也选CUsekeyView,Messages处选WM_CHAR(这个就是键盘消息),双击WM_CHAR或点Add Function按钮,向导就生成了函数的框架
三、处理键盘消息并使windows绘制窗口
点Edit Code按钮,进入void CUsekeyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 的编写
void CUsekeyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CUsekeyDoc * p=GetDocument();//获取视图对应的文档 ASSERT_VALID(p);//断言,看文档指针p是否正确取得 p->StringData+=nChar; //把当前字符追加在后面 Invalidate();//使客户区无效(从而使得windows进行重绘 //也就是调用void CUsekeyView::OnDraw(CDC* pDC)) CView::OnChar(nChar, nRepCnt, nFlags);// }
实际上我们只是在OnDraw函数中显示StringData
///////////////////////////////////////////////////////////////////////////// // CUsekeyView drawing void CUsekeyView::OnDraw(CDC* pDC) { CUsekeyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->TextOut(0,0,pDoc->StringData);//输出字符串StringData }