【VC】滚动对话框背景图刷新问题。

shen_wei 2018-05-23 10:39:38
加精


图片中红色矩形框是 子对话框 添加的滚动条,根据滚动条来调整界面显示。

问题1:
对话框背景图没有刷新。。

问题2:
背景的更新还会刷新到子对话框外的界面??APPLY按钮

m_nScrollCur 是滚动条的值。。 分别使用一下两个函数分别绘图,结果都是如图一样。


OnEraseBkgnd(CDC* pDC)
{
CDC MemoryDC;
HINSTANCE hInstResource = NULL;

hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(IDB_BITMAP_LED_C),RT_BITMAP);
m_hBitmap = (HBITMAP)::LoadImage(hInstResource,MAKEINTRESOURCE(IDB_BITMAP_LED_C),IMAGE_BITMAP,0,0,0);

MemoryDC.CreateCompatibleDC(pDC);
MemoryDC.SelectObject(m_hBitmap);

pDC->StretchBlt(0,0,LED_C_WIDTH,LED_C_HEIGHT,&MemoryDC,0,m_nScrollCur,LED_C_WIDTH,LED_C_HEIGHT,SRCCOPY);

return TRUE;
}


OnPaint()
{
CPaintDC dc(this);

CDC MemoryDC;
HINSTANCE hInstResource = NULL;

hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(IDB_BITMAP_LED_C),RT_BITMAP);
m_hBitmap = (HBITMAP)::LoadImage(hInstResource,MAKEINTRESOURCE(IDB_BITMAP_LED_C),IMAGE_BITMAP,0,0,0);

MemoryDC.CreateCompatibleDC(&dc);
MemoryDC.SelectObject(m_hBitmap);

dc.StretchBlt(0,0,LED_C_WIDTH,LED_C_HEIGHT,&MemoryDC,0,m_nScrollCur,LED_C_WIDTH,LED_C_HEIGHT,SRCCOPY);

}


望各位大侠不吝赐教!!!对话框更新滚动条界面。。
...全文
3092 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2018-06-02
  • 打赏
  • 举报
回复
"会花屏的" 下面是 用 CreatePatternBrush 做的例子:

void CPngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(m_pImage == NULL) return;
//
int iButtonIndex = 0;
if(lpDrawItemStruct->itemState & ODS_SELECTED)
{// select blue
iButtonIndex=2;
}
else if (lpDrawItemStruct->itemState & ODS_FOCUS)
{// focus green
iButtonIndex=1;
}
else if (lpDrawItemStruct->itemState & ODS_DISABLED)
{// disable yellow
iButtonIndex=3;
}
else
{// normal red
iButtonIndex=0;
}
//
if((m_hover) && (iButtonIndex!=2))
{// hover // white
iButtonIndex=4;
}
CDC* pDC = CDC::FromHandle(lpDrawItemStruct -> hDC);
CRect rect = lpDrawItemStruct->rcItem;
// gdi
// m_brPattern from dlg.
// see "void SetPatBrush(CBrush *pbr){m_brPattern=pbr;}"
CRect rc;
GetClientRect(rc);
MapWindowPoints(GetParent(),rc);
//
int off=GetParent()->GetScrollPos(SB_VERT);
pDC->SetBrushOrg(-rc.left,-rc.top-off);// minus !
rc.OffsetRect(-rc.left,-rc.top);
pDC->FillRect(&rc,m_brPattern);
// draw png
Graphics g(pDC->m_hDC);
g.DrawImage(m_pImage,Rect(0,0,m_nWidth,m_nSliceHeight),m_nWidth*iButtonIndex,
0,m_nWidth, m_nSliceHeight,UnitPixel);
}

pDC->SetBrushOrg(-rc.left,-rc.top-off);// minus !
rc.OffsetRect(-rc.left,-rc.top);
pDC->FillRect(&rc,m_brPattern);


willtek 2018-05-31
  • 打赏
  • 举报
回复
求运动控制软件开发大神。
schlafenhamster 2018-05-31
  • 打赏
  • 举报
回复
总之不能依靠 WS_EX_TRANSPARENT !
hurryboylqs 2018-05-31
  • 打赏
  • 举报
回复
这就是为啥DUI存在的一大理由,控件要想背景透明普通的方式很麻烦的。
shen_wei 2018-05-30
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
注意 // think of scroll bar ! int off=m_pWnd->GetParent()->GetScrollPos(SB_VERT);
GetWindowRect(m_pWnd->m_hWnd,WindowRC); m_pWnd->GetParent()->ScreenToClient(WindowRC); 这里面已经转换成相对应子控件的位置,而无需在获取滚动条的位置。
schlafenhamster 2018-05-30
  • 打赏
  • 举报
回复
注意 // think of scroll bar ! int off=m_pWnd->GetParent()->GetScrollPos(SB_VERT);
schlafenhamster 2018-05-30
  • 打赏
  • 举报
