建立一个MFC单文档工程,在CMyView::OnCreate()中绘制一个CButton控件然后定义这个按钮的消息处理函数CMyView::OnLButtonDown()
{
    CDC* pDC = GetDC();   // 取得视图的设备上下文
    pDC->SetWindowOrg(100, 100);
    pDC->SetViewportOrg(0, 0);    UpdateWindow();  // 刷新视图
}疑问:按照道理按钮应该移动啊,事实上没有动,请教大家我的思路是不是错了,CScrollView的实现原理是什么?我在上面的消息处理函数中调用 pDC->SetMapMode(); 重设映射模式好像没有效果,不管怎么设置都是原来的MM_TEXT映射模式。

解决方案 »

  1.   

    SetWindowOrg 和 按钮没啥关系吧?
      

  2.   

    看不懂楼主你想干什么?
    创建一个按钮,但是你的消息响应是WM_LBUTTONDOWN啊,是在View上单击鼠标左键的响应,跟按钮有什么关系呢?
      

  3.   

    不用:UpdateWindow(); // 刷新视图
    用Invalidate();//试试
      

  4.   

    你要刷新视图吧,invalidate是刷新视图!
      

  5.   

    有点没搞懂楼主的意思,楼主先定义了一个按钮,然后在View类的WM_LBUTTONDOWN里写代码,这样按钮就没有任何作用啊,WM_LBUTTONDOWN是VIEW类的消息啊
      

  6.   

    楼主你的理解很有问题啊
    1.CMyView::OnLButtonDown()是你的视图的所有左击都触发这个消息。
    2.尽管有旁边的滚动轴了,但是滚动轴的代码还是要你自己写的,映射关系要自己建立.
    不然,就算你滚动轴不断滚动,还是没有任何反映的。你应该SetScrollSize设定滚动轴大小,通过GetScrollPos得到滚动轴的位置来绘制你整个视图的内容
      

  7.   

    你是在视里直接用代码创建的按钮吧? 
    如果是这样,你在视OnScroll的时候重绘你的按钮,不要用你原来的位置了,应该重新计算位置,用GetScrollPosition获得滚动位置,然后加到你的绘制按钮的位置。
    鼠标点下的位置也是一样,将鼠标的point加上滚动位置才是窗口里的位置。
      

  8.   

    还有,如果你要修改映射模式 ,ScrollView自动给你重载一个OnInitialUpdate()函数,在这里面
    CSize totalSize = CSize(width, height); 
    SetScrollSizes(MM_TEXT, totalSize);
    ResizeParentToFit();
    或者别的映射模式
      

  9.   

    如果要移动窗口中的控件,不要滚动视图,而是用ScrollWindow函数滚动窗口,需要注意的是,最后要用UpdateWindow保持窗口滚动后的绘制效果。
      

  10.   

    是不是ScrollWindow实际也是重画的?那么直接更改视图设备上下文的映射模式能否达到滚动的效果?
      

  11.   

    除了需要判断滚动位置和别的View没什么两样啊。
    更改了映射模式以后坐标都变了,肯定要更改滚动窗口了。改了以后想让它接着滚估计是不行了。