MFCmfc 打开文件对话框打不开

MFC对话框完全不显示技术
MFC_对话框程序隐藏启动
想让对话框程序隐藏启动,然后需要时又可以显示。
刚开始我也想到在OnInitDialog()中加上ShowWindow(SW_HIDE),其实这样是不行的,不信自己去试验
找了网上的方法,都没有满足我的要求,自己总结了一个比较满意的方法。
定义一个bool b_//决定是否隐藏
b_show=//默认隐藏
可以在对话框中重载虚函数DefWindowProc()。
LRESULT CTest2Dlg::DefWindowProc(UINT message, WPARAM wParam,
LPARAM lParam)
if(message==133 )
if(b_show==false)
ShowWindow(SW_HIDE);
&& ShowWindow(SW_SHOW);
return CDialog::DefWindowProc(message, wParam, lParam);
程序中想还原显示的时候可以
this-&ShowWindow(SW_SHOW);
//-------------------------------------网上的相关资料-----------------------------------------------------------------------//
对于这类问题,大家最容易想到的可能就是在PreCreateWindow中添加cs.style
&=~WS_VISIBLE;这是不可行的。程序仍可使用ShowWindow()将窗体显示出来.
1.基于对话框的程序
我在论坛上看到有人说在OnInitDialog()中加上ShowWindow(SW_HIDE)对话框便不出现了,其实是不可行的。至于原因,我认为是系统是在OnInitDialog()后调用ShowWindow(SW_SHOW)让对话框显示的.可以添加下面代码:
CXXDlg::OnInitDialog()
Sleep(5000);
return TRUE;
可以发现5秒后对话框才显示出来.至于在何时调用的我也不清楚,但是我们可以在OnPaint()中加上ShowWindow(SW_HIDE),来达到隐藏的目的.不过使用的这种方法,会有一点闪烁.另外一种方法就是在OnInitDialog()中使用SetWindowPlacement()
GetWindowPlacement(&m_wp);
//恢复时用
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);//从任务栏中去掉.
WINDOWPLACEMENT
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
还有一种更简单的方法:在OnInitDialog()中调用下面代码.
SetWindowPos(&wndTop,0,0,0,0,NULL);
2.基于单文档的程序
我们一般采用的方法就是将InitInstance()中的:
CXXApp::InitInstance()
//m_pMainWnd-&ShowWindow(SW_SHOW);
但是这样窗体还会有闪烁。
因为MFC还要在ActiveFrame显示框架,所以我们还需要添加下面代码:
void CMainFrame::ActivateFrame(int nCmdShow)
&& nCmdShow=SW_HIDE;
CFrameWnd::ActivateFrame(nCmdShow);
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
AfxGetApp()-&m_nCmdShow=SW_HIDE;
顺便说一下,上面通过ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW)的方法来实现从任务栏去掉按钮,这样当显示时还要切换显示的模式,其实还可以通过调用TaskbarList组件直接删除和添加:
ITaskbarList的定义在shobjidl.h(vs.net)中。
也可以手动定义:
DECLARE_INTERFACE_(ITaskbarList,IUnknown)
STDMETHOD(QueryInterface)(THIS_ REFIID riid,LPVOID* ppvObj)
&& STDMETHOD_(ULONG,AddRef)(THIS)
STDMETHOD_(ULONG,Release)(THIS) PURE;
&& STDMETHOD(ActivateTab)(HWND)
&& STDMETHOD(AddTab)(HWND)
&& STDMETHOD(DeleteTab)(HWND)
&& STDMETHOD(HrInit)(void)
BOOL CMy2App::InitInstance()
&& CoInitialize(0);
&& ITaskbarList *pO
CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList,(void**)&pObj);
pObj-&DeleteTab(m_pMainWnd-&m_hWnd);
//从任务栏上删除
//pObj-&AddTab(m_pMainWnd-&m_hWnd);
pObj-&Release();
&& CoUninitialize();
所以我们还可以用将窗体最小化,并从任备栏上删除按钮的方法来实现隐藏.
有很多应用程序要求一起动就隐藏起来,这些程序多作为后台程序运行,希望不影响其他窗口,往往只在托盘区显示一个图标。这些程序通常都是对话框程序,而对话框在初始化的过程上与SDI、MDI的初始化是不同的,对话框只需要DoModule或者是CreateDialog等等对话框函数调用一次便可,SDI、MDI则要好几步才行。这样看来,对话框在使用方法上面是隐藏了不少细节的,其中就没有SDI、MDI所要求的ShowWindow(nCmdShow)这一步。因此对话框要想一运行就隐藏,并不是很直接的。有一些方法可以做到这一点,下面我们就来看看几种方案。
最直观,又是最无奈的一个方法就是使用定时器。既然我们在对话框开始显示之前不能用ShowWindow(SW_HIDE)将其隐藏,那就给一个时间让它显示,完了我们在隐藏它。
1.在OnInitDialog()函数里设置定时器:(WINDOWS API里面响应消息WM_INITDIALOG)
SetTimer(1, 1, NULL);
2.添加处理WM_TIMER的消息处理函数OnTimer,添加代码:
if(nIDEvent == 1)
DeleteTimer(1);
ShowWindow(SW_HIDE);
这种方法的缺点是显而易见的,使用定时器,使得程序的稳定性似乎打一个折扣;窗口是要先显示出来的,那么效果就是窗口闪了一下消失。
2.改变对话框显示状况
在对话框初始化时改变其显示属性可以让它隐藏起来。方法是调用SetWindowPlacement函数:
BOOL CDialogExDlg::OnInitDialog()
CDialog::OnInitDialog();
//DO something
WINDOWPLACEMENT
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
return TRUE;
在需要显示时(通常是响应热键或者托盘图标的鼠标消息):
WINDOWPLACEMENT
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_SHOW;
SetWindowPlacement(&wp);
这样的效果很不理想:窗口显示在屏幕的左上角,并且是只有标题栏,要正常显示,还需加上如下代码:
定义一个成员变量CR
在OnInitDialog()里面:
GetWindowRect(&rect);
在需要显示的地方:
SetWindowPos(&wndNoTopMost, wndRc.left, wndRc.top,
wndRc.right, wndRc.bottom, SWP_SHOWWINDOW);
CenterWindow();
即使这样,效果还是很差。
这种方法还有一个弊端是当程序开始运行并且隐藏起来后,原来激活的窗口变成了非激活状态了,而当对话框显示出来后,对话框自身也是非激活状态的。
3.不绘制窗口
当对话框显示时将要响应消息WM_PAINT绘制客户区,相应消息WM_NCPAINT绘制窗口边框。我们在窗口第一次自绘自身时隐藏窗口,可以收到比较良好的效果。由于窗口是先画窗口边框,所以我们仅需处理WM_NCPAINT即可。代码如下:
添加WM_NCPAINT处理函数。
void CMyDialog::OnNcPaint()
static int i = 2;
ShowWindow(SW_HIDE);
CDialog::OnNcPaint();
这里有个问题:为什么要定义静态变量i而且设其值为2呢?
我们只要窗口隐藏第一次,所以定义这个变量可以判断是否时首次显示窗口。当程序开始运行时,系统发送(SendMessage)WM_NCPAINT消息,此时程序的窗口边框应该被显示,但是此时我们没有作任何显示的操作,而是将窗口隐藏,ShowWindow(SW_HIDE)将把窗口的WS_VISIBLE属性去掉,继续执行,程序将检查WS_VISIBLE属性,如果没有则显示窗口,所以又发送了一个WM_NCPAINT消息。所以我们要处理两次WM_NCPAINT消息。
在需要窗口显示时,调用ShowWindow(SW_SHOW)即可。
程序执行的结果是,原来处于激活状态的窗口可能会闪动两下,然后仍然处于激活状态。这种处理方式比上面的方式要优越得多。
4.将对话框作为子窗口
这种方法是采用SDI框架,主窗口始终隐藏,对话框作为主窗口的成员变量,在CMainFrame::OnCreate()里面加入下代码:
if(!dlg.Create(IDD_MYDIALOG, this))
return &1;
dlg.ShowWindow(SW_HIDE);
在要显示对话框的地方用dlg.ShowWindow(SW_SHOW);即可。注意,主窗口一定要隐藏,否则对话框可能会闪现一下。
隐藏状态栏窗口
上面介绍了几种检查对话框的方法,大家如果试过的话可能已经注意到系统状态栏里在程序启动时会有程序的图标闪过,在隐藏对话框的时候这个也是要隐藏的,方法很简单:
在OnInitDialog()函数里面加上ModifyStyleEx(WS_EX_APPWINDOW,
WS_EX_TOOLWINDOW);即可。在要显示窗口的地方加上代码ModifyStyleEx(WS_EX_TOOLWINDOW,
WS_EX_APPWINDOW);即将窗口的扩展样式改回来。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
CAD文件打开及保存不显示对话框的解决方法
下载积分:30
内容提示:CAD文件打开及保存不显示对话框的解决方法
文档格式:PDF|
浏览次数:143|
上传日期: 00:44:28|
文档星级:
该用户还上传了这些文档
CAD文件打开及保存不显示对话框的解决方法
官方公共微信MFC 资源视图 .rc中的Dialog里面的对话框打不开_Java123社区微信号:java123msg |||[][]当前位置: &
& MFC 资源视图 .rc中的Dialog里面的对话框打不开我现在用的是VS2010 现在的情况是,如题,不仅仅是打不开,而是不能打开,每次双击的时候,整个VS2010就立刻关闭了,没有任何提示。 不止这一个程序是这样。 我重新创建一个空的M我现在用的是VS2010现在的情况是,如题,不仅仅是打不开,而是不能打开,每次双击的时候,整个VS2010就立刻关闭了,没有任何提示。不止这一个程序是这样。我重新创建一个空的MFC程序,在打开Dialog时也是这样的情况。电脑重启了还是不行。有哪位同志也遇到过这种情况吗?你们是怎么解决的?现在很急呀谢谢啦
顶一下(0)0%踩一下(0)0%------分隔线------上一篇: 下一篇: 栏目列表推荐内容我下了个skin++2.1破解版,可以正常使用,成功换了皮肤,但是是...MFC对话框实例
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
实验5_2:MFC调用输入对话框并返回输入信息
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口MFC对话框部份的打不开
[问题点数:60分,结帖人JonesVale]
MFC对话框部份的打不开
[问题点数:60分,结帖人JonesVale]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
2012年4月 VC/MFC大版内专家分月排行榜第一
2012年5月 VC/MFC大版内专家分月排行榜第二2012年3月 VC/MFC大版内专家分月排行榜第二2011年7月 VC/MFC大版内专家分月排行榜第二2011年1月 VC/MFC大版内专家分月排行榜第二2010年12月 VC/MFC大版内专家分月排行榜第二2010年9月 VC/MFC大版内专家分月排行榜第二2010年6月 VC/MFC大版内专家分月排行榜第二2010年5月 VC/MFC大版内专家分月排行榜第二2010年4月 VC/MFC大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 mfc 打开文件对话框 的文章

 

随机推荐