如何在ATL对话框中显示背景图片

shanhe 2004-04-07 04:01:48
我写了一个ATL对话框,在OnEraseBkgnd将位图bitblt,但是发觉是错误的,无法顺利显示位图。
希望那位实现了通过API截取dialog的画图类消息更换背景能够指点一下。

谢谢
...全文
226 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
  • 打赏
  • 举报
回复
相关推荐
发帖
界面

1.5w+

社区成员

VC/MFC 界面
社区管理员
  • 界面
加入社区
帖子事件
创建了帖子
2004-04-07 04:01
社区公告
暂无公告