Евгений Музыченко (emuzychenko) wrote,
Евгений Музыченко
emuzychenko

Categories:

WinCE и WinMobile

Имея КПК на WM2003, обзаведясь автокомбайном на CE6, и подарив Алечке планшетку на CE6, повадился я пописывать для ARM. :) Опыт многолетнего программирования для Win3/9x/ME/NT/2k/XP/2k3/Vista/Win7, а также опыт по созданию не совсем тривиальных программ, работающих от Win95 до Win7, имеется, опыт копания в кривой и туповатой документации от MS тоже имеется. Исходя из этого, я оптимистично полагал, что никаких особых затруднений возникнуть не должно.

Во-первых, выяснилось, что, если документация по настольным Windows - это ужас, то документация по встроенным - это ужас-ужас-ужас. Если из основной документации явные ошибки обычно вычищают через 3-5 лет, то из этой - явно не раньше, чем через 10. Например, открываем описание функции CreateWindow:

WS_OVERLAPPEDWINDOW
Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles.
Note:
Although WS_OVERLAPPEDWINDOW is not supported in Windows Embedded CE, the functionality can still be achieved by obtaining a bitwise OR of the style flags WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX.

Интересно, какому идиоту могло прийти в голову убрать определение WS_OVERLAPPEDWINDOW, чтобы тут же предложить определить его самостоятельно в том же самом виде?

hMenu
Handle to a menu, or specifies a child-window identifier depending on the window style. For an overlapped or pop-up window, hMenu identifies the menu to be used with the window; it can be NULL if the class menu is to be used. For a child window, hMenu specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The application determines the child-window identifier; it must be unique for all child windows with the same parent window.

То есть, все в порядке - меню работают, как и в самых ранних виндах 80-х годов. Пишем код, компилируем, запускаем. А хрен. Никаких ошибок - просто не работает. Пробуем так и этак - не работает. Тогда начинаем читать все подряд, и ниже находим:

Remarks
Menu bars are not supported. The hMenu parameter must be NULL, unless it is used as a child-window identifier.

Прелестно. Какого ж хера выше написано, что этот параметр что-то там identifies? Тут только одно объяснение - тупой индийский планктон, будучи уверен, что его никто никогда не проверит, скопировал описание из настольной версии, а потом, когда кто-то увидел и спохватился - добавил примечаньице.

Далее, начинаем искать способ создания оконного меню. Выясняется, что для этого есть функции и макросы CommandBar_xxx - сначала создается тулбар, потом на него вызовом CommandBar_InsertMenuBar вешается меню, либо через HMENU, либо через прямое указание ресурса. Мой мозг отказывается понимать причины, по которым они не стали поддерживать указание HMENU при создании окна - там можно было неявно создавать тулбар, обошлось бы в сотню байтов кода, зато была бы снята серьезная проблема с переносом настольных программ.

Ладно, черт с вами - создаем меню через CommandBar. В WinCE оно видно, а в WinMobile виден только пустой тулбар. На вопрос, какого черта, в MSDN уже ответов не находится. Тогда лезем в гугл, и опаньки - оказывается, они и это не поддерживали вплоть до WM5. Причем, не просто не поддерживали, а делали это тихо и по-свински - ничего не делали, а предусмотренный код ошибки не возвращали. Для создания тулбара с меню под WM придумали другую функцию - SHCreateMenuBar, которая загружает тулбар из ресурсов, а заодно может повесить на него и меню из HMENU.

Иными словами, программа для CE должна пользоваться CommandBar_xxx, а программа для WM - SHCreateMenuBar. Какого ж лешего они талдычат о совместимости на фоне такого издевательства? :) Ведь не фиг делать построить систему управления так, чтобы основные функции совпадали, а исполняющая система CE нехай создает тулбар сверху, WM - снизу, кому надо тонкостей - те либо скомпилируют под конкретную систему, либо озаботятся уточнением типа и версии системы.

Впрочем, судя по тому, что в WM5 таки добавили поддержку CommandBar_InsertMenuBar, немного мозгов в MS таки нашлось. И десяти лет не прошло, да.

Вообще, при чтении документации возникает ощущение, что писатели от MS сами давно запутались, и с трудом понимают, где идет речь о CE, а где - о Mobile... :)

Tags: компьютеры, криворукие, недовольство, программирование, техника
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 13 comments