c 新手程序 关于VS2010 MFC 程序启动时隐藏主窗口要先闪一下的问题...

VS2010调试窗口一闪而过解决方法 - 博客家园II - 博客园
汇集百家之所长、
这几天将开发集成环境换成了vs2010,刚开始用,有些地方不是很懂,通过查阅相关文档,现得以解决。
就拿VS2010 调试窗口一闪而过解决方法如下:
#include&&iostream&&&
using&namespace&&&
void&main()&&
&{&&&&&int&add(int,int,int);&&
&&&&&&&float&average(int);&&
&&&&&&&int&x,y,z,&&&&&&&&
&&&&&&&cout&&&"Input&x,&y,&z:";&&
&&&&&&&cin&&x&&y&&z;&&
&&&&&&&sum=add(x,&y,&z);&&
&&&&&&&cout&&"sum="&&sum&&&&
&&&&&&&cout&&"average="&&average(sum)&&&&&
int&add&(int&a,&int&b,&int&c)&&
&&return&(a+b+c);&&&&&
float&average&(int&s)&&
&&&return&&(s/3.0);&&&
以上是测试代码。
解决方法如下:
若此时进行的操作是编译(F5),可先运行程序(Ctrl+F5),若仍然一闪而过,用下面方法解决。方法一:1.若是C++文件,在程序最后写一句(return之前)添加:system("pause");2.若是C文件,首先在程序头添加头文件:#include"stdlib.h";然后在程序最后写一句(return之前)添加:system("pause")。方法二:1.右键单击当前工程-属性&2.选择配置属性-链接器-系统&3.更改系统选项中的&子系统&配置,选择下拉菜单的第一个&控制台 (/SUBSYSTEM:CONSOLE)&然后选择"开始执行(不调试)",也就是ctrl+F5;
这样即可一劳永逸解决窗口一闪而过这个问题。MFC中基于对话框的程序启动后自动隐藏
增加消息onNCPaint
加入代码ShowWindow(FALSE);
转]MFC中基于对话框的程序启动后自动隐藏( 12:50:56)
本文简单介绍一下VC中基于对话框的程序启动后的自动隐藏技术。
有的程序需要在启动后立即隐藏主窗口,只在系统托盘区域显示一个图标,这常见于很多后台服务程序。对于基于对话框的程序,要实现此功能需要一点技巧。
该技术的关键点在于,需要使用非模态对话框,而不是默认的模态对话框。模态对话框的DoModal()事实上执行了对话框的创建、显示、消息循环等一系列过程。我们这里要做的就是把这个过程重现,并控制中间的显示过程来达到我们隐藏主窗口的目的。现实起来非常简单,我们只需要把CXXXApp中的InitInstance()函数中默认的对话框显示代码:
BOOL CXXXApp::InitInstance()
// 其它代码
// 主窗口对话框实例
m_pMainWnd = &
// 模态对话框
dlg.DoModal();
return FALSE;
改变为如下代码即可,其它地方的代码完全不用修改:
BOOL CXXXApp::InitInstance()
// 其它代码
// 主窗口对话框实例
m_pMainWnd = &
// 非模态对话框
dlg.Create(CXXXDlg::IDD);
dlg.DoSomethingBeforeMsgLoop(); // 可以在此函数隐藏窗口及执行其它操作
dlg.RunModalLoop();
return FALSE;
在上面的代码中,可以在DoSomethingBeforeMsgLoop()函数中使用ShowWindow()来隐藏窗口,同时还可以执行其它一些操作,也可以直接在DoSomethingBeforeMsgLoop()函数调用处调用ShowWindow()函数来隐藏窗口。
也有人提出了其它方法。比如仍然使用模态对话框,但使用计数器设定很短一个时间来触发事件,并在处理该计数器事件中隐藏窗口。该方法可行,但太麻烦,没有上面的方法方便。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在VC++中,想实现将MFC最小化到系统托盘,需要调用NOTIFYICONDATA类,并注册相应的消息,以下详细讲解如何实现:
&&& 第一步,声明一个NOTIFYICONDATA类,也就是NOTIFYICONDATA NotifyI该句可以放在Dlg类的声明中,作为Dlg类的一个成员;也可以放在Dlg类的实现中,作为全局变量来使用。
&&& 第二步,声明一个响应函数afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam);用于响应鼠标操作。将这个函数放入Dlg类的声明中,作为Dlg类的一个成员。
&&& 第三步,定义消息名称以消息号,并注册消息,该步很重要!我就是因为没有注册消息,导致调试了很久都找不到问题所在。该步都是在Dlg.cpp(Dlg的实现中)中操作。定义消息名称和消息号:#define WM_NC (WM_USER+1001),1001只是用于指定一个消息号,可以随便指定。注册则是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之间添加ON_MESSAGE(WM_NC,OnNotifyIcon)。
&&& 第四步,在要将MFC最小化到系统托盘的函数中添加如下代码:
&&& NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
&&& NotifyIcon.hIcon=AfxGetApp()-&LoadIcon(IDR_MAINFRAME);
&&& NotifyIcon.hWnd=m_hW
&&& lstrcpy(NotifyIcon.szTip,&NotifyIcon Test&);
&&& NotifyIcon.uCallbackMessage=WM_NC;
&&& NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
&&& Shell_NotifyIcon(NIM_ADD,&NotifyIcon);
&&& 有了上面的代码,当程序运行到含有如上代码的函数时就会在系统托盘处添加一个图标,想隐藏主对话框,就再添加一句ShowWindow(SW_HIDE);这样就实现了将MFC最小化到系统托盘。但还要添加点击托盘图标时响应鼠标的函数,也就是第二步中的函数OnNotifyIcon。
&&& 第五步,OnNotifyIcon函数,如下:
void CDlg::OnNotifyIcon(WPARAM wParam,LPARAM IParam)
&&&&&&&& if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))
&&&&&&&& {&
&&&&&&&&&&&&& ModifyStyleEx(0,WS_EX_TOPMOST);
&&&&&&&&&&&&& ShowWindow(SW_SHOW);
&&&&&&&&&&&&& //Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);
&&&&&&&& }
&&& 以上函数写的很简单,因为我定义的是基于对话框的MFC,没有添加menu,所以只是实现了简单的点击托盘图标就弹出主对话框。对于右键点击托盘图标弹出小menu,然后选择操作,最好是建立工程的时候就选择基于菜单的MFC,这样会容易很多,详细的我自己还没有研究,就不乱讲了。对于上面函数中Shell_NotifyIcon(NIM_DELETE,&NotifyIcon)一句,是清除托盘图标,在这里可以没有,但在退出整个程序的时候一定要加上,不然程序退出了,托盘处还有一个图标,只有鼠标指到那里时系统才会发现是进程残留而清除,这种做法很不好!
怎么能在最小化到系统托盘之前,将对话框隐藏。
关于隐藏对话框,我参考了上的不绘制窗口方法,具体方法如下:
&&& 第一步,声明一个响应函数afx_msg void OnNcPaint();用于阻止绘制对话框操作。将这个函数放入Dlg类的声明中,作为Dlg类的一个成员。
&&& 第二步,注册消息WM_NCPAINT(),也就是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之间添加ON_WM_NCPAINT()。
&&& 第三步,OnNcPaint函数代码如下:
&&& void CMyDialog::OnNcPaint()
&&&&&&& static int i = 2;
&&&&&&& if(i & 0)
&&&&&&&&&&& i --;
&&&&&&&&&&& ShowWindow(SW_HIDE);
&&&&&&& else
&&&&&&&&&&& CDialog::OnNcPaint();
&&& OnNcPaint函数解释:程序的需求是只要窗口在初始运行时隐藏,所以定义static int i = 2;
变量可以判断是否是首次显示窗口。之所以定义为2,是因为当程序开始运行时,系统发送(SendMessage)ON_WM_NCPAINT消息,此时程序的窗口边框应该被显示,但是此时我们没有作任何显示的操作,而是将窗口隐藏,ShowWindow(SW_HIDE)将把窗口的WS_VISIBLE属性去掉,继续执行,程序将检查WS_VISIBLE属性,如果没有则显示窗口,所以又发送了一个ON_WM_NCPAINT消息。所以我们要处理两次ON_WM_NCPAINT消息。其次,也可以定义static
int i = 1;如果将i定义为1,则必须把窗口的Visible属性去掉,也就是在窗口上右键点击属性,选择More Styles,将Visible前面的勾去掉。
&&& 有了以上三步就可以实现对话框隐藏,但在程序启动的时候,系统状态栏里会有程序的图标闪一下,这就需要再做一些工作:
&&& 第一,在OnInitDialog()函数中添加ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);使对话框不在系统任务栏中显示。
&&& 第二,在需要对话框显示的程序中添加ModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);使对话框显示在系统任务栏中.
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:51735次
排名:千里之外
转载:83篇
(5)(2)(2)(3)(4)(10)(5)(8)(1)(18)(2)(1)(4)(8)(9)(3)拒绝访问 | www.1398.org | 百度云加速
请打开cookies.
此网站 (www.1398.org) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(4388-ua98).
重新安装浏览器,或使用别的浏览器欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 9711 人关注过本帖
标题:为什么我的 VS2010 编译运行了窗口直接一闪而过
等 级:新手上路
结帖率:50%
&&问题点数:0&&回复次数:9&&&
为什么我的 VS2010 编译运行了窗口直接一闪而过
可不可以不用加入函数getchar()是不是里面哪里设置除了问题
等 级:论坛游民
帖 子:12
专家分:10
别选 运行。。
等 级:新手上路
我半年前也是下载了个vs2010学c,也是这样
后来求助别人说在后面加个
getch(0);
来着,你试试吧
等 级:论坛游民
专家分:10
getchar();
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3505
专家分:11329
等 级:新手上路
帖 子:53
右键选生成。。别f5
来 自:江西省赣州市于都县
等 级:业余侠客
帖 子:119
专家分:233
直接一点,按下F5就自动调试代码
等 级:新手上路
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
不想用getchar()就加一段死循环代码咯~
授人以渔,不授人以鱼。
来 自:陕西
等 级:业余侠客
帖 子:113
专家分:229
如果想执行的话就加getchar()或getch();
你可以测测这两个函数,getchar()
你输入一个字符时会显示输入的那个字符
不会显示你输入的那个字符,这个函数你也可以用在要输入密码的地方。因为你输入啥不会在屏幕上显示。
所以可以输入一个字符,输出一个*这样你输入的密码就会是*********
版权所有,并保留所有权利。
Powered by , Processed in 0.044700 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved}

我要回帖

更多关于 微信小程序新手 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信