图形背景下对话框的CButtonST按钮未能刷新

anario 2003-10-17 01:54:54
以bmp图做对话框背景,下面是这个对话框的相关函数的主要内容。

对话框(这里称它作MyDlg)中用了CButtonST按钮。CButtonST按钮用了
DrawTransparent函
数。正常情况下一切OK。不过如果程序启动时前面有个东西挡住了它(比如有个总在前端
的程序)。则MyDlg启动完成后,移开挡在它前面的那个程序,会发现如果挡住部分有CBu
ttonST按钮,这个按钮未能显示出背景图来。

请有经验的大虾指正。多谢了。

// MyDlg.cpp : implementation file
//

void CMyDlg::OnPaint()
{
CPaintDC dc( this );
CRect rc;
GetClientRect( rc );

if ( !(HBITMAP)m_bitmap ) // If no bitmap is selected
dc.FillRect( rc, &m_brush );

if ( (HBITMAP)m_bitmap )
{
CDC* pDC;
CDC memDC;
CBitmap bmp;

BOOL bDrawOnMemDC = ( GetDisplayMode() != dispTile ) ? TRUE : FALSE;
if ( bDrawOnMemDC )
{
if ( GetDisplayMode() != dispStretch )
bmp.CreateCompatibleBitmap( &dc, rc.right, rc.bottom );
else
bmp.CreateCompatibleBitmap( &dc, m_sizeImage.cx, m_sizeImage.c
y );
memDC.CreateCompatibleDC( &dc );
memDC.SelectObject( &bmp );
pDC = &memDC;
}
else
pDC = &dc;

CPoint point;
for ( point.y = 0; point.y < rc.Height(); point.y += m_sizeImage.cy )

for ( point.x = 0; point.x < rc.Width(); point.x += m_sizeImage.cx
)
pDC->DrawState( point, m_sizeImage, &m_bitmap, DST_BITMAP | DS
S_NORMAL );

if ( bDrawOnMemDC == TRUE )
dc.BitBlt( 0, 0, rc.right, rc.bottom, pDC, 0, 0, SRCCOPY );
}
}

BOOL CMyDlg::OnEraseBkgnd( CDC* pDC )
{
return TRUE; // Return TRUE so background is not erased
}

HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch(nCtlColor)
{
// case CTLCOLOR_EDIT:
case CTLCOLOR_STATIC:
// The Slider Control has CTLCOLOR_STATIC, but doesn't let
// the background shine through,
TCHAR lpszClassName[255];
GetClassName(pWnd->m_hWnd, lpszClassName, 255);
if(_tcscmp(lpszClassName, TRACKBAR_CLASS) == 0)
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

case CTLCOLOR_BTN:
// let static controls shine through
pDC->SetBkMode(TRANSPARENT);
return HBRUSH(m_brushHollow);

default:
break;
};

return CDialog::OnCtlColor(pDC,pWnd,nCtlColor);

// HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

// TODO: Return a different brush if the default is not desired
// return hbr;
...全文
369 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
anario 2003-10-18
  • 打赏
  • 举报
回复
这两天去Codeguru上下了昨天到Codeguru上找了一个新版本的CButtonST例子,其中有一页就是图形背景对话框。

现在的版本是3.9。估计是我用的CButtonST版本比较旧(大概是2000年左右的一个版本),当时的版本还没有解决这个问题。例子中只在对话框的OnEraseBKgnd中进行处理。处理背景的同时,调用了界面上所有CButtonST的一个函数SetBK(CDC* pDC),把背景的DC指针传过去,由按钮同步进行界面更新。

我用了版本中没有SetBK函数,把这个函数拷过去,再大致作些自定义的调整,问题就基本解决了。

新版本的CButtonST比我用的要大的多。。。一个控件的代码就那么大,实在是麻烦。好在不用整个拷就基本解决了。

多谢各位的回答。这个问题过两天就结贴。.
flyelf 2003-10-17
  • 打赏
  • 举报
回复
我用的方法是hook按钮父窗口的一些消息,然后更新自己
fanged 2003-10-17
  • 打赏
  • 举报
回复
我现在也在用这个类,的确有这样的问题。
Ah 2003-10-17
  • 打赏
  • 举报
回复
将你的代码放到OnEraseBkgnd中(WM_ERASEBKGND消息),而不是OnPaint
yintongshun 2003-10-17
  • 打赏
  • 举报
回复
楼上说的对,加一个Invaild
wuxfBrave 2003-10-17
  • 打赏
  • 举报
回复
问题可能出在这里,你设置了按钮的背景色透明了
case CTLCOLOR_BTN:
// let static controls shine through
pDC->SetBkMode(TRANSPARENT);
return HBRUSH(m_brushHollow);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