CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

请教用双缓冲区画动态直线

楼主onlyphoenix(Phoenix)2005-02-11 19:51:10 在 VC/MFC / 图形处理/算法 提问

我是这样写的,可是用了缓冲区后,就什么也不能画了  
  各位帮忙看看  
   
  LRESULT   CALLBACK   WndProc   (HWND   hwnd,   UINT   message,   WPARAM   wParam,    
  LPARAM   lParam)  
  {  
    static   HINSTANCE         hInst;  
            static   int                     cxClient,   cyClient,   cxScreen,   cyScreen;  
            HDC                                   hdc;  
    static   POINT                 pt,lp;  
    PAINTSTRUCT                   ps   ;  
    HPEN                                 hpen;  
    static   int                     bDown=0;  
     
    static   HBITMAP             hBitmap;  
  //   static   SIZE   size;  
    RECT rect;  
     
    switch   (message)  
            {  
    case   WM_CREATE:  
      GetClientRect(hwnd,&rect);  
      hdc   =   GetDC(hwnd);  
      hdcMem1   =   CreateCompatibleDC(hdc);  
      hBitMap1   =   CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);  
      SelectObject(hdcMem1,hBitMap1);  
      hdcMem2   =   CreateCompatibleDC(hdc);  
      hBitMap2   =   CreateCompatibleBitmap(hdc,hdc,rect.right-rect.left,rect.bottom-rect.top);  
      SelectObject(hdcMem2,hBitMap2);  
      hBitMap   =   CreateCompatibleBitmap(hdc,hdc,rect.right-rect.left,rect.bottom-rect.top);  
      SelectObject(hdc,hBitMap);  
      BitBlt(hdcMem1,0,0,0,0,hdc,0,0,SRCCOPY);  
      BitBlt(hdcMem2,0,0,0,0,hdc,0,0,SRCCOPY);  
      ReleaseDC(hwnd,hdc);  
      return   0;  
   
    case   WM_PAINT:  
      hdc=BeginPaint(hwnd,&ps);  
      BitBlt(hdc,0,0,0,0,hdcMem1,0,0,SRCCOPY);  
      EndPaint(hwnd,&ps);  
      return   0;  
       
    case   WM_LBUTTONDOWN:  
      bDown   =   1;  
      pt.x   =   LOWORD(lParam);  
      pt.y   =   HIWORD(lParam);  
       
      return   0;  
     
  /*   case   WM_SIZE:  
      size.cx=LOWORD(lParam);  
      size.cy=HIWORD(lParam);  
      return   0;*/  
   
            case   WM_LBUTTONUP:  
      bDown   =   0;  
   
      return   0;  
     
    case   WM_MOUSEMOVE:     //   鼠标移动  
      if(bDown==1)  
      {  
      BitBlt(hdcMem1,0,0,0,0,hdcMem2,0,0,SRCCOPY);  
      lp.x   =   LOWORD(lParam);  
      lp.y   =   HIWORD(lParam);  
   
  //     hdc   =   GetDC(hwnd);  
       
      hpen=CreatePen(PS_SOLID,   5,   RGB(255,   0,   0));  
      SelectObject(hdcMem1,hpen);  
       
      MoveToEx(hdcMem1,pt.x,pt.y,NULL);  
      LineTo(hdcMem1,lp.x,lp.y);  
   
       
  //     BitBlt(hdcMem2,0,0,size.cx,size.cy,hdcMem1,0,0,SRCCOPY);  
   
      InvalidateRect(hwnd,   NULL,   FALSE);  
       
      }  
  //     InvalidateRect(hwnd,   NULL,   TRUE);  
      return   0;  
                       
            case   WM_DESTROY:  
       
                      PostQuitMessage   (0)   ;  
                      return   0   ;  
            }  
            return   DefWindowProc   (hwnd,   message,   wParam,   lParam)   ;  
  }  
   
  问题点数:100、回复次数:2Top

1 楼ukyo1(**)回复于 2005-02-11 21:05:51 得分 100

