MFC 笔记

 

2011-09-26

前三章基本没有问题,今天晚上看第四章;

 

1.       主要的继承关系:

 CObject -> CCmdTarget

 

CCmdTarget -> CWinThread->CWinApp->CMyApp

CCmdTarget -> CWnd -> CFrameWnd -> CMainFrame

CCmdTarget -> CWnd -> CView -> CMyView

CCmdTarget -> CDocument -> CMyDoc

 

2.       资源命名:

 IDR_ 主菜单 工具栏 应用程序图标 快捷键表

 IDD_ 对话框

 IDC_ 控件和光标

 IDS_ 字符串

 IDP_ 信息对话框和字符串

 ID_  菜单命令项

 

3.       源文件:

1). CMainFrame: AssertValid() //诊断CMainFrame是否有效

Dump() //用于输出CMainFrame对象的状态信息

OnCreate() //创建工具栏和状态栏

OnCreateWindow() //创建窗口,可以重载

 

 

 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT & cs)

{

       If(!CFrameWnd::PreCreateWindow(cs))

              return False;

       cs.style &= ~WS_MAXIMIZEBOX;

       return TRUE;

}

2).CMyDoc:  AssertValid()

                  Dump()

                  OnNewDocument()

            Serialize()

特别要注意一下文档成员变量的初始化

 

3).CMyView:        AssertValid()

                            Dump()

                            GetDocument()

                            OnDraw()

 

4).应用程序类源文件:

BEGIN_MESSAGE_MAP(CMyApp,CWinApp)

       //{AFX_MSG_MAP(CMyApp)

       ON_COMMAND(ID_APP_ABOUT,OnAppAbout)

              *

              *

              *

       ON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp::OnFilePrintSetup)

END_MESSAGE_MAP()

 

CMyApp::CMyApp()

{

//把所有的重要的初始化信息放在InitInstance过程当中

}

 

CMyApp theApp;

 

BOOL CMyApp::InitInstance()

{

       #ifdef_AFXDLL

              Enable3dControls();

       #else

              Enable3dControlsStatic();

       #endif

 

      

       SetRegistryKey(_T(“Local AppWizard-Generated Applications”));

       LoadStdProfileSettings();

       //注册应用程序所使用的文档模板,文档模板用于链接文档,框架窗口和视图

       CSingleDocTemplate *pDocTemplate;

       pDocTemplate = new CSingleDocTemplate(

              IDR_MAIN_FRAME,

              RUNTIME_CLASS(CMyDoc),

              RUNTIME_CLASS(CMainFrame),

              RUNTIME_CLASS(CMyView));

       AddDocTemplate(pDocTemplate);

      

       CCommandLineInfo cmdInfo;

       ParseCommandLine(cmdInfo);

      

       if(!ProcessShellCommand(cmdInfo))

              return FALSE;

       m_pMainWnd->ShowWindow(SW_SHOW);

       m_pMainWnd->UpdateWindow();

       return TRUE;

}

 

 

 

在视图区显示文档图标:OnDraw(CDC *pDC)

HICON hDocIcon = AfxGetApp()->LoadIcon(IDR_MFC_DETYPE);

pDC->DrawIcon(10,10,hDocIcon);

 

 

 

CString: 积累

       Codes 1:

              int i = 1;

              CString str1;

              str1.Format(“Hello MFC: %d”,i);

              MessageBox(str1);

 

##########################################

现在复习第五章:文档与视图

 

文档与视图的相互作用:

1.       CView::GetDocument()

一般文档类数据成员定义成公有的

2.       CDocument::UpdateAllViews()

void UpdateAllViews(CView* pSender,LPARAM lHint = 0L,CObject* pHint = NULL);

3.       OnUpdate()

Void CView::OnUpdate(CView *pSender,LPARAM /* lHint */,CObject * /* pHint */)

{

        ASSERT(pSender != this);

        UNUSED(pSender);

        Invalidate(TRUE);

}

 

       刷新视图时默认的函数调用过程:

       CDocument::UpdateAllViews() -> CView::OnUpdate() -> CWnd::Invalidate() -> OnPaint() -> OnDraw()

 

      

 

DeleteContents() 

 

 

 

UPDATE_COMMAND_UI: 用于更新菜单项状态

void CDrawCoinDoc::OnUpdateCoinSub(CCmdUI* pCmdUI)

{

       If(m_nCoins < 1) pCmdUI->Enable(FALSE);

       Else pCmdUI->Enable(TRUE);

}

 

 

 

弹出式菜单:

 

void CMyView::OnContextMenu(CWnd* pWnd,CPoint point)

{

       CMenu menuPopup;

       If(menuPop.CreatePopupMenu())

       {

              menuPopup.AppendMenu(MF_STRING,ID_COIN_ADD,”增加硬币\tCtrl+A”);

              menuPopup.AppendMenu(MF_STRING,ID_COIN_SUB,”减少硬币\tCtrl+B”);

              menuPopup.TrackePopupMenu(TRM_LEFTALIGN,point.x,point.y,this);

}

}

 

 

鼠标消息:

MFC ClassWizard 类向导生成的鼠标消息处理函数一般都有两个参数类型为UINT 的nFlags: 表示鼠标按键和键盘上控制键的状态、类型为CPoint的参数point,表示鼠标的当前所在位置.

 

获得光标:

HCURSOR m_hCursor = AfxGetApp()->LoadStandardCursor(IDC_CROSS);

捕获鼠标:

SetCapture();

::SetCursor(m_hCursor);

 

释放鼠标:

ReleaseCapture();

 

 

 

工具栏和状态栏的设计

 

说明:如果要自己编程生成工具栏,首先必须添加工具栏资源并定制工具栏按钮,然后按照MFC应用程序框架添加工具栏的方法,构造一个CToolBar类对象,调用CToolBar类成员函数Create()或CreateEx()生成指定风格的工具栏并链接到CToolBar对象,最后调用CToolBar类的成员函数LoadToolBar()装入创建的工具栏

 

 

 

文档的读写:

在VC++中采用以下三种方法实现磁盘数据的读写

1.       C++文件流ifstream ofstream fstream

2.       CFile类

3.       使用CArchieve对文档进行序列化处理

#############################

CFile:

 

CFile::modeCreate

CFile::modeNoTruncate

CFile::modeRead

CFile::modeReadWrite

CFile::modeWrite

CFile::typeBinary

CFile::typeText

 

 

打开文件 1.CFile file(“C:\\MyFile.txt”,CFile::modeCreate | CFile::modeWrite);

               2. CFile file;

                 File.open(“C:\\TestFile.txt”,CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate);

 

最常用的读写函数: Read() Write(),Close()

void Read(void *lpBuf,UINT nCount);

void Write(const void *lpBuf,UINT nCount);

 

Read()函数的返回值为实际读取的字节数,改值小于或等于nCount,如果小于nCount则说明已经读到文件末尾,如果继续读,则返回0.

#####################################

序列化:

 

void CMyDoc::Serialize(CArchieve& ar)

{

       If(ar.IsStoring())

       {

 

}

else

{

 

}

 

}

MSDN:

CArchive(

   CFile* pFile,

   UINT nMode,

   int nBufSize = 4096,

   void* lpBuf = NULL

);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值