Нарисуйте изображение в Picture Control - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть элемент управления изображением, который называется IDC_PICTURECONTROL, и LPPICTURE, который называется lpPicutre.

Когда мое окно получает WM_PAINT, я вызываю свою функцию drawPicture(HWND, LPPICTURE) следующим образом:

drawPicture(GetDlgItem(hDlg, IDC_PICTURECONTROL), lpPicture);

Как это написано сейчас, черная рамка вокруг элемента управления просто исчезает, а картинка вообще не рисуется.

Если я отредактирую функцию таким образом, чтобы она не рисовалась в элементе управления изображением, а скорее в самом диалоговом окне (hDlg), то она правильно рисуется на фоне клиентской области окна. (Не то, что я хочу).

Вот код в функции рисования:

void drawPicture(HWND hWnd, LPPICTURE picture)
{
    PAINTSTRUCT ps;
    HDC hdc;

    hdc = BeginPaint(hWnd, &ps);
  //hdc = BeginPaint(hDlg, &ps); (works, but draws on window instead of control)

    if (picture)
    {
        long hmWidth;
        long hmHeight;
        picture->get_Width(&hmWidth);
        picture->get_Height(&hmHeight);

        int nWidth  = MulDiv(hmWidth,  GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
        int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);

        RECT rc;
        GetClientRect(hWnd, &rc); // I have tried GetWindowRect() also

        int w = 0, h = 0, x = 0, y = 0;
        if (hmWidth == hmHeight)
        {
            // square
            w = (rc.right - rc.left);
            h = (rc.bottom - rc.top);

            x = rc.left;
            y = rc.top;
        }
        else if (hmWidth > hmHeight)
        {
            // wide
            w = (rc.right - rc.left);
            h = (w * hmHeight) / hmWidth;

            x = rc.left;
            y = (rc.bottom - rc.top - h) / 2;
        }
        else
        {
            //tall
            h = (rc.bottom - rc.top);
            w = (h * hmWidth) / hmHeight;

            y = rc.top;
            x = (rc.right - rc.left - w) / 2;
        }

        picture->Render(hdc, x, y, w, h, 0, hmHeight, hmWidth, -hmHeight, &rc);
    }

    EndPaint(hWnd, &ps);
  //EndPaint(hDlg, &ps);
}

hWnd - обработчик для управления изображением, а hDlg - обработчик для диалога.

Я подумал, что, может быть, он где-то рисуется за окном, поэтому я установил x и y на 0, а ширину и высоту на 1000, но это ничего не изменило.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Если этот код работает с hDlg, все в порядке, и проблема, вероятно, в самом статическом контроле. Убедитесь, что это стиль SS_BITMAP. В редакторе ресурсов Visual Studio он называется Type и по умолчанию имеет значение SS_BLACKFRAME (Frame).

0 голосов
/ 06 февраля 2013

Этот код работает для CStatic.

CPictureView* image = new CPictureView(std::string("E:\\My Documents\\..jpeg"));
image->Create("", SS_BLACKRECT | SS_OWNERDRAW | WS_CHILD | WS_VISIBLE, CRect(100, 100, 300, 300), this, IDC_STATIC1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...