//我改了一下,有效果了,你看看是不是你想要的?  
  LRESULT   CALLBACK   WndProc   (HWND   hwnd,   UINT   message,   WPARAM   wParam,    
      LPARAM   lParam)  
  {  
  static   HDC   hdcMem1,hdcMem2;  
  static   HBITMAP   hBitMap,hBitMap1,hBitMap2;  
  static   SIZE   size;  
  //   上面的变量是我添加的,是不是原来的都是全局变量?  
  static   HINSTANCE         hInst;  
  static   int                     cxClient,   cyClient,   cxScreen,   cyScreen;  
  HDC                                   hdc;  
  static   POINT                 pt,lp;  
  PAINTSTRUCT                   ps   ;  
  HPEN                                 hpen;  
  static   int                     bDown=0;  
   
  static   HBITMAP             hBitmap;  
  //   static   SIZE   size;  
  RECT rect;  
   
  switch   (message)  
  {  
  case   WM_CREATE:  
  GetClientRect(hwnd,&rect);  
  hdc   =   GetDC(hwnd);  
  hdcMem1   =   CreateCompatibleDC(hdc);  
  hBitMap1   =   CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);  
  SelectObject(hdcMem1,hBitMap1);  
  hdcMem2   =   CreateCompatibleDC(hdc);  
  hBitMap2   =   CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);  
  SelectObject(hdcMem2,hBitMap2);  
  hBitMap   =   CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);  
  SelectObject(hdc,hBitMap);  
  BitBlt(hdcMem1,0,0,0,0,hdc,0,0,SRCCOPY);  
  BitBlt(hdcMem2,0,0,0,0,hdc,0,0,SRCCOPY);  
  ReleaseDC(hwnd,hdc);  
  return   0;  
   
  case   WM_PAINT:  
  hdc=BeginPaint(hwnd,&ps);  
                                      //   这一句,参数中宽和高指定的都是0,我想错误的关键原因在这一句  
  //   现在cx,xy中存储的是客户区的宽和高  
  BitBlt(hdc,0,0,size.cx,size.cy,hdcMem1,0,0,SRCCOPY);  
  EndPaint(hwnd,&ps);  
  return   0;  
   
  case   WM_LBUTTONDOWN:  
  bDown   =   1;  
  pt.x   =   LOWORD(lParam);  
  pt.y   =   HIWORD(lParam);  
  return   0;  
   
    case   WM_SIZE:  
  //   这里的注释去掉了。  
  size.cx=LOWORD(lParam);  
  size.cy=HIWORD(lParam);  
  return   0;  
   
  case   WM_LBUTTONUP:  
  bDown   =   0;  
  return   0;  
   
  case   WM_MOUSEMOVE:     //   鼠标移动  
  if(bDown==1)  
  {  
  BitBlt(hdcMem1,0,0,0,0,hdcMem2,0,0,SRCCOPY);  
  lp.x   =   LOWORD(lParam);  
  lp.y   =   HIWORD(lParam);  
   
  //     hdc   =   GetDC(hwnd);  
   
  hpen=CreatePen(PS_SOLID,   5,   RGB(255,   0,   0));  
  SelectObject(hdcMem1,hpen);  
   
  MoveToEx(hdcMem1,pt.x,pt.y,NULL);  
  LineTo(hdcMem1,lp.x,lp.y);  
   
   
      BitBlt(hdcMem2,0,0,size.cx,size.cy,hdcMem1,0,0,SRCCOPY);  
  //   这里的注释也去掉了。  
  InvalidateRect(hwnd,   NULL,   FALSE);  
   
  }  
  //     InvalidateRect(hwnd,   NULL,   TRUE);  
  return   0;  
   
  case   WM_DESTROY:  
   
  PostQuitMessage   (0)   ;  
  return   0   ;  
  }  
  return   DefWindowProc   (hwnd,   message,   wParam,   lParam)   ;  
  }Top

2 楼ukyo1(**)回复于 2005-02-11 21:07:52 得分 0

改动的地方和原因在注释里Top

相关问题

  • 请教用双缓冲区画动态直线
  • WinSock缓冲区
  • Socket缓冲区
  • socks缓冲区
  • 急问,缓冲区画图线条颜色设置问题,马上给分
  • ==急==急==急==菜鸟问题,怎么去动态改变一个块缓冲区的大小??
  • ==急==急==急==菜鸟问题,怎么去动态改变一个块缓冲区的大小??
  • 清除键盘缓冲区
  • 缓冲区的问题
  • 缓冲区溢出,请教。

关键词

  • ps
  • top
  • hdcmem
  • hdc
  • hbitmap
  • rect
  • bdown
  • createcompatiblebitmap
  • bitblt
  • hpen

得分解答快速导航

  • 帖主:onlyphoenix
  • ukyo1

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo