jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:3499回复:9

图形放大缩小方案

楼主#
更多 发布于:2005-06-15 09:42
OnDraw调用drawgraph()完成图形的绘制。  
现在用鼠标左键放大图形,右键缩小。
当我在视图上点左键放大时,他会不会当成视图窗口发生变化,从而再次调用ondraw。
我是想 在视图上点左键放大时,它调用鼠标左键处理函数进行图形的放大。
如果鼠标点击视图引起ondraw的执行,则直接在鼠标左键处理函数声明一全局变量表示放大缩小比例。(这种情况下,要不要在鼠标消息处理函数里调用OnEraseBkgnd).

另:可不可以对已画好的图形进行整体的放大,而不需要对每个线段先放大后再绘制图形?
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-15 11:05
前一个问题不用你操心,系统处理好了.要重绘,你要调用InvalidateRect函数,系统根据bErase参数决定是否发出WM_ERASEBKGND.
第二个问题:这样不大好,矢量图一般重绘,保持精确显示.
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-15 13:28
这样是吧?
void CDisplayView::OnLButtonDown(UINT nFlags, CPoint point)
{
...............................
InvalidateRect(NULL,NULL,TURE);
}
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-15 14:50
是这个意思,可能是这样写:
InvalidateRect(NULL);
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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指向整个视图的坐标?
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-16 11:03
1、ValidateRect(NULL);可不写,因为系统帮你调用了.
2、响应WM_VSCROLL和WM_HSCROLL消息。调用InvalidateRect。
3、InvalidateRect两个参数,因为它是CWnd的成员函数。::InvalidateRect就要三个参数。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-16 11:33
你的意思是说要在WM_VSCROLL和WM_HSCROLL消息处理函数中加上
InvalidateRect??
WM_VSCROLL和WM_HSCROLL消息处理函数应该是系统自带的吧,他们对用户应该是透明的吧,当触动滚动条时,我们看到的应该是直接去OnDraw处执行。怎么加InvalidateRect?
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
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]
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-16 11:53
很谢谢。
我先试试!!
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
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);
}
游客

返回顶部