Вопросы по программированию.

Модератор: Модераторы

Вопросы по программированию.

Сообщение AnarchyMob » 17.11.2008 01:00:51

Вот решил задать несколько вопросов связанных с компилятором FreePascal и операционной системой Windows CE.

Первый вопрос такой: как создать MenuBar. Я использую такую функцию

Код: Выделить всё
function CreateMenuBar(hInst: HANDLE; Parent: HWND; ResID: Integer): HWND;
var
  mbi: SHMENUBARINFO;
  BR: TRect;
begin
  Result := 0;
  GetWindowRect(Parent, BR);
  mbi.hwndMB := SHFindMenuBar(Parent);
  if mbi.hwndMB <> 0 then
  begin
    DestroyWindow(mbi.hwndMB);
    mbi.hwndMB := 0;
  end;
  FillChar(mbi, SizeOf(mbi), 0);
  mbi.cbSize := SizeOf(mbi);
  mbi.hwndParent := Parent;
  mbi.dwFlags := SHCMBF_EMPTYBAR;
  mbi.nToolBarId := ResID;
  mbi.hInstRes := hInst;
  if SHCreateMenuBar(@mbi) then
  Result := mbi.hwndMB;
end;
вызываю так:
Код: Выделить всё
CreateMenuBar(hInstance, Wnd, 2001);
в итоге создается бар, но пустой т.е. без собственно самого меню, что я только с этим кодом не делал, результат nil.

Второй вопрос связан с диалогами из ресурса. Код вызова диалога следующий:

Код: Выделить всё
DialogBox(hInstance, MAKEINTRESOURCE(1001), Wnd, DLGPROC(@mDlgProc));
, диалоговая функция выглядит так:
Код: Выделить всё
function mDlgProc(Dlg: HWND; mms: integer; wparam: WPARAM; lparam: LPARAM): INT_PTR; STDCALL;
var
  shidi: SHINITDLGINFO;
begin
  case mms of
  WM_INITDIALOG:
  begin
    shidi.dwMask := SHIDIM_FLAGS;
    shidi.dwFlags := SHIDIF_DONEBUTTON or SHIDIF_SIPDOWN or SHIDIF_SIZEDLGFULLSCREEN;
    shidi.hDlg := Dlg;
    SHInitDialog(@shidi);
    Result := INT_PTR(True);
  end;
  WM_PAINT:
  begin
    //todo
  end;
  WM_CLOSE: EndDialog(Dlg, mms);
  end; //case of
  Result := INT_PTR(True);
end;
. Тут проблема в том что диалог показывается как на десктопе т.е. по середине экрана так что его можно двигать по экрану, этот же диалог вызванный в программе написанной на C (в среде PellesC) отображается как надо.

P.S.
Я решил в ответ на библиотеку KOL портированную для Win CE, портировать LENIN_INC для Win CE, уже несколько десятков функций успешно портированно, эта библиотека лучше чем KOL т.к. не использует ни классы ни объекты (используется "голый WinAPI"), и поэтому проги написанные с использованием этой библиотеки весят "катастрофически" мало, а оперативной памяти потребляют минимум (KOL оперативку "кушает не стесняясь"). Месяца эдак через четыре - пять выложу портированную версию библы.
AnarchyMob
новенький
 
Сообщения: 13
Зарегистрирован: 16.11.2008 23:44:36

Re: Вопросы по программированию.

Сообщение FedeX » 17.11.2008 20:48:50

Насчёт менюбара - вот код который я использовал:
Код: Выделить всё
                    ZeroMemory(@mbi,sizeof(mbi));

                    mbi.cbSize:= sizeof(mbi);

                    mbi.dwFlags:=SHCMBF_HMENU;

                    mbi.hwndParent:= wnd;

                    mbi.nToolBarId:= MENU_ID;

                    mbi.hInstRes:= hInstance;

                    SHCreateMenuBar(@mbi);

                    mb:=mbi.hwndMB;

в mbi.nToolBarId надо записать идентификатор предварительно вкомпилированного ресурса с описанием туллбара (там какой-то такой идиотский формат :roll: ) Кстати работало это только на смартфонах и под WM5-6...