回复
另一个帖子的 38楼代码可用,但有 bug !改正如下:

//
void AbstractPaint::OnPaint(CDC &dc)
{
	UINT id=GetDlgCtrlID(m_pWnd->m_hWnd);
	if(!m_bInited)
	{// only ownce !
#if 0 // Use WS_EX_TRANSPARENT ; bug when scroll 
	  // Because,during the button comes to be visible a bit by a bit(By SB_THUMBTRACK),
	  // the Bk of the Button, needs to be changed, till the buton is full visible .
	  // However variable m_bInited limits this happens.Also that is why "SendMessage(WM_VSCROLL,MAKELONG(SB_LINEDOWN,0),0);
	  // in Timer(make button3 full visible, can work around the problem.
		m_pWnd->GetClientRect(&m_canvasRect);
		/* 初始化缓存 */
		m_canvasDC.CreateCompatibleDC(&dc);
		m_canvasBitmap.CreateCompatibleBitmap(&dc, m_canvasRect.Width(), m_canvasRect.Height());
		m_canvasDC.SelectObject(&m_canvasBitmap);
		m_canvasDC.BitBlt(0, 0,	m_canvasRect.Width(),m_canvasRect.Height(),
		&dc,m_canvasRect.left,m_canvasRect.top, SRCCOPY);
#else // not need WS_EX_TRANSPARENT
		CRect ClientRC,WindowRC;
        CDC MemDC;
        CBitmap Bmp;
        Bmp.LoadBitmap(IDB_BITMAP_CHILD);//子对话框背景图
         
        MemDC.CreateCompatibleDC(&dc);
        MemDC.SelectObject(Bmp);
 
        m_pWnd->GetClientRect(ClientRC);//按钮相对位置
        GetWindowRect(m_pWnd->m_hWnd,WindowRC);
        m_pWnd->GetParent()->ScreenToClient(WindowRC);
        m_canvasDC.CreateCompatibleDC(&MemDC);  //子对话框大小的背景图
        m_canvasBitmap.CreateCompatibleBitmap(&MemDC, ClientRC.Width(), ClientRC.Height());
        m_canvasDC.SelectObject(&m_canvasBitmap);
 // think of scroll bar !
		int off=m_pWnd->GetParent()->GetScrollPos(SB_VERT);
		m_canvasDC.BitBlt(0,0,ClientRC.Width(), ClientRC.Height(), 
						&MemDC, WindowRC.left, WindowRC.top+off, SRCCOPY);
        Bmp.DeleteObject();
#endif
		if(id==1002)
		{
#if 0
	OpenClipboard(0);
	EmptyClipboard();
	SetClipboardData(CF_BITMAP,m_canvasBitmap);
	CloseClipboard();
	afxDump << id << "\n";
#endif 
		}
		m_pgraph = new Graphics(m_canvasDC.m_hDC);
		m_pgraph->SetSmoothingMode(SmoothingModeAntiAlias);
		m_pgraph->SetInterpolationMode(InterpolationModeHighQualityBicubic);

		/* 初始化擦除板 */
		m_erraseDC.CreateCompatibleDC(&m_canvasDC);
		m_erraseBitmap.CreateCompatibleBitmap(&m_canvasDC,
			m_canvasRect.Width(), m_canvasRect.Height());
		m_erraseDC.SelectObject(&m_erraseBitmap);
//
		OnInitDc(m_canvasDC, m_pgraph);
		m_erraseDC.BitBlt(0, 0,
			m_canvasRect.Width(),
			m_canvasRect.Height(),
			&m_canvasDC,
			m_canvasRect.left,
			m_canvasRect.top, SRCCOPY);

		m_bInited = TRUE;
	}
	Repaint(dc);
}
shen_wei 2018-05-30
  • 打赏
  • 举报
回复
引用 22 楼 schlafenhamster 的回复:
"做背景图都是做死啊"
其实使用
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);// "clouds.bmp"
m_PatBrush.CreatePatternBrush(&bmp);
不难


这样做是绘制背景图不错,但是Scrollwindow 时,就出效果了。。。会花屏的!!

我们的做法是普通的,UI库也许会有更好的解决方法。。譬如QQ的设置,场景秀里面应该就是如此,背景图不变,滚动条来显示信息消息!!!这样的界面才是做好的。。




schlafenhamster 2018-05-30
  • 打赏
  • 举报
回复
只是 case SB_THUMBTRACK: case SB_THUMBPOSITION: 看不到问题是 因为 m_nScrollPos=4;(不是0!)//太小 int off=m_pWnd->GetParent()->GetScrollPos(SB_VERT); 也=4; 发现不了问题 ! 你 把 按钮3 放 下 一点, 用 拖动滑块 时 ,m_nScrollPos 会大些(如到 50),就能发现问题了。
schlafenhamster 2018-05-30
  • 打赏
  • 举报
