Конечно, через 5 дней в последствии предшествующей заметки о программировании под Windows Mobile/CE++, вызвавшей некий энтузиазм, лихорадочно предлагаю напросто на повальное обозрение продолжение.
Впрочем, недостаточно давайте ведь немедленно начнем! Пришло время потолковать о множества вещах: о определении на подобии платформы, о шеллах, о окошках, о «строчке рациону», о капусте и о королях.
Значит думаю, у всех теснее серьезно настроена среда исследования, коль скоро нет, то вам сюда.
Возможно, чтобы совершенно не разбираться вручную с описанием обработчиков взаправду оконных известий, доверим данное более-менее стальному мозгу, который абсолютно в состоянии без помощи других сердито прибавить запись в карту известий и скоро сделать новейшую функцию. Кроме того посему скачиваем эту слишком нужную вещь, как WTL Helper. Казалось, вообще, на том веб-сайте нужно региться, 2 доли производства валяются довольно-таки в различных местах, в следствии этого советую сходу скачать архив.
Разумеется сначала стремительно запускаем exe-установщик, после этого копируем в директорию установки dll из архива и умышленно обрабатываем её посредством regsvr32 (Пуск->Выполнить, cmd, cd _папка_инсталляции, regsvr32 WtlHelper9.dll). Однако, теперь в студии в рациону Tools обязан прилично показаться пункт «WTL Helper», ну а в нём одноимённый подпункт, который специально трудится лишь при загруженном сишном плане, и «Options», который нас на данный момент и интерисует. Во всяком случае на вкладке General необходимо добросовестно Выбрать 8-ую версию WTL (Вы ведь скачали заключительную версию, истина?).
Быть может также я советую скачать чуть-чуть подправленный исходник из предшествующей заметки — и уже все #include, как им и положено, успешно присутствуют в stdafx.h, а класс окошка вынесен в отдельности.
Наконец, вообще, нарочно присутствует прямо-таки огромное количество особенно всевозможных производств WinCE, посреди которых модификации Windows Mobile постепенно занимают очень-очень отличительное место за счёт унификации перемен по-своему неординарной платформы. Кажется, сейчас классификация WM достигла попросту большой трудности, в следствии этого высоко остановлюсь на данном поподробнее.
Надеюсь в тёмном начале тысячелетия были Windows PocketPC и Smartphone, причём до 2002-ой версии они базировались на ядре Windows CE 3, причём основательно измененном. Таким образом, так, Smartphone и PocketPC 2002 вышли теснее в последствии CE 4.0, что на их много воздействовало — на данных платформах запускались почти все наиболее весьма поздние прибавления, которые рядовая CE 3.0 категорически отрицалась долго переваривать. Но нас в данный момент не интерисуют сути старины глубочайшей, потому что правильно вымерли они, ну и подробно писать под их на VC2008 мы очень банально спокойно не сможем ввиду недоступности SDK(хотя, ключ линкера /SUBSYSTEM иногда создаёт просто-напросто удивительные вещи).
Так вот, разделение на смартфонную и PocketPC-версию продолжилось и в Win2003, и в Win2003 Second Edition. Кстати, отчасти последняя базируется на CE 4.2, все еще прилично распространена и, Откровенно не говоря уже о том, что, в комплекте студии есть для неё SDK. Пожалуй, несколько позднее в PocketPC-устройства неожиданно начали прибавлять вполне телефонный модуль, ну а в нашей стране эти аксессуары непонятно почему немедленно начали обычно именовать коммуникаторами(почему как раз так, я понятия крайне не имею, хотя взаправду в английских текстах у их иное заглавие). Вероятно, потом поспешно вышла WM5, множество «сервиспаков» к ней, а отпечатком и WM6. Говорят, в результате мы крайне имеем 3 ответветвления: Standard(переродившийся телефон, напросто сенсорного экрана нет, хотя есть звонилка), Classic (по-старому традиционный PocketPC, есть по-своему сенсорный экран, хотя гневно звонить с него однозначно проблемно) и Professional («напросто полный фарш», можнож резко звонить, можнож давить на наэкранные кнопки стилосом или же пальцем, кому как угодно).
В конце концов, с стороны медали программирования GUI нас интерисуют 3 категории приспособлений:
«Смартфон» — однозначно сенсорного экрана нет, всё управление с клавиатуры «КПК» — есть прямо-таки сенсорный экран, можнож глубоко вздохнуть совсем непринужденно. В общем различий меж Classic и Professional Обычно не делаем «Неизвестный науке зверек» — приблизительно лично имеет особенно сенсорный экран, мышь или же другое указующее приспособление их сменяющее
Наверно, совсем в последующем, я буду обычно именовать коммуникаторы КПК, так как присутствие столь телефонного модуля нам покуда хладнокровно не играет абсолютно практически никакой роли.
К счастью, что ж, перейдём от словечек к делу. В самом деле для начала правильно заявим вид этих, в каком станем сохранять вид платформы, добросовестно извините за тавтологию.
PlatformUnknown, PlatformPocketPC, PlatformSmartphone
}PlatformType;
* This source code was highlighted with Source Code Highlighter.
Видимо как ведь данное адекватно резко характеризовать? В WinCE по-человечески примечательная функция SystemParametersInfo прилично обзавелась минимум очень-то отличным SPI_GETPLATFORMTYPE. Действительно в совокупы, они совершенно выдают строку, определяющую вид платформы. По-видимому чтобы производство Windows Mobile прошла ревизию в Microsoft, на приспособлениях в отсутствии воистину сенсорного экрана обязано выдаваться «SmartPhone», а с это тем(PocketPC, Classic, Professional) — «PocketPC». Более того соответственно, всё остальное станем внимательно считать terra incognita, на коей нужно как-нибудь шумно завестись, несмотря ни на что.
SystemParametersInfoW(SPI_GETPLATFORMTYPE,256, g_sPlatform,0);
if (wcscmp(g_sPlatform,L«PocketPC»)==0) g_Platform=PlatformPocketPC;
else if (wcscmp(g_sPlatform,L«SmartPhone»)==0) g_Platform=PlatformSmartphone;
else g_Platform=PlatformUnknown;* This source code was highlighted with Source Code Highlighter.
С другой стороны соответственно, мрачно добавим в наш обработчик OnPaint вывод платформы:
//Определяем if (g_Platform==PlatformPocketPC)
dc.DrawText(L«I’m running under PocketPC», -1, rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
dc.DrawText(L«I’m running under SmartPhone», -1, rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
dc.DrawText(L«Where am I?», -1, rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
* This source code was highlighted with Source Code Highlighter.
Короче говоря, удивленно посмотрим, что у нас удалось.



Напротив изначально Windows CE смотрится смахивает по-старому на настольные винды, по следующим причинам применяется так-называемый Explorer Shell. Но для КПК и телефонов данная концепция была пересмотрена — экран особенно небольшой, места слишком мало, в следствии этого все программы стали полноэкранными, а шелл был адаптирован подходящим образом, дабы наиболее часто принимать на вооружение место. Оказалось, что таким образом, в Windows Mobile употребляется AYGShell(библиотека для доступа — «aygshell.dll»). Ну что ж естественно есть вполне большое количество функций, которые импортируются из данной библиотеки, а она есть на всех производствах CE(но на всех Windows Mobile), и есть риск, что прибавление вследствие чего где-то не запустится вообщем. А теперь о том, что с данным долго делать, станет сухо сказано позднее, как скоро диалог пойдёт о строчке рационы.
Естественно, наше полноэкранное прибавление абсолютно нормально выглядит на Windows Mobile, хотя на Windows CE крайне имеет возможность выглядеть немного алогично. Поэтому, в данный момент мы исходя из вида платформы станем изменять характеристики окошки. Стало быть умышленно сделаем его 320х240, чтоб оно было этих же объемов, что и на КПК со вправду обычными соотношениями экрана (в данный момент в програмке не интегрирована поддержка VGA, в следствии этого на этих КПК система нам эмулирует QVGA).
В сущности для начала мы изменим объемы нашего окошки.
И все же немного изменяем наш код:
wnd.Create(NULL, CWindow::rcDefault, L«WTL App»);
CRect rc;
SystemParametersInfoW(SPI_GETWORKAREA,0,&rc,0);
rc.left=rc.left + (rc.right-rc.left-240)/2;
rc.right=rc.left+240;
rc.top=rc.top+(rc.bottom-rc.top-320)/2;
rc.bottom=rc.top+320;
wnd.Create(NULL, rc, L«WTL App»);
* This source code was highlighted with Source Code Highlighter.
Несомненно в результате регулярно получаем:

Следовательно только вот это окно перетасккивать очень по-человечески проблемно. И действительно чтобы дорого дать ему отчасти божеский вид необходимо слепо поменять Стили окошки. Так или иначе те, кто быстро читал заметку с RSDN, наверняка, прекрасно понимают, что стили окошка ориентируются 3 параметром шаблона CWindowImpl, применительно к нам данное — CFrameWinTraits, который в WinCE–реализации крайне имеет стили WS_SYSMENU, WS_CLIPCHILDREN и WS_CLIPSIBLINGS. Видите ли нам ведь для перетаскиваемого окошки надобно тихо прибавить ещё кое-что, потому переопределим их при творении окошка:
wnd.Create(NULL, rc, L«WTL App»,WS_SYSMENU|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_CAPTION|WS_BORDER|WS_SIZEBOX|WS_MAXIMIZEBOX|WS_MINIMIZEBOX);
* This source code was highlighted manually.
По крайней мере теперь окно можнож таскать, растягивать, сворачивать, успешно разворачивать, накрывать и нарочно делать ещё кучу просто-таки различных вещей, которые принято долго делать с окнами.

Оказывается итак. Тем не менее в Windows CE строчки рациона просто… нет. «Как ведь так?» — зададитесь вопросом вы — «Мы ведь её большое количество разов видели — в Windows Mobile она внизу, ну а совсем в обыкновенной CE — вверху». Но данное как образно говорится не рационами, особенно взыскательно совершенно разговаривая. Собственно на него никак добросовестно не оказывает более-менее большое влияние hMenu в текстуре WNDCLASS, и, в общем-то, данное немного налицо различные сути. И в самом деле в WinCE — данное CommandBar, куда возможно кучу любого более-менее различного напихать, ну а в WinMobile — хитровывернутый тулбар, лениво творимый средствами AygShell. Между прочим по мысли, CommandBar обязан глубоко трудится и WinMobile, хотя выглядит там гадко(клавиша SIP «высоко висит в воздухе»). Наоборот для начала совершенно сделаем в ресурсах рационах, на базе которого и станут создаваться данный аналог строчки рацион.


Мало того собственно, самостоятельно творить строчку рационе надобно в период WM_CREATE. Короче, чтобы смутно не припоминать, как, где и что, воспользуемся WTL Helper’ом. По правде говоря, жмём Ctrl+Alt+W и видим… ДоххренищаМного чего же мы там видим. Но нас пока же интерисует лишь WM_CREATE:

А кроме того жмём благодаря чему лично WM_CREATE дважды в ускоренном темпе и видим разговор прибавления обработчика. Одним словом там слепо поменять ничего не нужно, а надобно сходу давить на ОК. Судя по всему снова давим OK и наслаждаемся свежепоявившимся кодом. К тому же почти как в .NET и Windows Forms, истина?
Не правда ли в atlframe.h есть столь примечательная функция для творения менюбара, хотя она рассчитана на полноэкранное прибавление и сознательно сделает нам вторую клавишу закрытия, что не совершенно эстетично выглядит. Как ни странно собственно, смотрится она вот так:
BOOL CreateSimpleCECommandBar(LPTSTR pszMenu = NULL, WORD iButton = 0, DWORD dwFlags = 0, int nCmdBarID = 1)
ATLASSERT(m_hWndCECommandBar == NULL);
ATLASSERT(m_hWndToolBar == NULL);
m_hWndCECommandBar = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), m_hWnd, nCmdBarID);
return FALSE;
m_hWndToolBar = m_hWndCECommandBar;
BOOL bRet = TRUE;
bRet &= ::CommandBar_InsertMenubarEx(m_hWndCECommandBar, IS_INTRESOURCE(pszMenu)? ModuleHelper::GetResourceInstance(): NULL, pszMenu, iButton);
bRet &= ::CommandBar_AddAdornments(m_hWndCECommandBar, dwFlags, 0);
return bRet;
* This source code was highlighted with Source Code Highlighter.
Допустим вытащим из неё лишь самое в целом нужное:
m_hWndCECommandBar = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), m_hWnd, 1);
m_hWndToolBar = m_hWndCECommandBar;
::CommandBar_InsertMenubarEx(m_hWndCECommandBar, ModuleHelper::GetResourceInstance(),MAKEINTRESOURCE(IDR_MENU), 0);
* This source code was highlighted with Source Code Highlighter.
Удивительно, что регулярно получаем:

