Mar
13

Как создать фигурное окошко в Windows Mobile

Google Buzz

И вот еще один небольшой пример, демонстрирующий создание окна непрямоугольной формы в Windows Mobile с библиотекой wxWinCE.

Для реализации подобной штуки нам, прежде всего, необходима форма со стилем wxFRAME_SHAPED, без этого стиля ничего не получится.

Ну а затем нужно выполнить вот такой финт ушами:

  • Создать изображение (черно-белое)
  • Создать для него контекст устройства
  • Нарисовать что-либо (черные пикселы станут прозрачными, белые – видимыми)
  • Создать регион из изображения (wxRegion)
  • Указать форме регион для отображения
void wxMobileTransparencyMainFrame::ChangeShape()
{
        int width(0), height(0);
        // Получаем размер окна
        GetClientSize(&width, &height);
        // Создаем изображение
        wxBitmap bitmap(width, height);
        // Создаем Device Context для изображения
        wxMemoryDC mdc(bitmap);
        // Заполняем черным цветом
        mdc.SetBackground(*wxBLACK_BRUSH);
        mdc.Clear();
        // Устанавливаем кисть белого цвета
        mdc.SetPen(*wxWHITE_PEN);
        wxPoint center(width/2, height/2);
        int radius = wxMin(width, height)/2;
        // Рисуем круг в центре
        mdc.DrawCircle(center, radius);
        // Устанавливаем кисть черного цвета
        mdc.SetPen(*wxBLACK_PEN);
        mdc.SetBrush(*wxBLACK_BRUSH);
        // Рисуем
        mdc.DrawCircle(center.x - radius/3, center.y-radius/4, radius/6);
        mdc.DrawCircle(center.x + radius/3, center.y-radius/4, radius/6);
        mdc.DrawEllipticArc(center.x-radius/3, center.y+radius/4,
                2 * radius / 3, radius/2,
                180, 360);
        // Освобождаем Device Context
        mdc.SelectObject(wxNullBitmap);
        // Создаем новый регион
        m_Region = new wxRegion(bitmap, *wxBLACK);
#if defined(__WXWINCE__)
        // Для wxWinCE метод SetRegion() ничего не делает, просто возвращает false.
        // Поэтому приходится устанавливать регион вручную
        HRGN hRgn = (HRGN)m_Region->GetHRGN();
        ::SetWindowRgn((HWND)GetHWND(), hRgn, FALSE);
#else
        int offset = GetSize().GetHeight()-GetClientSize().GetHeight();
        m_Region->Offset(0, offset);
        // Устанавливаем регион
        SetShape(*m_Region);
#endif
}

Создаем окно непрямоугольной формы в Windows Mobile
Скачать исходник: Создаем окно непрямоугольной формы в Windows Mobile

Еще интересные посты о программировании для мобильных устройств:

No Comments

Make A Comment

No comments yet.

Comments RSS Feed   TrackBack URL

Leave a comment

Please leave these two fields as-is:
Продолжается набор слушателей: курсы флористики. ; Пиломатериал в Москве от 2700 руб - бани из бруса. Ищете пиломатериалы? ; пенобетон в одессе ; банк москвы, в каком банке выгоднее ?

top