Почему мое дочернее окно не отвечает на события мыши? - PullRequest
4 голосов
/ 04 мая 2011

Я создал настраиваемое статическое окно, которое отображает растровое изображение, это окно является дочерним окном какого-либо другого окна.Теперь я хочу захватить события мыши для этого окна, чтобы я мог обеспечить функциональность для обрезки изображения.

Но проблема в том, что события мыши не передаются в это дочернее окно .... ниже приведен фрагмент кода WndProc дочернего окна.

WNDPROC origStatProc;
    // Variable which stores the handle of BITMAP image
HBITMAP hBitmap=NULL;
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);
            if(hBitmap!=NULL)
            {               
                HDC memDC = CreateCompatibleDC(hdc);
                if(memDC!=NULL)
                {
                    BITMAP bmp;
                    GetObject(hBitmap,sizeof(bmp),&bmp);
                    SelectObject(memDC,hBitmap);
                    SetStretchBltMode(hdc,HALFTONE);
                    StretchBlt(hdc,0,0,aRect.right,aRect.bottom,
                    memDC,0,0,bmp.bmWidth,bmp.bmHeight,
                    SRCCOPY);
                    DeleteObject(&bmp);
                    ReleaseDC(hwnd,memDC);
                }
            }           
            // the code for painting 
            EndPaint(hwnd,&paintSt);
        }
        break;
        case STM_SETIMAGE:
        {           
            InvalidateRect(hwnd,&aRect,true);           
        }
            break;  
        case WM_LBUTTONDOWN:
            {
                int xPos = GET_X_LPARAM(lParam);
                int yPos = GET_Y_LPARAM(lParam);
                char xstr[10];
                _itoa(xPos,xstr,10);
                MessageBox(NULL,xstr,"X Value ",MB_OK);
            }
            break;

        default:
            return origStatProc(hwnd,msg,wParam,lParam);

    }
    return 0;
}

Может кто-нибудь сказатьмне, что еще мне нужно, чтобы захватить события мыши внутри этого дочернего окна ...

Ответы [ 3 ]

1 голос
/ 05 мая 2011

Если я правильно помню: статические окна объявляют себя «невидимыми» для щелчков мышью, возвращая HTTRANSPARENT в ответ на WM_NCHITTEST.Из-за этого Windows передает щелчок мыши родительскому элементу.Если вы хотите обрабатывать щелчки мышью в статике, вам также нужно переопределить это поведение, чтобы вместо этого возвращать HTCLIENT.

1 голос
/ 05 мая 2011

Я вызвал DefWndProc () вместо origStatProc (hwnd, msg, wParam, lParam), и проблема решена ....

в любом случае, спасибо всем ....

1 голос
/ 04 мая 2011

Класс окна, который вы используете для окна, будет определять определенные поведения по умолчанию для окна. С классом окна Static особенно трудно работать, потому что Windows предполагает, что окно никогда не изменит своего содержимого и никак не будет взаимодействовать с пользователем. Вы, вероятно, обнаружите, что WM_LBUTTONDOWN передается в родительское окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...