CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

调用api函数使用双缓冲方式在窗口中画线时的问题

楼主flyingdog(flyingdog)2004-05-01 03:18:33 在 VC/MFC / 界面 提问

以下程序目的是要在鼠标按下时在窗口中画线。为了避免闪烁,使用了双缓冲方式。但是结果确是屏幕上什么都没有。请高手指点一下到底是哪里出了问题。  
   
  LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)  
  {  
  int   wmId,   wmEvent;  
  PAINTSTRUCT   ps;  
  HDC   hdc;  
  static   POINT     pt;  
  POINT     pt2;  
  static   int     cxClient,   cyClient;  
  static   HDC   srcbuf,realbuf;  
  static   HBITMAP hbitmap;  
   
  switch   (message)    
  {  
  case   WM_COMMAND:  
  wmId         =   LOWORD(wParam);    
  wmEvent   =   HIWORD(wParam);    
  //   分析菜单选择:  
  switch   (wmId)  
  {  
  case   IDM_ABOUT:  
  DialogBox(hInst,   (LPCTSTR)IDD_ABOUTBOX,   hWnd,   (DLGPROC)About);  
  break;  
  case   IDM_EXIT:  
  DestroyWindow(hWnd);  
  break;  
  default:  
  return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
  }  
  break;  
  case   WM_PAINT:  
  hdc   =   BeginPaint(hWnd,   &ps);  
  //   TODO:   在此添加任意绘图代码...  
  EndPaint(hWnd,   &ps);  
  break;  
  case   WM_DESTROY:  
  PostQuitMessage(0);  
  break;  
  case   WM_LBUTTONDOWN:     //   左键按下  
      pt.x   =   LOWORD(lParam);  
      pt.y   =   HIWORD(lParam);  
   
      return   0;  
  case   WM_MOUSEMOVE:     //   鼠标移动  
      pt2.x   =   LOWORD(lParam);  
      pt2.y   =   HIWORD(lParam);  
      if(wParam&MK_LBUTTON){  
  hdc   =   GetDC(hWnd);  
  BitBlt(srcbuf,0,0,cxClient,cyClient,realbuf,0,0,SRCCOPY);  
  MoveToEx(srcbuf,pt.x,pt.y,NULL);  
  LineTo(srcbuf,pt2.x,pt2.y);  
  BitBlt(hdc,0,0,cxClient,cyClient,srcbuf,0,0,SRCCOPY);  
  DeleteDC(hdc);  
      }  
     
                      return   0;  
  case   WM_LBUTTONUP:  
  BitBlt(realbuf,0,0,cxClient,cyClient,srcbuf,0,0,SRCCOPY);  
   
  return   0;  
   
  case   WM_SIZE:  
                      cxClient   =   LOWORD(lParam);  
      cyClient   =   HIWORD(lParam);  
   
      return   0;  
  case   WM_CREATE:  
  hdc=GetDC(hWnd);  
  hbitmap=CreateCompatibleBitmap(hdc,cxClient,cyClient);  
  srcbuf=CreateCompatibleDC(hdc);  
  realbuf=CreateCompatibleDC(hdc);  
  SelectObject(srcbuf,hbitmap);  
  SelectObject(realbuf,hbitmap);  
  BitBlt(srcbuf,0,0,cxClient,cyClient,hdc,0,0,SRCCOPY);  
  BitBlt(realbuf,0,0,cxClient,cyClient,hdc,0,0,SRCCOPY);  
  DeleteDC(hdc);  
  return   0;  
   
  default:  
  return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
  }  
  return   0;  
  }  
   
  问题点数:50、回复次数:5Top

1 楼flyingdog(flyingdog)回复于 2004-05-02 08:51:12 得分 0

怎么没人回答啊?Top

2 楼yujia120(永不停息)回复于 2004-05-02 09:23:42 得分 30

不应在WM_CREATE中绘制  
  在WM_PAINT和WM_LBUTTONDOWN中绘制  
  好象你的双缓存效果不好Top

3 楼yujia120(永不停息)回复于 2004-05-02 09:47:06 得分 10

有残影没有清除背景Top

4 楼Mackz(在相互)回复于 2004-05-02 09:57:25 得分 10

跟踪一下cxClient,cyClient的值。Top

5 楼flyingdog(flyingdog)回复于 2004-05-04 17:27:30 得分 0

我终于试出来了,是在WM_CREATE中的原因。  
  但是为什么在WM_CREATE期间不能这样那?  
  平时应该放在什么地方那?Top

相关问题

  • 用API函数画线,怎样改变颜色和线宽?
  • api函数
  • 求API函数?
  • API函数
  • API函数
  • API 函数!
  • windows系统给串口提供的默认缓冲区是多大,用什么API函数取得这个值?
  • 一个简单的函数画线的程序
  • 请教一个简单的画线函数问题
  • 大家来讨论一下java的画线函数

关键词

  • ps
  • srcbuf
  • cxclient
  • cyclient
  • realbuf
  • hdc
  • pt
  • loword
  • lparam
  • wmid

得分解答快速导航

  • 帖主:flyingdog
  • yujia120
  • yujia120
  • Mackz

相关链接

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

广告也精彩

反馈

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