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
);