社区
界面
帖子详情
如何在ATL对话框中显示背景图片
shanhe
2004-04-07 04:01:48
我写了一个ATL对话框,在OnEraseBkgnd将位图bitblt,但是发觉是错误的,无法顺利显示位图。
希望那位实现了通过API截取dialog的画图类消息更换背景能够指点一下。
谢谢
...全文
272
8
打赏
收藏
如何在ATL对话框中显示背景图片
我写了一个ATL对话框,在OnEraseBkgnd将位图bitblt,但是发觉是错误的,无法顺利显示位图。 希望那位实现了通过API截取dialog的画图类消息更换背景能够指点一下。 谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
itmaster
2004-04-09
打赏
举报
回复
如何设置窗口背景图
问题是这样产生的.在OnEraseBkGnd中,如果你不调用原来缺省
的OnEraseBkGnd只是重画背景则不会有闪烁.而在OnPaint里面,
由于它隐含的调用了OnEraseBkGnd,而你又没有处理OnEraseBkGnd
函数,这时就和窗口缺省的背景刷相关了.缺省的
OnEraseBkGnd操作使用窗口的缺省背景刷刷新背景(一般情况
下是白刷),而随后你又自己重画背景造成屏幕闪动.
另外一个问题是OnEraseBkGnd不是每次都会被调用的.如果你
调用Invalidate的时候参数为TRUE,那么在OnPaint里面隐含
调用BeginPaint的时候就产生WM_ERASEBKGND消息,如果参数
是FALSE,则不会重刷背景.
所以解决方法有三个半:
1.用OnEraseBkGnd实现,不要调用原来的OnEraseBkGnd函数.
2.用OnPaint实现,同时重载OnEraseBkGnd,其中直接返回.
3.用OnPaint实现,创建窗口时设置背景刷为空
4.用OnPaint实现,但是要求刷新时用Invalidate(FALSE)这样
的函数.(不过这种情况下,窗口覆盖等造成的刷新还是要闪一
下,所以不是彻底的解决方法)
都挺简单的.
itmaster
2004-04-09
打赏
举报
回复
http://www0.ccidnet.com/tech/guide/2000/07/20/58_980.html
Semigod
2004-04-09
打赏
举报
回复
下面是我以前写的两个Mixed-in 类,很好用,你可以试试
#pragma once
#include <atlcrack.h>
template <class T, COLORREF t_crBrushColor>
class CCustomDrawDlg : public CMessageMap
{
public:
CCustomDrawDlg()
{
m_hbrBkgnd = CreateSolidBrush(t_crBrushColor);
}
~CCustomDrawDlg()
{
DeleteObject ( m_hbrBkgnd );
}
BEGIN_MSG_MAP_EX(CCustomDrawDlg)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
END_MSG_MAP()
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
T* pT = static_cast<T*>(this);
HDC dc = (HDC) wParam;
CRect rcClient;
pT->GetClientRect ( &rcClient );
FillRect ( dc, &rcClient, m_hbrBkgnd );
return 1; // we painted the background
}
protected:
HBRUSH m_hbrBkgnd;
};
template <class T, UINT nBmpResourceId>
class CBmpBackground : public CMessageMap
{
public:
CBmpBackground()
{
m_hBkImage = LoadBitmap(_Module.m_hInstResource, MAKEINTRESOURCE(nBmpResourceId));
}
~CBmpBackground()
{
DeleteObject ( m_hBkImage );
}
BEGIN_MSG_MAP_EX(nBmpResourceId)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
END_MSG_MAP()
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
T* pT = static_cast<T*>(this);
HDC dc = (HDC) wParam;
CRect rcClient;
pT->GetClientRect ( &rcClient );
HDC hMemDC = CreateCompatibleDC(dc);
BITMAP bitMap;
GetObject(m_hBkImage, sizeof(BITMAP), (LPSTR)&bitMap);
HGDIOBJ hOldObj = SelectObject(hMemDC, m_hBkImage);
StretchBlt(dc, 0,0, rcClient.Width(), rcClient.Height(), hMemDC ,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
SelectObject(hMemDC, hOldObj);
return 1; // we painted the background
}
protected:
HBITMAP m_hBkImage;
};
shanhe
2004-04-09
打赏
举报
回复
好,我测试后告诉大家
xuanzg
2004-04-08
打赏
举报
回复
用gdi+的image很容易。
shanhe
2004-04-08
打赏
举报
回复
我应注意了,但发现将一个bmp载入DC后,不一定能够正常现实
zhujianping_es
2004-04-07
打赏
举报
回复
OnEraseBkgnd是可以的!
主意返回值是 TRUE等非零值,以防止画上去的被Erase啦!
shanhe
2004-04-07
打赏
举报
回复
up
MFC
中
打开图片 能运行
在MFC(Microsoft Foundation Classes)框架
中
,
显示
图片是一项常见的任务,尤其对于开发图形用户界面的应用程序来说。本文将深入探讨如何在MFC应用
中
加载并
显示
图片,并以VS2010为开发环境,适合初学者入门学习。 ...
MFC图片浏览器
CImage是MFC扩展库
ATL
中
提供的一个类,可以直接加载、
显示
和操作多种格式的图片。GDI+是Windows图形设备接口的一个增强版本,支持更丰富的图形操作。 ### 4. 文件I/O操作 为了读取图片文件,MFC图片浏览器需要使用...
100实例(c++)
14 窗口
显示
为
显示
背景图 15 奇妙的三维文字按钮 16 彩色按钮的实现 17 计算器 18 使用DIB制作动画按钮 19 Winamp样式的自动停靠
对话框
20 在
对话框
中
预览位图 21 文字的特殊
显示
效果 22 动画字体 23 旋转文本 24 渐...
用C++做的五个MFC工程文件
MFC的CView类是窗口
中
显示
数据的主要组件,开发者可能扩展了这个类来实现背景图像的加载和
显示
。同时,可能还提供了用户交互功能,如拖放图片、选择颜色或图案等功能。 5. **通讯簿** 最后一个工程是一个通讯录...
多媒体教室
在全屏接收屏幕广播时,如果教师未锁定学生机键盘鼠标,学生就可以在屏幕广播窗口上点击鼠标右键,在图所示的弹出菜单
中
除去全屏
显示
选项后即变为窗口方式接收广播。 学生在此模式下可以选择智能滚动、自由滚动、...
界面
15,980
社区成员
115,867
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章