hur.cn - 华软网

 热门搜索

在static控件上画图问题

  作者:未知    来源:网络    更新时间:2011/5/16
我只想在控件内部画图,但是当我画的图过大时,会直接超出控件画到对话框上,
我的希望是当话的过大时只显示在控件上的那部分。
下面是我的代码
C++">
HDC hDC;
PAINTSTRUCT ps;
CWnd* pShowWnd= GetDlgItem(IDC_SHOW_ELLIPE); 
hDC = ::BeginPaint(pShowWnd->GetSafeHwnd(),&ps) ;
CDC mydc;
mydc.Attach(hDC); 
RECT m_showRect;
int m_centreX,m_centreY;//show框的中心坐标
m_centreX = m_centreY =0;
int m_centreRadius=200;//隐形的大圆半径
pShowWnd->GetWindowRect(&m_showRect);
pShowWnd->ScreenToClient(&m_showRect);
m_centreX = m_showRect.left +(m_showRect.right - m_showRect.left)/2;
m_centreY = m_showRect.top+(m_showRect.bottom - m_showRect.top)/2;
mydc.Ellipse(m_centreX-m_centreRadius,m_centreY-m_centreRadius,
m_centreX+m_centreRadius,m_centreY+m_centreRadius);

DeleteDC(hDC);    
::EndPaint(pShowWnd->GetSafeHwnd(),&ps);

当我把半径设置的过大时,就会出现我说的情况

请大家帮帮忙,急用,谢谢!
---华软 网友回答---
可以先在内存中画出来,然后再把可以显示的部分显示在static控件。
---华软网友回复---
引用 1 楼 haogeai123 的回复:
可以先在内存中画出来,然后再把可以显示的部分显示在static控件。

这点我知道,防止闪烁一般都这样,我的问题是为什么会出现我说的现象,谢谢
---华软网友回复---
重写CStatic类,在OnPaint中绘图
---华软网友回复---
当我画的图过大时,会直接超出控件画到对话框上
我没有重载CStatic   不过我的画图是在OnPaint中写的
谢谢!
---华软网友回复---
引用 4 楼 wangtengchao 的回复:
当我画的图过大时,会直接超出控件画到对话框上
我没有重载CStatic 不过我的画图是在OnPaint中写的
谢谢!

你可以设置剪裁区。SelectClipRgn();
---华软网友回复---
建议重载CStatic ,在OnPaint画
---华软网友回复---
你得到的DC应该是对话框的DC,从效率而言,一个对话框用一个DC就能完成其所有界面的绘制,对于控件绘制,在其内部应该有一个绘制范围的控制。而你自己绘制控件时,也就需要自己控制绘制范围。
---华软网友回复---
C++">
HDC hDC;
PAINTSTRUCT ps;
CWnd* pShowWnd= GetDlgItem(IDC_SHOW_ELLIPE); 
hDC = ::BeginPaint(pShowWnd->GetSafeHwnd(),&ps) ;
CDC mydc;
mydc.Attach(hDC); 
CRect r;
CRgn rgn;
pShowWnd->GetClientRect(&r);
rgn.CreateRectRgn(r.left,r.top,r.right,r.bottom);
mydc.SelectClipRgn(&rgn);

RECT m_showRect;
int m_centreX,m_centreY;//show框的中心坐标
m_centreX = m_centreY =0;
int m_centreRadius=200;//隐形的大圆半径
pShowWnd->GetWindowRect(&m_showRect);
pShowWnd->ScreenToClient(&m_showRect);
m_centreX = m_showRect.left +(m_showRect.right - m_showRect.left)/2;
m_centreY = m_showRect.top+(m_showRect.bottom - m_showRect.top)/2;
mydc.Ellipse(m_centreX-m_centreRadius,m_centreY-m_centreRadius,
                    m_centreX+m_centreRadius,m_centreY+m_centreRadius);

DeleteDC(hDC);    
::EndPaint(pShowWnd->GetSafeHwnd(),&ps);



代码 中加红色的代码,应该可以限制区画图范围了。
---华软网友回复---
CRect r;
CRgn rgn;
pShowWnd->GetClientRect(&r);
rgn.CreateRectRgn(r.left,r.top,r.right,r.bottom);
mydc.SelectClipRgn(&rgn);

加这几句。。。上在好似没显示红色。。
---华软网友回复---
感谢大家都回答。如何不画到外面方法我是知道的,我的问题只是为什么会出现这样的状况

CWnd* pShowWnd= GetDlgItem(IDC_SHOW_ELLIPE); 
hDC = ::BeginPaint(pShowWnd->GetSafeHwnd(),&ps) ;
CDC mydc;
mydc.Attach(hDC);
我的代码是将static控件的hDC  attach到CDC上
我的dc应该是static的,而不是对话框上,
所以我对于画图能画到对话框上感到奇怪,谢谢!
---华软网友回复---
你可以这么认为,static控件的DC就是窗口的DC,只是作了一个坐标转换
---华软网友回复---
大家还有什么其他的理解吗?
---华软网友回复---
可能是属于图形错位,设备坐标和逻辑坐标的不一致?记得这种现象是重绘过程调整显示上下文的属性引起的       
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。