一个程序里可不可以有两个Frame(由打印引出的问题)

时间:2022-10-05 08:33:26
我现在在一个现有的程序上附加功能,全以菜单中弹出对话框的方式。由于在新的功能中需要打印,而原来的程序已经具有了打印功能(两种需求不一样),所以参照网上的基于对话框的程序的打印实现方法,我在程序中又加了一个CPrintFrmae类,结果出现了如下错误:
如果在cpp中和h文件中存在IMPLEMENT_DYNCREATE(CPrintFrame, CFrameWnd)、DECLARE_DYNCREATE(CPrintFrame)两句,编译就提示我找不到合适的类的构造函数,原因是我在类的构造函数中代入了参数,形如:
.h文件
class CPrintFrame : public CFrameWnd
{
protected:

// Attributes
public:
DECLARE_DYNCREATE(CPrintFrame)
CPrintFrame(DRAWFUN pDraw,CWnd*pOldW,CWnd* pCallW,BOOL bDirect,LPCTSTR stTitle);
virtual ~CPrintFrame();
...
};

.cpp文件
IMPLEMENT_DYNCREATE(CPrintFrame, CFrameWnd)

CPrintFrame::CPrintFrame(DRAWFUN pDraw,CWnd*pOldW,CWnd* pCallW,BOOL bDirect,LPCTSTR stTitle)
{
...
}
如果把两句注释掉编译通过,但运行时存在如下问题:
在打印预览时点击“关闭”按钮一切正常,如果是点击CPrintFrame上的"X"按钮(关闭),结果Frame就不会关闭,好像是死机了一样,CPrintFrame白屏,再次点击一次,结果整个程序退出了。跟踪显示点击预览里的“关闭”按钮,程序会进入CPrintFrame的析构函数,但点击"X"程序进入不了析构函数,第二次才进入。在CPrintFrame里加了一个OnClose()函数,第一次能进入OnClose()函数.
想问一下一个程序中能不能同时存在两个Frame,而且Frame中的那个X和关闭有什么不同?
不知道我表述清楚了没有~~~~~

10 个解决方案

#1


可以的,我以前程序中就在View中另开了一个Frame来显示图片

下面是我的创建并显示新frame的代码,希望对你有所帮助

// 新建并打开图片浏览窗口
CRuntimeClass * pRtclass = RUNTIME_CLASS(CGraphViewerFrame);
CGraphViewerFrame * pGraphFrame = (CGraphViewerFrame *)pRtclass->CreateObject();
_ASSERT(pGraphFrame->IsKindOf(RUNTIME_CLASS(CGraphViewerFrame)));
//pGraphFrame->Create(NULL, _T("Window Name"), WS_OVERLAPPEDWINDOW, rectDefault, this);
VERIFY(pGraphFrame->LoadFrame(IDR_GRAPHVIEWER));
pGraphFrame->ShowWindow(SW_SHOW);

#2


注意:IMPLEMENT_DYNCREATE(CPrintFrame, CFrameWnd)、DECLARE_DYNCREATE(CPrintFrame)两句不能去掉

#3


参考:http://www.vckbase.com/document/viewdoc/?id=691
这个例子可能对你有启发

#4


Semigod():
         CRuntimeClass * pRtclass = RUNTIME_CLASS(CGraphViewerFrame);
CGraphViewerFrame * pGraphFrame = (CGraphViewerFrame *)pRtclass->CreateObject();
怎么用的?我的因为在析构函数里带入了参数,所以不能用CreateObject()的吧?还有你那句VERIFY(pGraphFrame->LoadFrame(IDR_GRAPHVIEWER));
怎么会有个IDR_GRAPHVIEWER资源和它关联呢?
我又看了一下,例子用的不是DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE,改成了DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC,编译通过了,但问题还是存在,就是点击窗口上的最大化后的“X”关闭存在问题,象是死机的状态(白屏,Frame的蓝条存在),再一次,程序退出。

#5


vcleaner:
谢谢不做大哥的大哥的帮助,呵呵
这个例子和我的情况不太一样 :)

#6


就象Mainframe一样,那个frame窗口也要有很多资源啊,比如工具条,菜单什么的

#7


哦,我的不需要 :)
自己在顶。。。

#8


再UP
谁知道CJJFrameWnd是什么类呀?编译时提示我不能从一个静态的CJJFrameWnd类转化为一个静态的CFrameWnd类。可是我没声明定义什么CJJFrameWnd类呀。注释掉那句话就编译通过了,但关闭时出问题,那个语句是个回掉函数,处理关闭的。

#9


gz

#10


是CCJFramWnd类。
问题没解决,绕过去了,我把Frame上面的叉叉去掉了,现在只有个蓝条儿,只能点击关闭退出。

#1


可以的,我以前程序中就在View中另开了一个Frame来显示图片

下面是我的创建并显示新frame的代码,希望对你有所帮助

// 新建并打开图片浏览窗口
CRuntimeClass * pRtclass = RUNTIME_CLASS(CGraphViewerFrame);
CGraphViewerFrame * pGraphFrame = (CGraphViewerFrame *)pRtclass->CreateObject();
_ASSERT(pGraphFrame->IsKindOf(RUNTIME_CLASS(CGraphViewerFrame)));
//pGraphFrame->Create(NULL, _T("Window Name"), WS_OVERLAPPEDWINDOW, rectDefault, this);
VERIFY(pGraphFrame->LoadFrame(IDR_GRAPHVIEWER));
pGraphFrame->ShowWindow(SW_SHOW);

#2


注意:IMPLEMENT_DYNCREATE(CPrintFrame, CFrameWnd)、DECLARE_DYNCREATE(CPrintFrame)两句不能去掉

#3


参考:http://www.vckbase.com/document/viewdoc/?id=691
这个例子可能对你有启发

#4


Semigod():
         CRuntimeClass * pRtclass = RUNTIME_CLASS(CGraphViewerFrame);
CGraphViewerFrame * pGraphFrame = (CGraphViewerFrame *)pRtclass->CreateObject();
怎么用的?我的因为在析构函数里带入了参数,所以不能用CreateObject()的吧?还有你那句VERIFY(pGraphFrame->LoadFrame(IDR_GRAPHVIEWER));
怎么会有个IDR_GRAPHVIEWER资源和它关联呢?
我又看了一下,例子用的不是DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE,改成了DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC,编译通过了,但问题还是存在,就是点击窗口上的最大化后的“X”关闭存在问题,象是死机的状态(白屏,Frame的蓝条存在),再一次,程序退出。

#5


vcleaner:
谢谢不做大哥的大哥的帮助,呵呵
这个例子和我的情况不太一样 :)

#6


就象Mainframe一样,那个frame窗口也要有很多资源啊,比如工具条,菜单什么的

#7


哦,我的不需要 :)
自己在顶。。。

#8


再UP
谁知道CJJFrameWnd是什么类呀?编译时提示我不能从一个静态的CJJFrameWnd类转化为一个静态的CFrameWnd类。可是我没声明定义什么CJJFrameWnd类呀。注释掉那句话就编译通过了,但关闭时出问题,那个语句是个回掉函数,处理关闭的。

#9


gz

#10


是CCJFramWnd类。
问题没解决,绕过去了,我把Frame上面的叉叉去掉了,现在只有个蓝条儿,只能点击关闭退出。