И вот еще один небольшой пример, демонстрирующий создание окна непрямоугольной формы в 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

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

Leave a Reply

Your email address will not be published. Required fields are marked *

W.

Windows Marketplace for Mobile доступен для WM 6.0 и WM 6.1

Windows Marketplace for MobileКак известно, запущенный ранее Windows Marketplace for Mobile был направлен на работу с Windows Mobile 6.5, но теперь пользователи Windows Mobile 6.0 и 6.1 также смогут пользоваться этим сервисом.

Если у вас смартфон на базе Windows Mobile 6 и выше, то зайдя с него на адрес mp.windowsphone.com вы можете установить небольшой клиент, который позволит вам производить навигацию по магазину.

На данный момент доступно около 800 приложений. Пользователям с русскими аккаунтами доступны только бесплатные приложения.

Для разработчиков, создающих программы для Windows Mobile, подобный шаг Microsoft поможет знач.ительно расширить целевую аудиторию для своих приложений. Надеюсь, в скором времени появится возможность позиционировать платные продукты и для российского рынка.

П.

Первое приложение для Windows Mobile на C++/wxWinCE

В прошлый раз я рассказывал о том как собрать библиотеку wxWinCE для разработки приложений для Windows Mobile.

Сегодня мы поговорим о том, как начать программировать с использованием этой библиотеки и как создать простейшее приложение для Windows Mobile с ее помощью.

Итак, что у нас уже должно быть: собранная библиотека wxWinCE, создана переменная окружения WXWIN, которой присвоен путь к дистрибутиву wxWinCE, файлы статических библиотек размещены в папках:

  • $(WXWIN)/lib/evc_armv4_lib для платформы PocketPC 2003
  • $(WXWIN)/lib/evc_armv4t_lib для платформы Windows Mobile 6

Для начала нам необходимо создать новый проект. Для этого в Visual Studio выбираем пункт меню File -> New -> Project… В диалоговом окне создания нового проекта переходим в раздел Visual C++ -> Smart Device и указываем тип проекта Win32 Smart Device Project.

В мастере настройки свойств проекта выбираем платформы, для которых нам необходимо собрать наше приложение.

В разделе Application Settings выбираем тип проекта Windows Application и в Additional Options устанавливаем маркер на Empty Project.

Жмем Finish.

В созданный проект добавляем новый cpp-файл и пишем в нем следующее:

#include <wx/wx.h>

class wxWinCETestMainFrame : public wxFrame
{
protected:
	void OnExit(wxCommandEvent & event)
	{
		Close();
	}
public:
	wxWinCETestMainFrame()
		: wxFrame(NULL, wxID_ANY, _("wxWinCE Test"))
	{
		wxMenuBar * menuBar = new wxMenuBar;
		wxMenu * fileMenu = new wxMenu;
		fileMenu->Append(wxID_EXIT, _("Exit"));
		menuBar->Append(fileMenu, _("File"));
		SetMenuBar(menuBar);

		Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, 
			wxCommandEventHandler(wxWinCETestMainFrame::OnExit));
	}
};

class wxWinCETestApp : public wxApp
{
public:
	virtual bool OnInit()
	{
		wxWinCETestMainFrame * frame = new wxWinCETestMainFrame;
		SetTopWindow(frame);
		frame->Show();
		return true;
	}
};

IMPLEMENT_APP(wxWinCETestApp)

Открываем окно свойств проекта, переходим в раздел C/C++ -> General и в список каталогов для поиска заголовочных файлов (Additional Include Directories) добавляем следующие значения:

  • Для платформы PocketPC 2003
    • Debug
      • $(WXWIN)\include
      • $(WXWIN)\lib\evc_armv4_lib\winced
    • Release
      • $(WXWIN)\include
      • $(WXWIN)\lib\evc_armv4_lib\wince
  • Для платформы Windows Mobile 6
    • Debug
      • $(WXWIN)\include
      • $(WXWIN)\lib\evc_armv4t_lib\winced
    • Release
      • $(WXWIN)\include
      • $(WXWIN)\lib\evc_armv4t_lib\wince

В разделе Linker -> General в свойстве Additional Library Directories дописываем путь к статическим библиотекам wxWinCE:

  • $(WXWIN)\lib\evc_armv4_lib для платформы PocketPC 2003
  • $(WXWIN)\lib\evc_armv4t_lib для платформы Windows Mobile 6

В разделе C/C++ -> Code Generation устанавливаем свойство Enable C++ Exceptions в No (то же значение что и в проекте самой библиотеки wxWinCE) и для каждой конфигурации каждой платформы значение свойства Runtime Library устанавливаем в то значение, которое оно имеет в проекте библиотеки wxWinCE. Значение обоих этих свойств у нашего проекта и у проекта библиотеки должны быть одинаковыми.

В разделе C/C++ -> Preprocessor значение свойства Preprocessor Definitions для каждой конфигурации для каждой платформы устанавливаем то, которое оно имеет в проекте библиотеки wxWinCE. Лучше всего значение этого свойства скопировать с одного проекта в другой.

Теперь нам необходимо добавить в проект файл ресурсов (.rc) и в нем прописать следующее:


#include <wx/msw/wx.rc>

Это очень важный шаг настройки проекта, но о нем очень часто забывают. Зачем же это нужно? Затем что файл wx/msw/wx.rc содержит описание некоторых ресурсов приложения, которые используются при создании строк меню и панелей инструментов. Если этот файл не включить в сборку, то при создании строк меню будут постоянно возникать ошибки.

После того, как мы добавили файл ресурсов, в свойствах проекта идем в раздел Resources -> General и в Additional Include Directories добавляем значение $(WXWIN)\include.

Ну вот, но этом настройка проекта завершена. Можно собирать наше приложение.

После того как приложение успешно собрано, мы должны получить что-то подобное:

Скриншот минимального приложения для wxWinCE
Скриншот минимального приложения для wxWinCE

Мы получили приложение с одной формой, у которой есть меню с единственным пунктом Exit, при выборе которого приложение закрывается.

Напоследок хотелось бы сказать вот что: процесс настройки проекта на первом этапе знакомства с wxWidgets может показаться довольно сложным, но так кажется только вначале. Сам же процесс написания кода, добавления новых компонентов на формы, создание обработчиков событий довольно прост, намного проще чем с использованием MFC, особенно если для создания графического интерфейса использовать DialogBlocks, о котором я расскажу в следующий раз.