none
如何在Win32窗口‘鼠标拖动时不进行重绘,鼠标松开时进行重绘。’ RRS feed

  • 问题

  • 代码例子在http://nehe.gamedev.net/data/lessons/vc/lesson02.zip可以下载到。此程序虽然是个opengl程序,但是我觉得用win32 gdi也能实现‘拖动时不进行重绘,鼠标松开时进行重绘。’效果吧。


    我的疑问:我有一个主窗口,主窗口还有很多的子窗口,有的子窗口还要显示很多的动态信息。如果用鼠标左键拖动边框调整窗口的大小,那么子窗口的大小位置也要跟着改变。我觉得在wm_size里面更新子窗口的位置大小太频繁了,况且子窗口还很多,如果在鼠标松开时进行重绘,那么不是有效率多了。而且不停的移动子窗口的位置,改变子窗口的大小,整个窗口就会很闪烁。


    而且www.xmission.com/~nate/index.html站点的glut 和http://freeglut.sourceforge.net/站点的freeglut就有很多不同。freeglut是随着鼠标的拖动,窗口客户区动态的调整,而glut则是在鼠标松开时才重绘制客户区。


    2011年9月5日 9:54

答案

  • 你这个图不是因为重绘导致的,而是因为没有重绘。

    如果在拖动的时候闪烁,你需要修改WM_PAINT消息,而不是手动控制重绘


    0xBAADF00D
    • 已标记为答案 Rob Pan 2011年9月16日 7:20
    2011年9月14日 1:06
    版主

全部回复

  • 在视图中响应鼠标动作.

    void CxxxView::OnMouseMove(UINT nFlags, CPoint point)
    {
     // TODO: Add your message handler code here and/or call default

     CRect rc; 

     ClientToScreen(&rc);
        rc.left += point.x - m_xPos;
     rc.top += point.y - m_yPos;
     
      AfxGetMainWnd()->SetWindowPos(NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE);
      CView::OnMouseMove(nFlags, point);
    }

    2011年9月6日 1:16
  • 把重绘的代码,放到mouseup中不就行了。mousemove的时候只记录一个是否需要重绘的变量。
    麻烦把正确答案设为解答。
    2011年9月6日 1:18
    版主
  • 鼠标在调整窗口的大小,我该怎么判断啊?鼠标左键在松开那一刻我又该怎么判断啊?

    2011年9月6日 1:26
  • 鼠标在调整窗口大小的时候没有WM_MOUSEMOVE啊,我想知道鼠标在调整窗口大小的时候,在松开鼠标左键停止调整大小的时候,消息该怎么获取。
    2011年9月6日 1:32
  • 鼠标在调整窗口大小的时候没有WM_MOUSEMOVE啊,我想知道鼠标在调整窗口大小的时候,在松开鼠标左键停止调整大小的时候,消息该怎么获取。

    WM_ENTERSIZEMOVE

    WM_EXITSIZEMOVE

    2011年9月6日 2:29
  • WM_ENTERSIZEMOVE是user clicks the window's title bar or sizing border,能感知调整窗口大小,WM_EXITSIZEMOVE也能感知鼠标调整窗口大小松开。但是WM_ENTERSIZEMOVE也包括windows' title。

     

    我查了些资料,觉得方法应该在WM_NCHITTEST和WM_NCLBUTTONDOWN,但是不知道该如何运用。

    2011年9月6日 2:43
  • 你这个图不是因为重绘导致的,而是因为没有重绘。

    如果在拖动的时候闪烁,你需要修改WM_PAINT消息,而不是手动控制重绘


    0xBAADF00D
    • 已标记为答案 Rob Pan 2011年9月16日 7:20
    2011年9月14日 1:06
    版主