Разделение CDialog на две области с разным фоном (изображение цели внутри) - PullRequest
0 голосов
/ 17 января 2012

Мне нужно построить окно, разработанное так, чтобы оно выглядело именно так (оно имеет элементы управления внутри белой области, но это пока не актуально):

http://dl.dropbox.com/u/3432167/example.png
Моя проблема заключается в определении этих двух отдельных «областей» с разным фоном.
Наиболее близким к ожидаемому виду я представлял белую область с пустым ListBox, но результат не тот (и это паршивый хак).

Есть идеи, как этого добиться?

Ответы [ 2 ]

1 голос
/ 17 января 2012

Если диалоговое окно не нуждается в изменении размера, самый простой способ - создать bmp с нужным фоном (довольно просто, если вы можете использовать CDialogEx вместо CDialog - просто нужно вызвать SetBackgroundImage).

Если вы не можете использовать растровое изображение, вам придется создать собственный элемент управления для рисования этого фона.

0 голосов
/ 18 января 2012

После некоторых копаний я обнаружил, что хорошим способом сделать это является переопределение функции OnPaint.
Ниже приведен пример, используемый для диалога, изображенного на вопрос выше. Размеры прямоугольника жестко запрограммированы, потому что размер этого конкретного диалогового окна не изменяется.

Не забудьте добавить ON_WM_PAINT () к карте сообщений.

void CTestDlg::OnPaint()
{
    if (IsIconic())
    {
        (...)
    }
    else
    {
        CPaintDC dc(this); // device context for painting
        dc.FillSolidRect(0,0,612,376, RGB(255,255,255));
        dc.FillSolidRect(0,376,612,60, ::GetSysColor(COLOR_3DFACE));
        CDialog::OnPaint();
    }
}

Решение оказалось довольно простым, но я думаю, что в любом случае полезно поделиться.

...