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なのですか?

前もって感謝します、

4

2 に答える 2

2

他のコードもSTM_SETIMAGEウィンドウに送信している可能性があります。電話SendMessage(STM_SETIMAGE)をかけた回数と に到達した回数を数えますcase STM_SETIMAGE


また、HDC imgDC = GetDC((HWND)img);決してうまくいきません。はHBITMAPではありませんHWND

于 2011-04-28T12:45:58.027 に答える
2

このコードには複数の問題があります。

  1. BeginPaint/EndPaintは取り扱い以外には使用できませんWM_PAINT。他の問題を考える前にそれを修正してください。
  2. 次に、ウィンドウを正しくサブクラス化しているかどうかが明確ではありません。必ずCallWindowProc古いウィンドウ プロシージャを呼び出してください。
  3. あなたが見ているものが本当にあなたが見ていると思っているものであることを保証するのは難しい. たとえば、Ben Voigt が言うように、送信者はあなたではない可能性があります。上のスイッチケースブロックが抜けたのかもしれません。多分あなたは最初に合格しましNULLた。

これらのことから始めれば、軌道に乗ることに近づきます。

于 2011-04-28T12:49:50.603 に答える