阅读:3515回复:9
图形放大缩小方案
OnDraw调用drawgraph()完成图形的绘制。
现在用鼠标左键放大图形,右键缩小。 当我在视图上点左键放大时,他会不会当成视图窗口发生变化,从而再次调用ondraw。 我是想 在视图上点左键放大时,它调用鼠标左键处理函数进行图形的放大。 如果鼠标点击视图引起ondraw的执行,则直接在鼠标左键处理函数声明一全局变量表示放大缩小比例。(这种情况下,要不要在鼠标消息处理函数里调用OnEraseBkgnd). 另:可不可以对已画好的图形进行整体的放大,而不需要对每个线段先放大后再绘制图形? |
|
沙发#
发布于:2005-06-15 11:05
前一个问题不用你操心,系统处理好了.要重绘,你要调用InvalidateRect函数,系统根据bErase参数决定是否发出WM_ERASEBKGND.
第二个问题:这样不大好,矢量图一般重绘,保持精确显示. |
|
|
板凳#
发布于:2005-06-15 13:28
这样是吧?
void CDisplayView::OnLButtonDown(UINT nFlags, CPoint point) { ............................... InvalidateRect(NULL,NULL,TURE); } |
|
地板#
发布于:2005-06-15 14:50
是这个意思,可能是这样写:
InvalidateRect(NULL); |
|
|
地下室#
发布于:2005-06-16 10:38
我写了一个小程序测试了一下,
void CDisplayviewView::OnDraw(CDC* pDC) { CDisplayviewDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (FLAGS==0) { ValidateRect(NULL); pDC->MoveTo(0,100); pDC->LineTo(10,100); pDC->MoveTo(10,100); pDC->LineTo(10,120); pDC->MoveTo(10,120); pDC->LineTo(800,120); pDC->MoveTo(800,120); pDC->LineTo(800,100); pDC->MoveTo(800,100); pDC->LineTo(900,100); pDC->TextOut(500,100,\"ASD\"); } else { pDC->MoveTo(0,100); pDC->LineTo(100,100); pDC->MoveTo(100,100); pDC->LineTo(100,120); pDC->MoveTo(100,120); pDC->LineTo(200,120); pDC->MoveTo(200,120); pDC->LineTo(800,90); FLAGS=0; } } void CDisplayviewView::OnLButtonDown(UINT nFlags, CPoint point) { FLAGS=1; InvalidateRect(NULL,TRUE); } void CDisplayviewView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CSize sizeTotal; // TODO: calculate the total size of this view sizeTotal.cx = sizeTotal.cy = 1000; SetScrollSizes(MM_TEXT, sizeTotal); } 现在有这样一种情况: 视图没有滚动条时,点左键能放大,改变窗口大小能还原。 当有滚动条时,当前看到的正常放大(看不到的有没有放大不知道),但当拖动滚动条时,只有把滚动条从头脱到尾时,图形才能完全还原,我是想只要一触动滚动条,整个图形就能还原。 是不是因为InvalidateRect(NULL,TRUE)参数的设置有问题? 我在该函数的原型应该是三个参数,但我设三个参数他就报错。 InvalidateRect(NULL,TRUE)这种情况下是不是只改变当前看到的视图,要想改变整个试图必须把lprect指向整个视图的坐标? |
|
5楼#
发布于:2005-06-16 11:03
1、ValidateRect(NULL);可不写,因为系统帮你调用了.
2、响应WM_VSCROLL和WM_HSCROLL消息。调用InvalidateRect。 3、InvalidateRect两个参数,因为它是CWnd的成员函数。::InvalidateRect就要三个参数。 |
|
|
6楼#
发布于:2005-06-16 11:33
你的意思是说要在WM_VSCROLL和WM_HSCROLL消息处理函数中加上
InvalidateRect?? WM_VSCROLL和WM_HSCROLL消息处理函数应该是系统自带的吧,他们对用户应该是透明的吧,当触动滚动条时,我们看到的应该是直接去OnDraw处执行。怎么加InvalidateRect? |
|
7楼#
发布于:2005-06-16 11:49
void CDisplayviewView::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
{ InvalidateRect( NULL ); CScrollView::OnVScroll( nSBCode, nPos, pScrollBar ); } [编辑 - 6/17/05 by maqian] |
|
|
8楼#
发布于:2005-06-16 11:53
很谢谢。
我先试试!! |
|
9楼#
发布于:2005-06-16 17:16
我想让鼠标点击放大的部分显示再视图中央,鼠标点击一次,图形放大两倍,所以我就把点击时的滚动条的位置得到,位置乘2后为新的滚动条的位置。但好像滚动条跟不上试图,放大两三次就看不到视图了。
void CDisplayviewView::OnLButtonDown(UINT nFlags, CPoint point) { CPoint curpoint,newpoint; curpoint=GetScrollPosition(); newpoint.x=2*curpoint.x; newpoint.y=curpoint.y; ScrollToPosition(newpoint); count1++; mouseflags=1; InvalidateRect(NULL,TRUE); } |
|