我写了一个win32程序,就是在客户区用BitBlt显示一个本地机器上的位图,当鼠标点击到客户区的位图并移动时,位图的显示位置会跟着移动,但是每次我在WM_MOUSEMOVE消息中计算出移动的位置,然后调用InValidateRect(hWnd, NULL, true);
UpdataWindow(hWnd);强制刷新客户区,这张图就不显示了,为什么啊?是不是应该先保存一遍客户区?

解决方案 »

  1.   

    单独创建一个窗口 平时是CHILD属性 隶属于你的应用程序, 在鼠标点击拾取以后 变成POPUP属性 跟随鼠标MoveWindow即可, 释放后又恢复到应用程序的CHILD窗口
      

  2.   

    确认下你的BitBlt是否在wm_paint响应里。如果是getdc画的是一重画就没有了。
      

  3.   

    你的图是在OnPaint消息里画的么
      

  4.   


    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps); ///红色框
    hPen  =  CreatePen(PS_SOLID, 0, RGB(255, 0, 0));
    SelectObject(hdc, hPen);
    DrawFrame(hdc, CLIP_FRAME_X, CLIP_FRAME_Y, CLIP_FRAME_WIDTH, CLIP_FRAME_HEIGHT, 5);
    ///显示位图
    memDC = CreateCompatibleDC ( hdc ); SelectObject ( memDC, hBitmap ); bitBiltError = BitBlt(hdc,showX,showY,ttt.bmWidth, ttt.bmHeight,memDC,0,0,SRCCOPY); if ( !bitBiltError )
    {
    MessageBox(hWnd, TEXT("BITBLT ERROR"), TEXT("BITBLT ERROR"), MB_OK);
    } EndPaint(hWnd, &ps);
    break;肯定是在WM_PAINT中画的啊,每次那个红色框都能显示,但就是位图无法显示
      

  5.   

    可以在拖动的时候把鼠标设为位图
    drop时在还原
      

  6.   

    现在的问题是我在WM_MOUSEMOVE中调用
    InValidateRect(hWnd, NULL, true);
    UpdataWindow(hWnd)
    强制刷新的时候,这张位图就不显示了,我调用BitBlt的返回值也是true...
      

  7.   

    麻烦简单说一下,win32我基本没学过,所以不是很懂,谢谢.
      

  8.   

    BitBlt(hdc,showX,showY,ttt.bmWidth, ttt.bmHeight,memDC,0,0,SRCCOPY);
    看下这里面的参数是否正确 
    showX,showY,ttt.bmWidth, ttt.bmHeight,0,0
    看看这几个参数的值
      

  9.   

    EndPaint(hWnd, &ps);
    前面加一行 ReleaseDC(memDC);
      

  10.   

    你的WM_PAINT消息里的内容惨不忍睹
      

  11.   


    不画框也是这样,触发WM_LBUTTONDOWN强制刷新就没有显示了.
      

  12.   

    搞定了....少了一行代码....不是ReleaseDC(memDC);
    而是DeleteDC(memDC);不过还是谢谢了...