Рисование прозрачного растрового изображения на панели - PullRequest
1 голос
/ 17 декабря 2011

Я хочу нарисовать прямоугольник с закругленными углами на wxPanel . Как показано ниже, я не могу получить его прозрачным. Белая область должна быть прозрачной.

enter image description here Серая область - это растровое изображение , а под ним - фон wxPanel . Мой код для рисования растрового изображения ( wxBitmap ):

wxMemoryDC temp;
bitmap.Create(kWidth, kHeight);
temp.SelectObject(bitmap);
temp.SetBackground(*wxWHITE_BRUSH);
temp.Clear();
temp.SetPen(wxPen(wxColor(80, 80, 80), 1));
temp.SetBrush(*wxTRANSPARENT_BRUSH);
temp.DrawRectangle(0, 0, kWidth, kHeight);
temp.SetBrush(wxBrush(backgroundColor));
temp.DrawRoundedRectangle(0, 0, kWidth, kHeight, kRadius);

А для блинтинга (для обновления) мой код

void draw(wxDC& dc, wxPoint mousePosition)
{
    wxMemoryDC temp;
    temp.SelectObject(bitmap);
    dc.Blit(wxPoint(kLeft, kTop), temp.GetSize(), &temp, wxPoint(0, 0), wxCOPY, true);
}

Но вывод такой, как показано выше. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Если вы хотите, чтобы желтый фон элемента управления вашего родителя заменялся белым фоном под закругленными углами, вам нужно создать фигурный элемент управления. В Windows этого можно добиться с помощью функции WinAPI SetWindowRgn () . Ваша wxPanel не прозрачна. Он имеет некоторый цвет фона, даже если вы рисуете его прозрачной кистью, поэтому вы все равно увидите непрозрачную область под закругленными углами, если не создадите фигурный элемент управления. Для других платформ также должна быть некоторая нативная реализация (я думаю, что по умолчанию API wxWidgets не существует). Для Linux и wxGTK вы можете получить GdkWindow * с помощью GetHandle () метода wxWindow и создать округленную форму элемента управления с помощью растрового изображения GDK, я думаю.

Другой способ - получить часть родительского фона под вашей wxPanel, нарисовать его на панели, а затем нарисовать скругленный прямоугольник.

0 голосов
/ 24 февраля 2012

Нарисуйте тот же скругленный прямоугольник в wxMask. Сделайте углы, которые вы хотите видеть, черными, а детали, которые вы хотите, видимыми белым. Затем вызовите bitmap.SetMask с вашим объектом wxMask. С маской, примененной к вашему wxBitmap, она должна правильно мигать в вашем методе Draw.

...