2015-04-16 38 views
0

我有一個簡單的圖形用戶界面,當我在某個選項卡上時應該顯示圖像。我有選項卡進程內的WM_PAINT信息如下所示窗口調整大小時位圖消失

case WM_PAINT: 
    { 
      PAINTSTRUCT psLOGO; 
      RECT rcLOGO; 
      HDC hdcLOGO; 
      //Prepares for painting window 
      hdcLOGO = BeginPaint(hwndMonitor, &psLOGO); 
      //Retrieves the coordinates of the windows client area 
      GetClientRect(hwndMonitor, &rcLOGO); 
      //creates a copy of the memory device context 
      HDC hdcDoubleLOGO = CreateCompatibleDC(hdcLOGO); 
      HBITMAP Logo = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));   //Get a bitmap of the picture to be updated 
      HBITMAP bmOldLOGO = (HBITMAP)SelectObject(hdcDoubleLOGO, Logo);         //Get a handle to the image being replaced 
      BitBlt(hdcLOGO, 0, 0, rcLOGO.right, rcLOGO.bottom, hdcDoubleLOGO, 0, 0, SRCCOPY); //Bit block transfer of the bitmap color data 

      SelectObject(hdcDoubleLOGO, bmOldLOGO); 
      DeleteDC(hdcDoubleLOGO); 
      EndPaint(hwndMonitor, &psLOGO); 
      DeleteObject(Logo); 
     break; 
    } 

hwndMonitor是該特定標籤頁

手柄上的圖像示出了當我打開的標籤,但如果我調整窗口,或者如果我儘量減少並重新打開GUI,圖像將消失

我必須去到另一個選項卡,並返回到該選項卡來獲取圖像回

我做得不對,我WM_PAINT消息?

+0

您是否檢查過以確保所有呼叫都成功? –

+0

我做過了,我在WM_PAINT的開頭添加了一個斷點,並通過消息代碼。它看起來像所有的變量正在被初始化和正確使用。 我注意到當我重新打開GUI時,它只會對WM_PAINT進行一次調用......但是當我切換標籤時,它會對WM_PAINT進行兩次調用。消息是否應該發送兩次? – Heather

+1

有時會發生這種情況,因爲父標籤窗口和子窗口重疊。嘗試將標記'WS_CLIPCHILDREN'添加到父標籤控件。或者在標籤頁上試試'WS_CLIPSIBLINGS'。 – rodrigo

回答

1

您還必須對WM_SIZE消息作出反應。調整窗口大小不會釋放繪畫消息。

在WM_SIZE只要致電:

InvalidateRect(hwnd,&rect,TRUE); 
UpdateWindow(hwnd); 

矩形是與當前窗口大小的矩形。無效標記重繪的矩形,並且UpdateWindow確保它立即重新繪製。

+0

謝謝!它現在的工作:) – Heather

+0

通常不需要調用'UpdateWIndow',允許失效根據需要創建'WM_PAINT'更有效。 –

相關問題