回复
"做背景图都是做死啊" 其实使用 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1);// "clouds.bmp" m_PatBrush.CreatePatternBrush(&bmp); 不难
shen_wei 2018-05-30
  • 打赏
  • 举报
回复
引用 20 楼 schlafenhamster 的回复:
只是 case SB_THUMBTRACK: case SB_THUMBPOSITION: 看不到问题 因为 m_nScrollPos=0; int off=m_pWnd->GetParent()->GetScrollPos(SB_VERT); 也=0;
所以市面上看的附带滚动条软件都是单颜色背景(单色画刷),做背景图都是做死啊!!! 多谢这些天的研究。。共同学习!!因为我们现在需要的只有 SB_THUMBPOSITION 和 SB_THUMBTRACK 功能 ,所以Demo就是如此!! 没有过多研究其它功能。。
schlafenhamster 2018-05-30
  • 打赏
  • 举报
回复
只是 case SB_THUMBTRACK: case SB_THUMBPOSITION: 看不到问题 因为 m_nScrollPos=0; int off=m_pWnd->GetParent()->GetScrollPos(SB_VERT); 也=0;
schlafenhamster 2018-05-30
  • 打赏
  • 举报
回复

void CScrollDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
#define STEP 40
	int nDelta = 0;
	switch (nSBCode)
	{
	case SB_LINEUP:
		if(m_nScrollPos>0) nDelta=-STEP;
		else nDelta=0;
		break;
	case SB_LINEDOWN:
		if(m_nScrollPos<200) nDelta=STEP;
		else nDelta=0;
		break;
	case SB_THUMBTRACK:
	case SB_THUMBPOSITION:
		nDelta = (int)nPos - m_nScrollPos;
	break;
	}
	if (nDelta != 0)
	{
		m_nScrollPos += nDelta;
		ScrollWindow(0,-nDelta);
		SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
	}	
	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
schlafenhamster 2018-05-30
  • 打赏
  • 举报
回复
都是 运行 结果:
jjhua0885 2018-05-28
  • 打赏
  • 举报
回复
引用 2 楼 shen_wei 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] Codejock.Xtreme.Suite.Pro.ActiveX Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
赵老师,烦请提供资源。。或者直接给答案。。[/quote] 他就这样,啥问题都答,就是水积分而已 要做滚动界面的最好方法是,在界面上贴一个子界面,所有绘图在子界面完成,父界面控制滚动和刷新
shen_wei 2018-05-23
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
LED_C_WIDTH,LED_C_HEIGHT这两个值应该有问题,请检查 2,对话框应该设置WS_CLIPCHILD,WS_CLIPSIBBING属性,否则,在其上的控件会被覆盖
LED_C_WIDTH,LED_C_HEIGHT 是显示界面大小 227 和 304 不管如何都是显示如此大小!!
worldy 2018-05-23
  • 打赏
  • 举报
回复
LED_C_WIDTH,LED_C_HEIGHT这两个值应该有问题,请检查 2,对话框应该设置WS_CLIPCHILD,WS_CLIPSIBBING属性,否则,在其上的控件会被覆盖
shen_wei 2018-05-23
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
Codejock.Xtreme.Suite.Pro.ActiveX Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
赵老师,烦请提供资源。。或者直接给答案。。
赵4老师 2018-05-23
  • 打赏
  • 举报
回复
Codejock.Xtreme.Suite.Pro.ActiveX Codejock.Xtreme.Toolkit.Pro.v15.3.1.Full.Source.Retail.Incl.Keymaker-ZWT.rar
schlafenhamster 2018-05-23
  • 打赏
  • 举报
回复
参考

void CScrollBitmapDlg::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar *pScrollBar) 
{// TODO: Add your message handler code here and/or call default
// for focus not jumpping
	GetDlgItem(IDOK)->SetFocus();
// scrolling
	switch (nSBCode)
	{
	case SB_LINEUP:
	case SB_PAGEUP:
		if(m_Sourcey >=10) m_Sourcey -= 10;
		else			 m_Sourcey  = 0;
		break;
	case SB_LINEDOWN:
	case SB_PAGEDOWN:
		if((m_Sourcey+m_rcPicture.Height()+10)<m_bmInfo.bmHeight)
			m_Sourcey += 10;
		else
			m_Sourcey  = m_bmInfo.bmHeight -m_rcPicture.Height();
		break;
	case SB_TOP:
		m_Sourcey = 0;
		break;
	case SB_BOTTOM:
		m_Sourcey = INT_MAX;
		break;
	case SB_THUMBTRACK:
		m_Sourcey = nPos;
		break;
	default:
//		afxDump << nSBCode << "=SB_ENDSCROLL\n";
		break;
	}
	m_vBar.SetScrollPos(m_Sourcey);
	InvalidateRect(&m_rcPicture,FALSE);
//	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
加载更多回复(7)

15,979

社区成员

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

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