`
kcb026ya
  • 浏览: 13821 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

ReleaseDC和DeleteDC的区别 (转)

阅读更多

ReleaseDC和DeleteDC的区别 (转)
2011年12月01日
   在编SDK小游戏时发现的图片在背景上移动时,可能出现闪烁,这时双缓冲就是基本方法之一。
  但发现一个480 * 580的小窗口中,都是移动了185次后,图片不动了,百思不得解,试想为内存泄漏
  原来是ReleaseDC和DeleteDC在做怪,对于create的dc应该予以deletedc,而对于getdc的应予以releasedc
  附上图片移动源码:
  #include "windows.h"
  LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
  void showpic();
  HWND hwnd;
  int xp,yp;
  int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
  {
  WNDCLASS wndcls;
  wndcls.cbClsExtra=0;
  wndcls.cbWndExtra=0;
  wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  wndcls.hCursor=(HCURSOR)LoadCursor(NULL,IDC_ARROW);
  wndcls.hIcon=(HICON)LoadIcon(NULL,IDI_WINLOGO);
  wndcls.hInstance=hInstance;
  wndcls.lpfnWndProc=WndProc;
  wndcls.lpszClassName="bao";
  wndcls.lpszMenuName=NULL;
  wndcls.style=CS_HREDRAW | CS_VREDRAW;
  RegisterClass(&wndcls);
  hwnd=CreateWindow("bao","xxx",WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,480,580, NULL,NULL,hInstance,NULL);
  MSG msg;
  while (GetMessage(&msg,NULL,0,0))
  {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
  }
  return msg.wParam;
  }
  LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wparam, LPARAM lparam)
  {
  HDC hdc=GetDC(hWnd);
  switch(uMsg)
  {
  case WM_KEYDOWN:
  if (wparam==VK_LEFT)
  {
  xp-=100;
  if (xp"0) xp=0;
  }
  if (wparam==VK_UP)
  {
  yp-=100;
  if (yp"0) yp=0;
  }
  if (wparam==VK_RIGHT)
  {
  xp+=100;
  if (xp"440) xp=440;
  }
  if (wparam==VK_DOWN)
  {
  yp+=100;
  if (yp"500) yp=500;
  }
  showpic();
  break;
  case WM_DESTROY:
  PostQuitMessage(0);
  }
  return DefWindowProc(hWnd,uMsg,wparam,lparam);
  }
  void showpic()
  {
  HDC hdc=GetDC(hwnd);
  HDC hmemdc=CreateCompatibleDC(hdc);
  HBITMAP hbc=CreateCompatibleBitmap(hdc,480,580);
  SelectObject(hmemdc,hbc);
  BitBlt(hdc,0,0,480,580,hmemdc,0,0,SRCCOPY);
  DeleteObject(hbc);
  DeleteDC(hmemdc);
  //换成ReleaseDC(hwnd,hmemdc);将出现内存泄漏,将导致图片停止移动
  ReleaseDC(hwnd,hdc);
  }
分享到:
评论

相关推荐

    易语言彩色日记

    易语言彩色日记源码,彩色日记,彩色的字,TextOutA,SetTextColor,SetBkMode,GetWindowDC,ReleaseDC,DeleteDC,SetWindowTextA

    易语言多彩文字

    易语言多彩文字源码,多彩文字,彩色的字,TextOutA,SetTextColor,SetBkMode,GetWindowDC,ReleaseDC,DeleteDC,SetWindowTextA

    API取字体宽度

    取字体宽度,取字体高度,GetTextExtentPoint,GetDC,CreateCompatibleDC,CreateFont,MulDiv,GetDeviceCaps,SelectObject,CloseHandle,ReleaseDC,DeleteDC,DeleteObject

    易语言手动绘制进度条

    易语言手动绘制进度条源码,手动绘制进度条,绘制进度条,BitBlt,CreateCompatibleDC,GetDC,SelectObject,ReleaseDC,DeleteDC,InvalidateRect,UpdateWindow

    易语言API取字体宽度

    易语言API取字体宽度源码,取字体宽度,取字体高度,GetTextExtentPoint,GetDC,CreateCompatibleDC,CreateFont,MulDiv,GetDeviceCaps,SelectObject,CloseHandle,ReleaseDC,DeleteDC,DeleteObject

    易语言进度条按钮

    易语言进度条按钮源码,进度条按钮,getdc,CreateCompatibleDC,CreateCompatibleBitmapEx,SelectObject,CreatePen,MoveTo,LineTo,DeleteObject,ReleaseDC,BitBlt,deletedc

    易语言判断HDC

    易语言判断HDC源码,判断HDC,CreateCompatibleDC,DeleteDC,GetDC,GetObjectType,ReleaseDC,WindowFromDC

    易语言给你的窗口创建一个虚线选择框

    易语言给你的窗口创建一个虚线选择框源码,ReleaseDC,SelectObject,GetDC,DeleteObject,DrawFocusRect,GetDCEx,SetCapture,ReleaseCapture,CreateCompatibleDC,CreateCompatibleBitmap,BitBlt,DeleteDC,SetWindowLong...

    易语言分层截图

    易语言分层截图源码,分层截图,快照_Layered,GetDesktopWindow,GetWindowDC,CreateCompatibleDC,CreateCompatibleBitmap,SelectObject,BitBlt,DeleteObject,DeleteDC,ReleaseDC,GetWindowRect

    Delphi 检测程序是否运行,全屏抓图、修改计算机名称.rar

    Delphi7.0与Windows编程示例,检测程序是否运行,捕获全屏图像并抓图(截屏)、修改计算机名称,要... ReleaseDC(BHandle,SourceDC) ; //释放设备环境  注:通过本例子改变计算机在网络中的名字,重新启动后才生效。

    利用API画图片

    画出图片到DC,载入,取宽度,取高度,取句柄,DeleteDC,DeleteObject,GetDC,ReleaseDC,SelectObject,TransparentBlt,CreateCompatibleDC,GlobalAlloc,GlobalLock,GlobalUnlock,GlobalFree,OleLoadPicture,RtlMoveMemory,...

    易语言测试源码,易语言进度条模块

    易语言进度条模块源码,进度条模块,创建,设置进度,销毁,SetPixel,CreateCompatibleBitmap,CreateCompatibleDC,GetDC,DeleteDC,DeleteObject,SelectObject,SetBkMode,StretchBlt,GetWindowRect,ReleaseDC

Global site tag (gtag.js) - Google Analytics