2011-04-28 51 views
1

我曾嘗試使用以下方式創建一個靜態控制...爲什麼下面的代碼不工作?

picBoxDisp = CreateWindow("STATIC", "image box", 
     WS_VISIBLE |WS_CHILD | SS_BITMAP |WS_TABSTOP | WS_BORDER, 
     50, 50, 250, 300, 
     hwnd , (HMENU)10000, NULL, NULL); 

SetWindowLongPtr(picBoxDisp,GWLP_WNDPROC,(LONG) dispWndProc); 

在我的程序的某個地方,我有以下代碼..

SendMessage(picBoxDisp,STM_SETIMAGE, (WPARAM) IMAGE_BITMAP,(LPARAM) hBitmap); 

現在dispWndProc裏面我有下面的代碼。 。

LRESULT CALLBACK dispWndProc(HWND hwnd,UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
static HDC hdc; 
static PAINTSTRUCT paintSt; 
static RECT aRect; 
switch(msg) 
{ 
    case WM_PAINT: 
    { 
     hdc = BeginPaint(hwnd,&paintSt); 
     GetClientRect(hwnd,&aRect);      
     // the code for painting 
     EndPaint(hwnd,&paintSt); 
    } 
    break; 
    case STM_SETIMAGE: 
    { 

     //painting code; 
     HBITMAP img = (HBITMAP)lParam; 
     BITMAP bmp; 
     GetObject(img,sizeof(bmp),&bmp); 
     HDC imgDC = GetDC((HWND)img); 
     HDC memDC = CreateCompatibleDC(imgDC); 
     SelectObject(memDC,img); 
     if((img==NULL))// ||(imgDC==NULL)||(memDC==NULL)) 
     { 

        MessageBox(NULL,"img is NULL","Bad Programming!!! Error",MB_OK); 

     } 

     else 

     { 
     StretchBlt(hdc,0,0,aRect.right,aRect.bottom, 
     memDC,0,0,bmp.bmWidth,bmp.bmHeight, 
     SRCCOPY); 
     } 

    } 
     break; 
    default: 
     return DefWindowProc(hwnd,msg,wParam,lParam); 

} 

return 0; 
} 

誰能告訴爲什麼lParam的犯規強制轉換回HBITMAP ....爲什麼IMG是NULL?

在此先感謝,

+1

爲什麼繼承一個Static控件而不是創建自己的類?一般而言,除非要使用和自定義其中的一些現有功能,否則不要再繼承其他控件。在STM_SETIMAGE中做繪畫代碼是奇怪的;通常您只需將位圖句柄存儲並調用InvalidateRect,然後在WM_PAINT中進行所有繪製。也;在SetWindowLongPtr中,轉換爲LONG_PTR,而不是LONG;鑄造到LONG可能導致此代碼在爲win64編譯時失敗。 – BrendanMcK 2011-04-28 23:05:10

回答

2

這有可能是一些其他的代碼也發送STM_SETIMAGE到你的窗口。請計算您撥打SendMessage(STM_SETIMAGE)的次數以及達到case STM_SETIMAGE的次數。


另外,HDC imgDC = GetDC((HWND)img);永遠不會工作。 HBITMAP不是HWND

+0

我在整個程序中只發送一次STM_SETIMAGE(我在上面寫的這行)...... – aProgrammer 2011-04-28 12:50:59

+0

@Arts:那麼你沒寫的代碼呢?操作系統始終將消息發送到Windows,原因很多。 – 2011-04-28 12:53:42

+0

@本Voigt:請參閱已編輯的代碼,這是主窗口的子面板內的靜態框。我不知道如何解決它。 SendMessage()和STM_SETIMAGE的API表示lParam具有圖像發送的句柄,並且在爲此靜態控件添加單獨的WNDPROC之前,代碼正常工作。我是新的WIN32,只是無法找到錯誤..... Nyway感謝你的朋友的幫助.. – aProgrammer 2011-04-28 13:00:55

2

此代碼有多個問題。

  1. 不能使用BeginPaint/EndPaint任何地方,除了處理WM_PAINT。在考慮其他問題之前解決這個問題。
  2. 接下來,不清楚你是否正確地繼承了窗口的子類;請確保您在舊窗口過程中致電CallWindowProc
  3. 確保您所看到的確實是您認爲您所看到的內容很棘手。例如Ben Voigt說的,也許你不是那個發送它的人。也許上面的開關盒情況下跌了。也許你通過NULL開始。

從這些事情開始,你會更接近正軌。

+0

根據你的建議,我已經編輯了代碼,但變量img仍然是NULL ...以及如何獲得HBITMAP對象的DC ...感謝您的時間。 – aProgrammer 2011-04-28 13:03:34

+1

你還沒有調用'CallWindowProc'。 「DefWindowProc」並不相同;如果沒有正確的子類技術,控制將不起作用。 – tenfour 2011-04-28 14:09:10

+0

好,我應該在哪裏使用CallWindowProc。在默認部分?我應該調用dispWndProc(靜態控件的WNDPROC),child1WndProc(擁有靜態控件的面板的WNDPROC)或MyWndProc(它是子窗口的父窗口),我應該使用哪個WNDPROC .....我真的新的WIN32 ..再次感謝.. – aProgrammer 2011-04-29 05:00:29