中易网

MFC如何让图片自动显示到对话框?

答案:2  悬赏:30  
解决时间 2021-04-10 20:28
我在控件上添加了一个透明背景的PNG图片,要点击按钮才能显示,请问如何在程序运行时自动显示出来?还有图片控件灰色的边框可以去掉吗?



最佳答案
添加图片的代码放到OnPaint里面
全部回答
1.定时器 最直观,又是最无奈的一个方法就是使用定时器。既然我们在对话框开始显示之前不能用showwin dow(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; wp.length=sizeof(windowplacement); wp.flags=wpf_restoretomaximized; wp.showcmd=sw_hide; setwindowplacement(&wp); return true; } 在需要显示时(通常是响应热键或者托盘图标的鼠标消息): windowplacement wp; wp.length=sizeof(windowplacement); wp.flags=wpf_restoretomaximized; wp.showcmd=sw_show; setwindowplacement(&wp); 这样的效果很不理想:窗口显示在屏幕的左上角,并且是只有标题栏,要正常显示,还需加上如 下代码: 定义一个成员变量crect rect; 在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; if(i > 0) { i --; showwindow(sw_hide); } else cdialog::onncpaint(); } 这里有个问题:为什么要定义静态变量i而且设其值为2呢? 我们只要窗口隐藏第一次,所以定义这个变量可以判断是否时首次显示窗口。当程序开始运行时 ,系统发送(sendmessage)wm_ncpaint消息,此时程序的窗口边框应该被显示,但是此时我们没 有作任何显示的操作,而是将窗口隐藏,showwindow(sw_hide)将把窗口的ws_visible属性去掉, 继续执行,程序将检查ws_visible属性,如果没有则显示窗口,所以又发送了一个wm_ncpaint消 息。所以我们要处理两次wm_ncpaint消息。 在需要窗口显示时,调用showwindow(sw_show)即可。 程序执行的结果是,原来处于激活状态的窗口可能会闪动两下,然后仍然处于激活状态。这种处 理方式比上面的方式要优越得多。 4.将对话框作为子窗口 这种方法是采用sdi框架,主窗口始终隐藏,对话框作为主窗口的成员变量,在cmainframe::oncr eate()里面加入下代码: 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);即将窗口的扩 展样式改回来。 转载
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
谁能给我找个能观看乌龙院的网址?
深圳市科虹通信有限公司 怎么样啊?发展前景
乾隆生母孝圣宪皇后生前住处是?
君野发艺地址在哪,我要去那里办事
成都市西玉龙街骑车前往高新孵化园线路
关于友情的日记怎么写,要忘年之交。
The road is the shortest one and it ______
恒高重机地址有知道的么?有点事想过去
希捷硬盘读盘问题
编程与未来测量的工作
杭州山水四年级作文仿写桂林山水
怎么样才能把英语学好
慈溪市长河中心卫生院母婴整理室地址在什么地
山木培训怎么样 真的很垃圾吗 我在应聘他们的
刀剑乱舞一直小黑屏
推荐资讯
惠州白沙油站这个地址在什么地方,我要处理点
正坤水电怎么去啊,有知道地址的么
估计您是高手,请问您能给我详细的说一下混合
qq飞车好多级点亮?
男生亲女生眼睛有什么意义么
为什么真空包装的事物过期时会膨胀
我的穿越火线的图标怎么点不亮啊??
DNF剑魂如何连招?
无聊的时候要做些什么
我房子加现老婆名字,老婆名下有套门面房,加名
馨妃尔国际美容养生会所会理NO.2在哪里啊,我
成长路上无捷径 零分作文
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?