2011-05-06 108 views
2

我有以下代碼...爲什麼圖像消失?

case WM_PAINT: 
    { 
     hdc = BeginPaint(hwnd,&paintSt); 
     temphdc = hdc; 
     GetClientRect(hwnd,&aRect); 
     if(hBitmap!=NULL) 
     {    
      HDC memDC = CreateCompatibleDC(hdc); 
      if(memDC!=NULL) 
      { 
       BITMAP bmp; 
       GetObject(hBitmap,sizeof(bmp),&bmp); 
       SelectObject(memDC,hBitmap); 
       SetStretchBltMode(hdc,HALFTONE); 
       StretchBlt(hdc,0,0,aRect.right,aRect.bottom, 
          memDC,0,0,bmp.bmWidth,bmp.bmHeight, 
          SRCCOPY); 
       DeleteObject(&bmp); 
       ReleaseDC(hwnd,memDC); 
      } 

     }   
     // the code for painting 
     EndPaint(hwnd,&paintSt); 
    } 
    break; 

hBitmap是一個全局變量,這是在一些地方的代碼....顯示圖片分配,但消失時,我最小化窗口....

任何人都可以解釋這一點嗎?

在此先感謝,

回答

4

你的清理代碼都是錯誤的,你泄漏處理不好。在TaskMgr.exe,Processes選項卡中應該很容易看到。查看+選擇列並勾選GDI對象。當GDI對象句柄計數達到10,000時,此代碼停止工作。是的,當您調整窗口大小時很可能會發生,因爲會出現亂七八糟的繪畫請求。

不要刪除BITMAP,它只是結構。在刪除memDC之前,還原從SelectObject()返回的舊位圖句柄。不要使用ReleaseDC,DeleteDC是必需的。注意這些函數的返回值,它們告訴你什麼時候你搞砸了,但如果你從不檢查一個斷言,那麼它就不能工作。

GDI編程對於這些顯式清理規則是很痛苦的。考慮一個類圖書館來照顧這種苦差事,他們從來不會錯。

+0

感謝哥們,我是WIN32的新手。無論我迄今爲止學到的是這些論壇的所有bcoz,通過提出問題,無論人們建議我寫什麼......將按照您的建議改進我的代碼..我對WIN32庫不太熟悉......努力瞭解它的基本概念..我想我需要努力工作.... Nyways感謝所有的建議。 – aProgrammer 2011-05-06 14:25:24

+0

以下鏈接的最後一行說,我們應該刪除BITMAP .... HTTP使用DeleteObject的()://msdn.microsoft.com/en-us/library/dd183488(VS.85)的.aspx ...您的需要註釋... – aProgrammer 2011-05-07 06:40:30

+1

是的,你用DeleteObject刪除一個HBITMAP。注意H. – 2011-05-07 09:45:22

1

我想某種程度上hBitmap更改爲null,同時最小化。 將代碼發佈到指定位置並引用hBitmap將有助於確定我認爲的問題。

+0

HBITMAP是一個全局變量...我爲它分配到的LoadImage()... – aProgrammer 2011-05-06 14:26:49

+0

代碼最終被工作......在InvalidateRect()卻意外地被調用。 。 。 。感謝您的時間.. – aProgrammer 2011-05-09 06:13:50