EDN首页   博客首页

日志档案

发表于 2007-9-15 10:22:25

0

标签: VC  

我的第2个VC例子

#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[] = "打字模拟

系统分类: 单片机   |   用户分类: VC++学习   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(914)    回复(0)  

投一票您将和博主都有获奖机会!