hur.cn - 华软网

 热门搜索

这个onsize函数怎么写?

  作者:未知    来源:网络    更新时间:2010/4/1
我在view类里画的线条,怎么让它随着窗口大小的改变长度也发生改变?
---华软 网友回答---
在OnPaint里调用GetClientRect()获得视图类的客户区大小,再通过得到的大小算一下你线条的长度,再按算得的长度去画.
另外一种,定义一个成员变量用来记录线条的长度,在OnSize()函数里,根据窗口的变化,修改线条长度.最后在职OnPaint()里根据线条长度画线条
---华软网友回复---
在OnSize里获得客户区的矩形,根据这个矩形在OnPaint里画线。
---华软网友回复---
  class="deleted_message"> 该回复于2010-04-02 13:52:06被版主删除
---华软网友回复---
根据getclientrect怎么计算?拿现在的客户区大小除以原来的大小得到系数,然后乘以点的坐标嘛?(线条是由cpoint点构成),问题是原来的客户区大小在哪里获得?
---华软网友回复---
你可以将你的线用矩形表示出来,矩形的四个点当中,其中的两个点你的线的起点和终点,在View类的OnSize里,得到比例后,按比例来扩大或者缩小你的矩形即可,如果你现在的View宽为原来的2倍,高没有变化,那么你的矩形的宽也要变成原来的2倍,高不变即可。。。
---华软网友回复---
当然,最后画线实际上只是连接你计算后的矩形的其中的两个点而已
---华软网友回复---
在view类里获得了窗口缩放比例,然后乘以doc类里的点的坐标,这等于在view类里修改了doc类里的数据,那这个划线的函数写在哪儿?
---华软网友回复---
划线的函数写在OnPaint()里面,
OnSize()里取窗口大小,存在窗口类的成员变量里面.
OnPaint()取这个成员变量来画.
---华软网友回复---
不是啊,我开始把划线的方法封装到doc类里面自己设计的line类里面了,在ondraw里面调用。不过发现这样不行啊
---华软网友回复---
在view类里都是通过doc指针取得doc里面的line数据,来划线的
---华软网友回复---
楼主,我试过可以的喔.

C++">
下面是DOC的代码
class CSDIsizeDoc : public CDocument
{
public:
int m_iWndWidth;
int m_iWndHeight;

下面是VIEW的ONSIZE
void CSDIsizeView::OnSize(UINT nType, int cx, int cy) 
{
CView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
CRect rt;
GetClientRect(rt);
GetDocument()->m_iWndWidth = rt.Width();
GetDocument()->m_iWndHeight = rt.Height();
}

下面是VIEW的ONDRAW
void CSDIsizeView::OnDraw(CDC* pDC)
{
CSDIsizeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CClientDC dc(this);
dc.MoveTo(0,0);
dc.LineTo(pDoc->m_iWndWidth,pDoc->m_iWndHeight);
}


这时我的线就自动跟着窗口大小动啦.

---华软网友回复---
11楼的代码都帖出来了...楼主参考下嘛..
---华软网友回复---
在onpaint和在ondraw里面有什么区别啊?
---华软网友回复---
视图用OnDraw  打印用OnPaint..
OnPaint 本身也会调用 OnDraw..
OnDraw 会调用 PrepareDC  ,OnPaint 不会.....

如果你 重载了PrepareDC,改变了窗口和视口的映射关系,那么你的画图应当在OnDraw中进行
而不是OnPaint中
---华软网友回复---
为什么要在OnSize里取大小,在画的时候取不行吗?视图改变大小的时候,难道不重绘吗?
---华软网友回复---
你可以这样处理啊,将你的线条画在一张位图中,保存下来,当你的窗口变大的时候将位图按比例放大就行了。
你可以尝试一下,我没试过,但是这样处理好啊,至少不会出现闪烁!
---华软网友回复---
ls的你说的太悬了,怎么保存成位图?
---华软网友回复---
15楼说得对,放在OnPaint()处也是可以实现功能的,但有2个问题.
1.每次重画,无论SIZE有否变,都要执行一次取尺寸的动作.
2.组织得不够好,那些与SIZE有关的代码,尽量放到OnSize中,以后要修改,会好处理一些.

17楼的楼主,如果你重画的动作很多,觉得改SIZE时会闪,可以试内存DC的双缓冲用法.
百度一下有详细说明.
CDC dcMem;
dcMem.CreateCompatibleDC()
BITMAP bm;
CBitmap bmp;
bmp.CreateBitmapIndirect(&bm)
dcMem.SelectObject(&bmp)

然后在dcMem上画图.在OnDraw里再把内存的图按比例COPY到屏幕中,就一定不会闪了.
CClientDC dc(this);
dc.StretchBlt(....&dcMem)



---华软网友回复---
lz用双缓存就不会闪。在OnDraw里画就可以了。
---华软网友回复---
 学习了~~~      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。