发表于
2007-9-15 10:22:25
#include <afxwin.h>
#include "resource.h"
//主窗口类//
class MyFrameWindow:public CFrameWnd
{
public:
//在窗口建立之前先执行这个函数//
BOOL PreCreateWindow(CREATESTRUCT& cs)
{
//载入menu资源并且将它指定为窗口的主菜单//
cs.hMenu = LoadMenu(NULL,MAKEINTRESOURCE(IDR_MAINMENU));
return CFrameWnd::PreCreateWindow(cs);
}
afx_msg void OnFileExit() //消息响应 file/exit //
{
PostMessage(WM_CLOSE); //发送关闭窗口的消息给自己//
}
//重点//
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//输入焦点//
afx_msg void OnSetCursor(CWnd *pOldWnd);
afx_msg void OnKillFocus(CWnd* pNewWnd);
//放开鼠标左键//
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
//输入字符//
afx_msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);
//设定鼠标光标//
afx_msg BOOL OnSetCursor(CWnd *pWnd,UINT nHitTest,UINT message);
CPoint caretPos; //记录文本光标的位置//
HCURSOR mouseCur; //鼠标的光标资源//
DECLARE_MESSAGE_MAP() //声明消息响应表//
};
//消息响应表//
BEGIN_MESSAGE_MAP(MyFrameWindow,CFrameWnd)
ON_COMMAND(ID_FILE_EXIT,OnFileExit)
//建立新窗口//
ON_WM_CREATE()
//输入焦点//
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
//放开鼠标左键//
ON_WM_LBUTTONUP()
//输入字符//
ON_WM_CHAR()
//设定鼠标光标//
ON_WM_SETFOCUS()
END_MESSAGE_MAP()
int MyFrameWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//先调用父类处理这个消息//
int apiRet;
apiRet = CFrameWnd::OnCreate(lpCreateStruct);
//以下是我们自己的程序//
caretPos.x = 0; //重置文本光标的位置//
caretPos.y = 0;
//载入系统默认的I型鼠标光标//
mouseCur = AfxGetApp()->LoadStandardCursor(IDC_IBEAM);
return apiRet;
}
//取得输入的焦点//
void MyFrameWindow::OnSetFocus(CWnd* pOldWnd)
{
//先调用父类处理这个消息//
CFrameWnd::OnSetFocus(pOldWnd);
//一下是我们自己的程序//
//建立文本光标大小是 3*20//
::CreateCaret(*this,(HBITMAP)NULL,3,20);
//设定文本光标位置//
SetCaretPos(caretPos);
//显示文本光标//
ShowCaret();
}
//失去输入焦点//
void MyFrameWindow::OnKillFocus(CWnd* pNewWnd)
{
//先调用父类处理这个消息//
CFrameWnd::OnKillFocus(pNewWnd);
//隐藏文本光标//
HideCaret();
//删除文本光标//
DestroyCaret();
}
//放开鼠标左键//
void MyFrameWindow::OnLButtonUp(UINT nFlags,CPoint point)
{
//先调用父类处理这个消息//
CFrameWnd::OnLButtonUp(nFlags,point);
caretPos = point;
//将文本光标移到鼠标所单击的位置//
SetCaretPos(caretPos);
}
//输入字符//
void MyFrameWindow::OnChar(UINT OnChar,UINT nRepCnt,UINT nFlags)
{
//先调用父类处理这个消息//
CFrameWnd::OnChar(OnChar,nRepCnt,nFlags);
TCHAR str[2];
CSize size;
//构造只有一个字符的字符串//
str[0] = (TCHAR)OnChar;
str[1] = 0;
HideCaret(); //隐藏文本光标//
CClientDC dc(this); //建立工作区的DC//
dc.TextOut(caretPos.x,caretPos.y,str); //显示使用者键入的字符//
//计算字符串显示在屏幕上的长宽点数//
size = dc.GetTextExtent(str,1);
//将文本光标移到输出字符串后的右边//
caretPos.x += size.cx;
SetCaretPos(caretPos);
//再恢复文本光标//
ShowCaret();
}
BOOL MyFrameWindow::OnSetFocus(CWnd* pWnd,UINT nHitTest,UINT message)
{
BOOL apiRet;
//先调用父类处理这个消息//
apiRet = CFrameWnd::OnSetFocus(pWnd,nHitTest,message);
//设定鼠标光标//
if((apiRet==FALSE)&&(nHitTest==HTCLIENT))
::SetCursor(mouseCur);
return apiRet;
}
//应用程序类//
class MainApp:public CWinApp
{
public:
MainApp():CWinApp(appTitle) //设定应用程序名称//
{
}
BOOL InitInstance()
{
HICON hIcon; //ICON资源的handle//
hIcon = LoadIcon(IDI_MAINICON); //载入ICON资源//
CFrameWnd* MyFrame = new MyFrameWindow; //产生主窗口对象//
m_pMainWnd = MyFrame;
MyFrame->Create(NULL,appTitle); //建立主窗口//
MyFrame->SetIcon(hIcon,TRUE); //设定窗口的大ICON//
MyFrame->SetIcon(hIcon,FALSE); //设定窗口的小ICON//
MyFrame->ShowWindow(SW_SHOW); //显示主窗口//
return TRUE;
}
static const TCHAR appTitle[];
}theApp;
const TCHAR MainApp::appTitle[] = "打字模拟