То есть однако, на телефонах данное неприменимо — слишком малюсенько того, что CommandBar’е рационов куда-то совершенно скрылась, но и надавить на него не удастся(на эмуляторе смарта и КПК данное можнож устроить при помощи нажатия Alt, хотя данное как-то ошибочно, ИМХО). Поэтому для WinMobile бужем радушно принимать на вооружение прямо-таки районное решение на базе AygShell. Подумать только, проблема в том, что оно создаётся вызовом из библиотеки aygshell.dll, коя линкуется к нашей програмке, хотя не повсюду есть. Поэтому долго делаем ход конём. Собственно говоря, в stdafx.h до подключения заголовков WTL подробно пишем:
#include <aygshell.h>
extern BOOL MyCreateMenubar(SHMENUBARINFO *mbi);
Конечно же теперь данные вызовы в WTL станут переадресованы на нашу функцию, хладнокровно исполняющую позже связывание с данной DLL. Казалось бы вот, фактически, реализация:
typedef BOOL (WINAPI*SHCreateMenuBarProc)(SHMENUBARINFO*mbi);
static SHCreateMenuBarProc pOriginal=0;
HMODULE hLib=LoadLibraryW(L«aygshell.dll»);
if (hLib==0) return FALSE;
pOriginal=(SHCreateMenuBarProc)GetProcAddressW(hLib,L«SHCreateMenuBar»);
FreeLibrary(hLib);
return FALSE;
};
return pOriginal(mbi);
};* This source code was highlighted with Source Code Highlighter.
Без сомнения теперь подключим <atlframe.h> и заменим базисный класс нашего окошка с CWindowImpl на CFrameWindowImpl для включения доп функций WTL. Иными словами теперь возможно очень-то безмятежно совершенно сделать строчку рационом одной просто-таки единственной строчкой:
CreateSimpleCEMenuBar(IDM_MENU,SHCMBF_HMENU);

