Почему следующий код не работает? - PullRequest
1 голос
/ 28 апреля 2011

Я создал статический элемент управления, используя следующие стили ...

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 Iиметь следующий код ..

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 ]

2 голосов
/ 28 апреля 2011

Есть несколько проблем с этим кодом.

  1. Вы не можете использовать BeginPaint / EndPaint нигде, кроме обработки WM_PAINT. Исправьте это, прежде чем даже рассмотреть другие проблемы.
  2. Далее, не ясно, правильно ли вы делите окно на подклассы; убедитесь, что вы вызываете CallWindowProc в старом окне proc.
  3. Сложно гарантировать, что то, что вы видите, действительно то, что вы думаете, что видите. Например, как говорит Бен Фойгт, возможно, вы не тот, кто его отправил. Может быть, блок переключателя сверху провалился. Может быть, вы прошли в NULL для начала.

Начните с этих вещей, и вы станете ближе к тому, чтобы быть на пути.

2 голосов
/ 28 апреля 2011

Возможно, что какой-то другой код также отправляет STM_SETIMAGE в ваше окно. Посчитайте, сколько раз вы звоните SendMessage(STM_SETIMAGE) и сколько раз вы набираете case STM_SETIMAGE.


Кроме того, HDC imgDC = GetDC((HWND)img); никогда не будет работать. HBITMAP не HWND.

...