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