在Dialog里SetScrollPos 后,在onPaint里,dc的坐标原点没有改变。

ruoge2007 2010-12-22 12:18:14
在Dialog里SetScrollPos 后,在onPaint里,dc的坐标原点没有改变。

dc.Rectangle( CRect( 0, 0, 200 , 200));当移动后,依然画在了原点上。
...全文
81 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2010-12-22
  • 打赏
  • 举报
回复
OnPrepareDC是视图类的函数,不是对话框的函数......
ruoge2007 2010-12-22
  • 打赏
  • 举报
回复
那我在OnPaint中每次做OnPrepareDC 中改变原点的操作也可以吧?
快乐鹦鹉 2010-12-22
  • 打赏
  • 举报
回复
那有什么稀奇的。本来就是这样。对话框不是视图,没有OnPrepareDC帮你调整。用LPToDP转换一下你这个矩形,然后再用dc绘制
疯狂石头_ 2010-12-22
  • 打赏
  • 举报
回复
CWnd::SetScrollPos
This method sets the current position of a scroll box and, optionally, redraws the scroll bar to reflect the new position of the scroll box.

Setting bRedraw to FALSE is useful whenever the scroll bar will be redrawn by a subsequent call to another function.


这个设置不会影响DC坐标原点
ruoge2007 2010-12-22
  • 打赏
  • 举报
回复
谢谢 happyparrot,你弄过窗口的透明效果吗?有一个窗口(B)我用一个部分透明的png做一个窗口的背景。在窗口移动的时候透明部分总是有父窗口(A)的内容。我在A窗口上放了一个菜单,菜单响应弹出一个对话框。但在设置了窗口B的WS_EX_LAYERED,弹出的对话框不见了。并且也点不了其它地方。按Enter会响应。弹出的Dialog确定是画出来了。纳闷中
快乐鹦鹉 2010-12-22
  • 打赏
  • 举报
回复
哦,我以为你还没有整出来呢
ruoge2007 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 happyparrot 的回复:]
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CBrush * pOldBr = dc.SelectObject( &m_brBg);
CRect rcClip(0,0,200,200);
dc.LPToDP(&rcC……
[/Quote]

画的少了这样转应该可以,画的多了就麻烦了。我那样就只需要设置一个地方。
快乐鹦鹉 2010-12-22
  • 打赏
  • 举报
回复
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CBrush * pOldBr = dc.SelectObject( &m_brBg);
CRect rcClip(0,0,200,200);
dc.LPToDP(&rcClip);
dc.FillRect( rcClip, &m_brBg);
dc.SelectObject( pOldBr);
这样行不行?
Eleven 2010-12-22
  • 打赏
  • 举报
回复
SetWindowOrg/SetViewportOrg();
ruoge2007 2010-12-22
  • 打赏
  • 举报
回复

void CLogiShowArea::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.SetWindowOrg( GetScrollPos( SB_HORZ), GetScrollPos( SB_VERT));
// TODO: Add your message handler code here
CBrush * pOldBr = dc.SelectObject( &m_brBg);
CRect rcClip;
dc.GetClipBox( rcClip);

// dc.FillRect( rcClip, &m_brBg);
dc.Rectangle( CRect( 0, 0, 200 , 200));
dc.SelectObject( pOldBr);
}
ruoge2007 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 happyparrot 的回复:]
OnPrepareDC是视图类的函数,不是对话框的函数......
[/Quote]

我的意思是下面这样,放到我程序里,达到效果了。

CPaintDC dc(this); // device context for painting
dc.SetWindowOrg( GetScrollPos( SB_HORZ), GetScrollPos( SB_VERT));
// TODO: Add your message handler code here
CBrush * pOldBr = dc.SelectObject( &m_brBg);
CRect rcClip;
dc.GetClipBox( rcClip);

// dc.FillRect( rcClip, &m_brBg);
dc.Rectangle( CRect( 0, 0, 200 , 200));
dc.SelectObject( pOldBr);

15,978

社区成员

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

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