为什么以下代码不起作用?

时间:2011-04-28 12:41:37

标签: c++ winapi visual-c++ win32-process

我使用以下样式创建了静态控件...

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?

提前感谢,

2 个答案:

答案 0 :(得分:2)

其他一些代码也可能会向您的窗口发送STM_SETIMAGE。计算您拨打SendMessage(STM_SETIMAGE)的次数和到达case STM_SETIMAGE的次数。


此外,HDC imgDC = GetDC((HWND)img);永远不会起作用。 HBITMAP不是HWND

答案 1 :(得分:2)

此代码存在多个问题。

  1. 除处理BeginPaint外,您无法在任何地方使用EndPaint / WM_PAINT。在解决其他问题之前解决这个问题。
  2. 接下来,你还不清楚你是否正确地对窗口进行了子类化;确保在旧窗口上调用CallWindowProc
  3. 保证您所看到的内容确实是您认为的所在,这很棘手。例如Ben Voigt所说,也许你不是发送它的人。也许上面的开关盒块掉了下来。也许你已经通过NULL开始。
  4. 从这些事情开始,你将更接近正轨。