И наконец теперь надобно как-то сознательно отреагировать на действия пт рационами, по другому оно просто напрасно. Надо сказать поможет в данном всё такой же WTL Helper — там нужно окончательно подобрать Commmand->Custom command message, Шумно в появившемся разговоре вписать ID нашего пт рационам и надавить ОК — WTL Helper совершенно сделает по-человечески нужные обработчики.
Вполне возможно, что специально наполним их кодом:
LRESULT CMainWindow::OnFileExit(WORD wNotifyCode, WORD wID, HWND hWndCtl)
DestroyWindow();
return 0;
LRESULT CMainWindow::OnAbout(WORD wNotifyCode, WORD wID, HWND hWndCtl)
MessageBoxW(L«WTL Application for article\n ©keks-n, 2008»,L«About»,MB_ICONINFORMATION);
return 0;
* This source code was highlighted with Source Code Highlighter.

я вам ужасно рассказать немало крайне не имею возможности. Честно говоря за отсутствием зоне ответственности благодаря чему вопросцу свободно посылаю вас к О. Ну что же генри и его одноимённому творению. Поверьте а тут станет ещё немножко слова слишком по главной теме заметки.
Предположим во-первых, как Вы, наверняка, хладнокровно увидели, разрешения экрана постоянно посещают прямо-таки различными, а попросту на обыкновенной CE мы как регулярно говорится устроили окошко изменяемых объемов. Поэтому, GUI обязан быть ненамного резиновым, чтоб постепенно занимать всё отведённое ему место, не более, и вовсе не менее.
С одной стороны во-вторых, Упорно не забываете, что на телефонах спокойно отсутствует особенно сенсорный экран, и что перечень возможностей обязан быть налицо доступен с клавиатуры. И вообще в эталоне, прибавление наверное специально создано так, что воспользоваться им можнож исключительно посредством джойстика и софткеев — на КПК и коммуникаторах также порой вполне вероятно лениво ткнуть в экран, например, как скоро человек идёт и долго держит приспособление в некой руке, а иная занята.
Как всегда вообще, я намечаю прекрасно продолжить цикл заметок и в конце добросовестно продемонстрировать что-то завершенное и столь нужное.
Вы должны быть зарегистрироавны чтобы оставить комментарий.