社区
C++ 语言
帖子详情
工程类型是“基于对话框”,如何添加CMainFrame类?
qq_20937831
2014-09-17 02:04:04
为了方便,我在选择工程类型的时候选的是基于对话框,然后自己添加的菜单等,可是现在不方便了,很多地方需要用到CMainFrame类,可我没有啊。
我该怎么做,新建一个单文档工程,然后把已经做好的各种资源加进去,可行吗?或者,用什么方法添加一个CMainFrame类?毕竟是派生出来的,这样可以吗?
请指教。
...全文
237
3
打赏
收藏
工程类型是“基于对话框”,如何添加CMainFrame类?
为了方便,我在选择工程类型的时候选的是基于对话框,然后自己添加的菜单等,可是现在不方便了,很多地方需要用到CMainFrame类,可我没有啊。 我该怎么做,新建一个单文档工程,然后把已经做好的各种资源加进去,可行吗?或者,用什么方法添加一个CMainFrame类?毕竟是派生出来的,这样可以吗? 请指教。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
每天看一遍,防止恋爱&&堕落
2014-09-17
打赏
举报
回复
为什么这么麻烦?重新再建一个工程呗
qq_20937831
2014-09-17
打赏
举报
回复
引用 1 楼 justin_bkdrong 的回复:
简单点儿,再建个工程,单文档的,然后复制对应的CMainFrame 派生类过来,就可以了。
谢谢您的回复,我试试先。
枫舞的季节
2014-09-17
打赏
举报
回复
简单点儿,再建个工程,单文档的,然后复制对应的CMainFrame 派生类过来,就可以了。
在单文档程序中动态切换多个窗体的源码程序
摘要:本文通过一个程序实例描述了在VC++6.0下如何在单文档程序中通过菜单动态控制多 个窗体的切换。 一、 引言 我们在编制程序中根据需求的不同会在程序风格上选择多文档、单文档或是
对话框
模式 ,对于单文档模式可能是我们使用比较多的,但有时我们想采用单文档的形式显示多个不同 的窗体,如作为数据库前台应用程序就会遇到此
类
问题,数据库由大量的表单组成,而同常 一个窗体内只用来显示一个表单,所以要显示其他的表单时就要用到切换窗体的技术了,下 面就通过一个程序说明该技术的实现方法。 二、 实现技术 新建一个基于CFormView的单文档应用程序,再
添加
一个窗体和与之对应的基于 CFormView的新视
类
,然后通过在主框架
类
里
添加
控制代码和菜单控制实现这两个窗体的动态 切换,下面就是具体的实现过程: (一) 用"MFC AppWizard(exe)"建立一个新项目"SwitchForm",并在第二步的创建
类
型
上选 择为"Single documnet"单文档模式,第三、四、五、六步均取确省状态,最后一步选择 "CFormView"作为视
类
的基
类
。点按"完成"按钮,生成了初始
工程
"SwitchForm"。 (二) 点选菜单"Insert"、"Resource…",在弹出的"Insert Resource"
对话框
中"Dialog"树 里的"IDD_FORMVIEW",点击"New"按钮,生成了一个新的窗体,将其ID号改为"IDD_NEXTFORM"。 在原有的窗体上加一个静态框"这是第一个窗体";在新建的窗体上也
添加
一个静态框"这是第二 个窗体"。 (三) 在菜单资源的"IDR_
MAINFRAME
"上
添加
一级菜单"窗体切换",及其二级菜单"第一个窗 体"、"第二个窗体",其标识号分别为"ID_FIRSTFORM"和"ID_SECONDFORM"。修该"第一个窗体" 的属性为"Checked",表明程序初始时显示的是第一个窗体。 (四) 在"ClassView"属性页里的"SwitchForm classes"上右键,在弹出菜单上选择 "New Class…",弹出"New Class"
对话框
,选择"Dialog ID:"为我们刚
添加
的新窗体 "IDD_NEXTFORM",选择"Base class:"为"CFormView",
类
名取为"CNextFormView",这样就把第 二个窗体对应的视图
类
添加
到了
工程
。 (五) 在框架
类
里
添加
函数SwitchToForm(): void C
MainFrame
::SwitchToForm(int nForm) { file://获取原来的活动窗体的视图句柄 CView* pOldActiveView = GetActiveView(); file://获取由"nForm"标识的窗体所对应的视图句柄 CView* pNewActiveView = (CView*) GetDlgItem(nForm); file://若视图句柄为空,则创建一新的。 if (pNewActiveView == NULL) { if (nForm == IDD_SW99vCHFORM_FORM) pNewActiveView = (CView*)new CSwitchFormView; if (nForm == IDD_NEXTFORM) pNewActiveView = (CView*)new CNextFormView; CCreateContext context; context.m_pCurrentDoc = pOldActiveView->GetDocument(); pNewActiveView->Create(NULL,NULL,0L, CFrameWnd::rectDefault, this,nForm,&context); pNewActiveView->OnInitialUpdate(); } file://选择pNewActiveView为活动窗体 SetActiveView(pNewActiveView); file://显示活动窗体,隐藏非活动窗体 pNewActiveView->ShowWindow(SW_SHOW); pOldActiveView->ShowWindow(SW_HIDE); int ID; if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CSwitchFormView)) ID=IDD_SW99vCHFORM_FORM; if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CNextFormView)) ID=IDD_NEXTFORM; file://设置窗体的ID号 pOldActiveView->SetDlgCtrlID(ID); pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); RecalcLayout(); } (六)
添加
两个菜单相对应的命令响应函数和更新函数如下: void C
MainFrame
::OnFirstform() { file://通过IsKindOf函数确定当前活动窗口是否是第一个窗口,如是,则无须切换, file://否则将通过SwitchToForm函数将当前活动窗口切换到"IDD_SW99vCHFORM_FORM" file://标识的第二个窗体。 if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CSwitchFormView))) return; SwitchToForm(IDD_SW99vCHFORM_FORM); } void C
MainFrame
::OnUpdateFirstform(CCmdUI* pCmdUI) { file://通过IsKindOf函数判断当前活动窗口是否是第一个窗体,如是则将其选中。 pCmdUI->SetCheck(GetActiveView()->IsKindOf(RUNTIME_CLASS(CSwitchFormView))); } void C
MainFrame
::OnSecondform() { if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CNextFormView))) return; SwitchToForm(IDD_NEXTFORM); } void C
MainFrame
::OnUpdateSecondform(CCmdUI* pCmdUI) { pCmdUI->SetCheck(GetActiveView()->IsKindOf(RUNTIME_CLASS(CNextFormView))); } 然后再在该文件开始处
添加
对两个视图
类
的引用: #include "SwitchFormDoc.h" #include "SwitchFormView.h" #include "NextFormView.h" 在此须注意:应在两个视
类
的引用之前
添加
对文档
类
的引用,否则会引起编译错误。另外,由于视
类
的构造函数在声明时都确省的声明为保护型的,在框架
类
中无法引用,所以还要将两个视
类
的
类
声明改动如下: class CNextFormView : public CFormView { public: file://将protected 改为public. CNextFormView(); …… }; class CSwitchFormView : public CFormView { public: file://将protected 改为public. CSwitchFormView(); …… }; 三、 编译运行 编译运行程序,开始时的窗体上有"这是第一个窗体的字样",菜单也只有"第一个窗体"是被选中的, 当前的活动窗体是第一个窗体;点击菜单"第二个窗体",视图中的窗体上的字样变成了"这是第二 个 窗体",同时选中的菜单也由"第一个窗体"变成了"第二个窗体",实现了通过菜单将窗体进行动态切换。 总结:此程序中关键的是SwitchToView函数,在此函数中,程序搜索所有当前文档的显示窗口来查找与CruntimeClass变量匹配的视图
类
。如果找到,该窗口被激活。通过与之
类
似的方法,还可以实现在多文档模式下的单档(文档)多视(视图),通过不同的视图以不同的方式显示来自同一份文档的数据,以更好的满足程序的需要。
VC托盘程序
制作系统托盘程序 VC 点击数:695 发布日期:2006-9-24 12:32:00 【收藏】 【评论】 【打印】 【编程爱好者论坛】 【关闭】 其实,在任务条上
添加
托盘比较容易实现,调用VC中的函数就可以解决,只是注意协调。接下来,我将给大家提供一个
类
,可以很容易的达到我们的目的,希望它能给大家一点帮助,如果你发现BUG也欢迎你和我联系。运行程序,左键双击或者右键单击任务条上的托盘,我们可以看到效果。 1. 有关
类
CsystemTray的说明:(文章的最后有本
类
的具体实现代码) CSystemTray是CObject的扩展
类
,实现以下功能: 1、在任务条显示托盘图标。 2、设置提示Tip 3、设置图标的形状 主要函数说明: Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); 功能: 生成一个图标。 参数说明: pWnd:程序的主窗口, uCallbackMessage:对应的消息映射, szTip:鼠标停留时的提示文字, icon:显示的图标, uID:与之对应的菜单ID · BOOL CSystemTray::SetIcon(HICON hIcon) BOOL CSystemTray::SetIcon(LPCTSTR lpszIconName) BOOL CSystemTray::SetIcon(UINT nIDResource) BOOL CSystemTray::SetStandardIcon(LPCTSTR lpIconName) BOOL CSystemTray::SetStandardIcon(UINT nIDResource) 功能:更改托盘上的图标。 void CSystemTray::ShowIcon() 功能:显示图标。 · BOOL CSystemTray::SetTooltipText(LPCTSTR pszTip) BOOL CSystemTray::SetTooltipText(UINT nID) 功能:提示显示文字。 2. 使用本
类
的步骤如下: 第一步:在VC编程环境下,建立一个
工程
,基于
对话框
或者是单文档(或者是多文档)你随便,所有的选项都取默认值即可。 第二步:在mainfrm.h中定义变量CSystemTray m_TrayIcon;并
添加
函数声明: afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 第三步:在StaAFX.h中定义消息: #define WM_ICON_NOTIFY WM_USER + 1 第四步:自定义菜单IDR_POPUPMENU,其中最少包括一项:ID:ID_VIEW_MAIN_WINDOW,Caption为"显示主窗口",并为该项在
类
C
mainFrame
中
添加
消息映射函数,COMMAND和UPDATE_COMMAND_UI。 第五步:在
Mainframe
.cpp中
添加
以下内容: 1. BEGIN_MESSAGE_MAP(C
MainFrame
, CFrameWnd) ON_COMMAND(ID_VIEW_MAIN_WINDOW, OnViewMainWindow) ON_UPDATE_COMMAND_UI(ID_VIEW_MAIN_WINDOW, OnUpdateViewMainWindow) ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification) ON_WM_SYSCOMMAND() //}}AFX_MSG_MAP END_MESSAGE_MAP() 2. void C
MainFrame
::OnViewMainWindow() { if(IsWindowVisible()) { ShowWindow(SW_SHOWMINIMIZED); ShowWindow(SW_HIDE); m_TrayIcon.SetIcon(IDI_ICON1); } else { ShowWindow(SW_SHOW); ShowWindow(SW_RESTORE); m_TrayIcon.SetIcon(IDI_ICON2); } } void C
MainFrame
::OnUpdateViewMainWindow(CCmdUI* pCmdUI) { pCmdUI->SetCheck(IsWindowVisible()); } 3. int C
MainFrame
::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //创建托盘图标 if (!m_TrayIcon.Create(this, WM_ICON_NOTIFY,"大屏实时显示程序", NULL, IDR_POPUPMENU)) return -1; m_TrayIcon.SetIcon(IDI_ICON1); SetMenu(NULL); return 0; } 4. LRESULT C
MainFrame
::OnTrayNotification(WPARAM wParam, LPARAM lParam) { if (wParam != IDR_POPUPMENU) return 0L; CMenu menu, *pSubMenu; if (LOWORD(lParam) == WM_RBUTTONUP) { CPoint pos; GetCursorPos(&pos;); if (!menu.LoadMenu(IDR_POPUPMENU)) return 0; if (!(pSubMenu=menu.GetSubMenu(0))) return 0; ::SetMenuDefaultItem(pSubMenu->m_hMenu, 3, TRUE); SetForegroundWindow(); pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, this); menu.DestroyMenu(); } else if (LOWORD(lParam) == WM_LBUTTONDBLCLK) { if (!menu.LoadMenu(IDR_POPUPMENU)) return 0; if (!(pSubMenu = menu.GetSubMenu(0))) return 0; SetForegroundWindow(); //激活第2个菜单项 SendMessage(WM_COMMAND, pSubMenu->GetMenuItemID(1), 0); menu.DestroyMenu(); } return 0; } void C
MainFrame
::OnSysCommand(UINT nID, LPARAM lParam) { if(nID==SC_MINIMIZE) { ShowWindow(SW_SHOWMINIMIZED); ShowWindow(SW_HIDE); } else CFrameWnd::OnSysCommand(nID, lParam); } 3. 附录:
类
的实现代码 CsystemTray的头文件 #ifndef _INCLUDED_SYSTEMTRAY_H_ #define _INCLUDED_SYSTEMTRAY_H_ ///////////////////////////////////////////////////////////////////////////// // CSystemTray window class CSystemTray : public CObject { // Construction/destruction public: CSystemTray(); CSystemTray(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); virtual ~CSystemTray(); // Operations public: CFrameWnd * m_pFrame; BOOL Enabled() { return m_bEnabled; } BOOL Visible() { return !m_bHidden; } //Create the tray icon Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); //Change or retrieve the Tooltip text BOOL SetTooltipText(LPCTSTR pszTooltipText); BOOL SetTooltipText(UINT nID); CString GetTooltipText() const; //Change or retrieve the icon displayed BOOL SetIcon(HICON hIcon); BOOL SetIcon(LPCTSTR lpIconName); BOOL SetIcon(UINT nIDResource); BOOL SetStandardIcon(LPCTSTR lpIconName); BOOL SetStandardIcon(UINT nIDResource); HICON GetIcon() const; void HideIcon(); void ShowIcon(); void RemoveIcon(); void MoveToRight(); //Change or retrieve the window to send notification messages to BOOL SetNotificationWnd(CWnd* pNotifyWnd); CWnd* GetNotificationWnd() const; //Default handler for tray notification message // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CSystemTray) //}}AFX_VIRTUAL // Implementation protected: BOOL m_bEnabled; // does O/S support tray icon? BOOL m_bHidden; // Has the icon been hidden? NOTIFYICONDATA m_tnd; DECLARE_DYNAMIC(CSystemTray) }; #endif /////////////////////////////////////////////////// CsystemTray的实现文件 #include "stdafx.h" #include "SystemTray.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC(CSystemTray, CObject) ///////////////////////////////////////////////// // CSystemTray construction/creation/destruction CSystemTray::CSystemTray() { memset(&m_tnd, 0, sizeof(m_tnd)); m_bEnabled = FALSE; m_bHidden = FALSE; } CSystemTray::CSystemTray(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, HICON icon, UINT uID) { Create(pWnd, uCallbackMessage, szToolTip, icon, uID); m_bHidden = FALSE; } BOOL CSystemTray::Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, HICON icon, UINT uID) { // this is only for Windows 95 (or higher) VERIFY(m_bEnabled = ( GetVersion() & 0xff ) >= 4); if (!m_bEnabled) return FALSE; //Make sure Notification window is valid VERIFY(m_bEnabled = (pWnd && ::IsWindow(pWnd->GetSafeHwnd()))); if (!m_bEnabled) return FALSE; //Make sure we avoid conflict with other messages ASSERT(uCallbackMessage >= WM_USER); //Tray only supports tooltip text up to 64 characters ASSERT(_tcslen(szToolTip) <= 64); // load up the NOTIFYICONDATA structure m_tnd.cbSize = sizeof(NOTIFYICONDATA); m_tnd.hWnd = pWnd->GetSafeHwnd(); m_tnd.uID = uID; m_tnd.hIcon = icon; m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; m_tnd.uCallbackMessage = uCallbackMessage; strcpy (m_tnd.szTip, szToolTip); // Set the tray icon m_pFrame = (CFrameWnd*)pWnd; VERIFY(m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd)); return m_bEnabled; } CSystemTray::~CSystemTray() { RemoveIcon(); } ///////////////////////////////////////////// // CSystemTray icon manipulation void CSystemTray::MoveToRight() { HideIcon(); ShowIcon(); } void CSystemTray::RemoveIcon() { if (!m_bEnabled) return; m_tnd.uFlags = 0; Shell_NotifyIcon(NIM_DELETE, &m_tnd); m_bEnabled = FALSE; } void CSystemTray::HideIcon() { if (m_bEnabled && !m_bHidden) { m_tnd.uFlags = NIF_ICON; Shell_NotifyIcon (NIM_DELETE, &m_tnd); m_bHidden = TRUE; } } void CSystemTray::ShowIcon() { if (m_bEnabled && m_bHidden) { m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; Shell_NotifyIcon(NIM_ADD, &m_tnd); m_bHidden = FALSE; } } BOOL CSystemTray::SetIcon(HICON hIcon) { if (!m_bEnabled) return FALSE; m_tnd.uFlags = NIF_ICON; m_tnd.hIcon = hIcon; return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); } BOOL CSystemTray::SetIcon(LPCTSTR lpszIconName) { HICON hIcon = AfxGetApp()->LoadIcon(lpszIconName); return SetIcon(hIcon); } BOOL CSystemTray::SetIcon(UINT nIDResource) { HICON hIcon = AfxGetApp()->LoadIcon(nIDResource); return SetIcon(hIcon); } BOOL CSystemTray::SetStandardIcon(LPCTSTR lpIconName) { HICON hIcon = LoadIcon(NULL, lpIconName); return SetIcon(hIcon); } BOOL CSystemTray::SetStandardIcon(UINT nIDResource) { HICON hIcon = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIDResource)); return SetIcon(hIcon); } HICON CSystemTray::GetIcon() const { HICON hIcon = NULL; if (m_bEnabled) hIcon = m_tnd.hIcon; return hIcon; } ////////////////////////////////////////////////// // CSystemTray tooltip text manipulation BOOL CSystemTray::SetTooltipText(LPCTSTR pszTip) { if (!m_bEnabled) return FALSE; m_tnd.uFlags = NIF_TIP; _tcscpy(m_tnd.szTip, pszTip); return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); } BOOL CSystemTray::SetTooltipText(UINT nID) { CString strText; VERIFY(strText.LoadString(nID)); return SetTooltipText(strText); } CString CSystemTray::GetTooltipText() const { CString strText; if (m_bEnabled) strText = m_tnd.szTip; return strText; } //////////////////////////////////////////////// // CSystemTray notification window stuff BOOL CSystemTray::SetNotificationWnd(CWnd* pWnd) { if (!m_bEnabled) return FALSE; //Make sure Notification window is valid ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd())); m_tnd.hWnd = pWnd->GetSafeHwnd(); m_tnd.uFlags = 0; return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); } CWnd* CSystemTray::GetNotificationWnd() const { return CWnd::FromHandle(m_tnd.hWnd); } 引用地址:http://blog.programfan.com/trackback.asp?id=18739
如何区别MFC是属于单文档,多文档或是
对话框
类
型
的呢?
首先拿到一个不熟悉的MFC源代码,在VS2017中打开,可以通过观察文件资源视图中文件的
类
型
组成来判断。 点击它,出现并打开对应文件名*****.rc,
对话框
类
型
文件资源的一般由四部分组成:Dialog,Icon,String Table,Version. 单文档
类
型
:文件组成一般如下图所示 可以明显看到
对话框
类
型
的资源种
类
较少。 多文档
类
型
资源视图组成如下图所示: 单文档与多文档的资源视图...
MyMFC(7-9)
对话框
C
MainFrame
// MainFrm.cpp : C
MainFrame
类
的实现 // #include "stdafx.h" #include "MyMFC2-Dialog.h" #include "MainFrm.h" #include "Splash.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // C
MainFrame
IMPLEMENT_DYNC
怎样看出一个MFC是基于
对话框
还是多文档或者单文档?
单文档的话只有一个主框架
mainFrame
.h,多文档的话既有主框架也有子框架,即
mainFrame
.h和childFrame.h,这是默认生成名字,可能会被修改,但是一个是一个frame,一个是两个frame不会变 基于
对话框
(3个
类
): CAboutDlg 程序名App 程序名Dlg 单文档(5个
类
): CAboutDlg C
MainFrame
程序名App 程序名Doc 程序名View 多
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章