MfC打开过程详解及应用

本文主要介绍:在MFC中,菜单打开命令的响应过程。

一、MFC打开命令的响应过程:

File->Open 对应的ID为ID_FILE_OPEN,其响应过程如下:

注:如果自己已将ID_FLIE_OPEN在MFC中重载了,则会直接响应重载函数,不会按以下过程响应。

1.点击File->Open,首先响应的函数为: CWinApp::OnFileOpen(),其函数原型为:

void CWinApp::OnFileOpen()
{
	ASSERT(m_pDocManager != NULL);
        m_pDocManager->OnFileOpen();
}

2.由上面的程序可知,接着调用的是: CDocManager::onFileOpen(),该函数功能是:显示打开文件的对话框,并获取文件的路径,其函数原型为:

void CDocManager::OnFileOpen()
{
       // prompt the user (with all document templates)
	CString newName;  //弹出打开文件的对话框,获取文件路径
    if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL))
		return; // open cancelled
    AfxGetApp()->OpenDocumentFile(newName);
      // if returns NULL, the user has already been alerted
}

3.接着调用函数:  CWinApp::OpenDocumentFile(LPCTSTR lpszFileName),其函数原型为:
CDocument* CWinApp::OpenDocumentFile(LPCTSTR lpszFileName)
{
    ASSERT(m_pDocManager != NULL);
    return m_pDocManager->OpenDocumentFile(lpszFileName);
}

4.再调用函数: CDocManager::OpenDocumentFile(LPCTSTR lpszFileName),该函数遍历文档模板,对每个文档进行匹配,若该文件已经在某个文档中打开,则会激活该文档视图,否则用匹配的文档模板,调用下一个打开函数,其原型为:

CDocument* CDocManager::OpenDocumentFile(LPCTSTR lpszFileName)
{
       // find the highest confidence
    POSITION pos = m_templateList.GetHeadPosition();
    CDocTemplate::Confidence bestMatch = CDocTemplate::noAttempt;
    CDocTemplate* pBestTemplate = NULL;
    CDocument* pOpenDocument = NULL;
       lstrcpyn(szTemp, lpszFileName, _MAX_PATH);
       LPTSTR lpszLast = _tcsrchr(szTemp, '"');

       if (lpszLast != NULL)
              *lpszLast = 0;
			  
       AfxFullPath(szPath, szTemp);
       TCHAR szLinkName[_MAX_PATH];
	   
       if (AfxResolveShortcut(AfxGetMainWnd(), szPath, szLinkName, _MAX_PATH))
              lstrcpy(szPath, szLinkName);

       while (pos != NULL)
       {
              CDocTemplate* pTemplate = (CDocTempla
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`SetClassLongA`函数的参数如下: ```c++ LONG SetClassLongA( HWND hWnd, // 窗口句柄 int nIndex, // 属性索引 LONG dwNewLong // 新属性值 ); ``` 参数说明: - `hWnd`:指定窗口句柄。 - `nIndex`:指定要设置的属性索引。可以是以下值之一: - `GCL_MENUNAME`:设置窗口类的菜单名称。 - `GCL_STYLE`:设置窗口类的样式。 - `GCL_WNDPROC`:设置窗口类的窗口过程。 - `GCL_HICON`:设置窗口类的大图标句柄。 - `GCL_HICONSM`:设置窗口类的小图标句柄。 - `GCL_CBCLSEXTRA`:设置窗口类的额外类字节数。 - `GCL_CBWNDEXTRA`:设置窗口类的额外窗口字节数。 - `GCL_HCURSOR`:设置窗口类的光标句柄。 - `GCL_HBRBACKGROUND`:设置窗口类的背景画刷句柄。 - `dwNewLong`:指定新的属性值。 注意: - 在使用`SetClassLongA`函数之前,需要确保指定的窗口类已经注册。 - 如果在使用`SetClassLongA`函数之前,使用了`AfxRegisterWndClass`或`RegisterClass`函数注册窗口类,则需要使用相应的函数获取窗口类的原始值,然后将修改后的值与它们合并。例如: ```c++ LONG dwStyle = ::GetClassLongA(m_hWnd, GCL_STYLE); ::SetClassLongA(m_hWnd, GCL_STYLE, dwStyle | CS_DROPSHADOW); ``` 上述代码将向窗口类的样式中添加`CS_DROPSHADOW`位,而不是替换它们。 - 在使用`SetClassLongA`函数之后,需要使用`SetWindowPos`函数通知系统更新窗口样式。例如: ```c++ ::SetClassLongA(m_hWnd, GCL_STYLE, dwStyle | WS_BORDER); ::SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值