社区
界面
帖子详情
如何在ATL对话框中显示背景图片
shanhe
2004-04-07 04:01:48
我写了一个ATL对话框,在OnEraseBkgnd将位图bitblt,但是发觉是错误的,无法顺利显示位图。
希望那位实现了通过API截取dialog的画图类消息更换背景能够指点一下。
谢谢
...全文
333
8
打赏
收藏
如何在ATL对话框中显示背景图片
我写了一个ATL对话框,在OnEraseBkgnd将位图bitblt,但是发觉是错误的,无法顺利显示位图。 希望那位实现了通过API截取dialog的画图类消息更换背景能够指点一下。 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
WTL
对话框
添加
背景图片
本文介绍如何在WTL应用程序
中
使用GDI+进行绘图操作,包括
对话框
类的定义、消息映射的设置及绘图函数的实现等。通过具体的代码示例展示了
背景图片
的加载和绘制过程。
MFC轻松打造绚丽的透明窗体
本文介绍如何使用JerryWang开发的CImgDialogBase类创建透明效果的
对话框
。通过简单步骤,如添加必要的头文件和支持库、修改
对话框
基类及实现构造函数等,即可实现具有透明背景的
对话框
。
VC++ MFC文档视图程序静态
背景图片
实现:双缓冲绘图与资源管理实战
本文详解在VC++ MFC文档视图程序
中
实现静态
背景图片
的完整方案,核心采用双缓冲绘图技术消除闪烁,支持CView与CScrollView适配;涵盖资源嵌入(JPG/PNG/BMP)、位图加载、内存DC绘制、滚动偏移处理及高DPI适配;强调GDI资源管理、RAII内存安全与性能优化,提供可复用的背景管理器类设计。
MFC Picture控件图像
显示
全解析:静态与动态加载的四种实现方案
本文系统解析MFC
中
Picture控件的图像
显示
技术,聚焦静态与动态加载两大场景。静态方案包括资源属性绑定(仅BMP)和
对话框
背景刷法;动态方案重点剖析GDI手动绘制(支持BMP、双缓冲、自适应缩放)及ActiveX控件法(如Kodak,已不推荐)。深入讲解GDI绘图原理、内存管理、闪烁优化、多格式支持(GDI+、CImage)及鼠标交互实现,覆盖工业上位机等实战需求。
WTL自定义的常用类
本文介绍了一种自定义Windows界面控件的方法,包括如何设置
背景图片
、调整背景及字体颜色,以及创建具有特殊效果的静态文本控件。通过模板类实现了控件功能,并提供了具体的实现代码。
界面
15,976
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章