Насчёт диалога из ресурсов, я делал так:
Код: Выделить всё
    WM_INITDIALOG:begin

                    ZeroMemory(@idi,sizeof(idi));

                    idi.dwMask:=SHIDIM_FLAGS;

                    idi.dwFlags:=SHIDIF_SIZEDLGFULLSCREEN;

                    idi.hDlg:=wnd;

                    SHInitDialog(@idi);


А вообще насчёт всего этого советую посмотреть в исходники того же КОЛ. Там я вроде видел даже динамическое создание меню (тоесть основа меню вроде всёравно как и везде грузиться из ресурсов, но пункты строяться динамически)..
Я тоже думал чисто для себя какую-нить надстройку обьектную написать для WinCE, когда КОЛ-СЕ был ещё сильной бетой, но времени мало, а апи WinCE особенно в области создания диалогов и менюшек какой-то сильно сумбурный (даже по сравнению с Win32 API). Так что решил использовать пока KOL. Ещё кстати была где-то одна такая надстройка для WinCE и FPC. Только не помню как называлась...
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Вопросы по программированию.

Сообщение AnarchyMob » 17.11.2008 22:36:59

Спасибо, еще не проверил, но мне кажется должно всё заработать, а насчет своего кода, то я итак брал его из KOL. Я что думаю, может у меня ресурсы не подходят, я все менюшки и диалоги делаю в программе PellesC, кстати очень замечательная среда для разработки в которой можно писать под WinCE, базируется на языке C, а ты где создаёшь ресурсы?
AnarchyMob
новенький
 
Сообщения: 13
Зарегистрирован: 16.11.2008 23:44:36

Re: Вопросы по программированию.

Сообщение FedeX » 18.11.2008 14:11:35

C PellesC знаком. Если бы там был С++ может быть даже использовал бы его..
Ресурсы пробовал создавать в разных программах.. Насколько я понял WinCE ресурсы полностью или почти полностью совместимы с ресурсами обычной Windows. Сейчас чаще всего для добавления иконок или битмапов использую XN Resource Editor. Ресурсы диалогов\меню\тулбаров и пр.. я сейчас не готовлю так-как делаю это всё на КОЛ в редакторе форм. Но когда пробовал использовать чистое WinCE API проблемы были только с ресурсом туллбара. Я не нашёл редактора, способного приготовить такой ресурс. Кажеться единственным выходом было писать ресурсный скрипт вручную и компилировать при помощи arm-windres . В бистрибутиве FPC для ARM (без Лазаруса) есть пример простой программки для WinCE и там как-раз лежит пример такого скрипта.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Вопросы по программированию.

Сообщение AnarchyMob » 18.11.2008 15:16:17

С меню всё получилось, ресурсный файл с меню я сделал в VS2005, всё работает, (как я понял PellesC компилирует ресурсы "под себя" и поэтому если в любом меню добавить разделитель то оно в Lazarus будет работать некорректно) у меня была такая ошибка я использовал SHCMBF_EMPTYB потому-что я брал код из KOL, а там используется динамическое добавление пунктов в меню, а мне надо SHCMBF_HMENU тогда используется меню из ресурса. А с диалогом что-то никак я сделал вывод что сообщение WM_INITDIALOG окну не посылается, я в обработке этого сообщения производил разные действия, но они не выполняются. Я что подумал может сообщение WM_INITDIALOG приходит главному окну?
AnarchyMob
новенький
 
Сообщения: 13
Зарегистрирован: 16.11.2008 23:44:36

Re: Вопросы по программированию.

Сообщение Fantomas » 07.12.2008 18:47:08

AnarchyMob писал(а):А с диалогом что-то никак я сделал вывод что сообщение WM_INITDIALOG окну не посылается, я в обработке этого сообщения производил разные действия, но они не выполняются. Я что подумал может сообщение WM_INITDIALOG приходит главному окну?


Насколько мне известно, WM_INITDIALOG посылается окну, созданному одной из функций API типа CreateDialogXXX, которые грузят шаблон окна из ресурса или получаю ссылку на блок памяти с шаблоном. Кажется, KOL, а может и Lazarus не используют таковые функции, а вместо них вызывают обычные CreateWindow/CreateWindowEx. Эти окна при инициализации получают сообщения WM_NCCREATE и WM_CREATE.
Fantomas
новенький
 
Сообщения: 14
Зарегистрирован: 09.04.2008 19:12:50


Вернуться в WinCE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru