Конференция "KOL" » Вопросы по Win CE [Lazarus & KOL, Windows CE]
 
  • AnarchyMob © (09.10.08 02:22) [0]
    Просмотрел всю конференцию, ответов так и не нашел, вопросов накопилось немало вот главные из них:
    1) Поиск файлов

    Создаю OpenDialog для КПК воспользовался API функциями FindFirstFile & FindNextFile & FindClose, атрибуты поиска поставил FILE_FIND_DERICTORY (может немного ошибся, но это не суть важно) т.е. поиск папок, но в результате в ListView попадает все, и папки и обычные файлы и скрытые, короче все подряд, фильтр ставил '\*.*' и '\' в любом случае выводиться все, подскажите пожалуйста что делать.

    2)Контекстное меню

    Как в Win CE используя KOL реализовать контекстное меню, или какое возникает событие при долгом тапе. Спасибо.

    3)OwnerDraw

    Подскажите как вывести в контекст кнопки (и подобных компонентов) битмап, если можно дайте код, и как изменить цвета в ListView т.е. цвет фона цвет шрифта цвет выделения и.т.д.. Заранее благодарен.

    P.S.
    БОЛЬШОЕ СПАСИБО модераторам которые УДАЛИЛИ три моих вопроса, кстати очень актуальных, которые важны не только мне, но и другим программистам пишущих программы под Win CE.
  • mdw © (09.10.08 10:58) [1]

    > 2)Контекстное менюКак в Win CE используя KOL реализовать
    > контекстное меню, или какое возникает событие при долгом
    > тапе. Спасибо.

    MyControl.SetAutoPopupMenu(MyPopupMenu);


    > 3)OwnerDrawПодскажите как вывести в контекст кнопки (и подобных
    > компонентов) битмап, если можно дайте код,

    Вот работающий код
    ...
       btnShellFolderUp: TKOLBitBtn;
    ...
    btnShellFolderUp.OnBitBtnDraw:= btnShellFolderUpBitBtnDraw;
    ...
    function TOpenDialogForm.btnShellFolderUpBitBtnDraw(Sender: PControl; BtnState: Integer): Boolean;
    var P, W, H: Integer;
       DC: HDC;
    begin
       Result:= True;
       DC:= Sender.Canvas.Handle;
       W:= Sender.Width;
       H:= Sender.Height;

       case BtnState of
         2: begin
           P:= CreatePen(PS_SOLID, Round(ControlScale), Color2RGB(clBtnText));
           SelectObject(DC, P);
           Rectangle(DC, 2+Trunc(ControlScale/2), scbFolders.Top+Trunc(ControlScale/2), W-Trunc(ControlScale/2), scbFolders.Top + scbFolders.Height-Trunc(ControlScale/2));
           DeleteObject(P);
         end;
         else FillRectColor(DC, Sender.ClientRect, Sender.Color);
       end;
       ImageListAny.DrawingStyle:= [dsTransparent];
       ImageListAny.Draw(0, Sender.Canvas.Handle, (W - ImageListAny.ImgWidth) div 2+1, (H - ImageListAny.ImgHeight) div 2);
    end;

    > и как изменить цвета в ListView т.е. цвет фона цвет шрифта
    > цвет выделения и.т.д.. Заранее благодарен.

    Да так же, как и в Win32: OnLVCustomDraw и т.д.
  • mdw © (09.10.08 10:59) [2]

    > 1) Поиск файлов

    Честно говоря не понял вопроса.
  • AnarchyMob © (09.10.08 13:19) [3]
    За ответы ОГРОМНОЕ СПАСИБО наконец-то я смогу нормально разрабатывать свою программму, вот так надо отвечать на вопросы, а не флудить по пустякам.

    Насчет поиска, извините, я что-то сейчас и сам непойму, вот мой код:

    program Temp;

    {$mode delphi}{$H+}

    uses
     Windows, KOL;

    var
     Form1, LView, Button1: PControl;
     Ilist: PImageList;
    //===================================================
    Procedure FindFile;
    var
     FindHandle: THandle;
     FindData   : TWin32FindData;
     b : boolean;
     s : kolstring;
    begin
     FindData.dwFileAttributes:=FILE_ATTRIBUTE_DIRECTORY;
     FindHandle:=FindFirstFile('\*.*', FindData);
     if FindHandle<>INVALID_HANDLE_VALUE then
     begin
     b:=true;
     while b do
       begin
         s:=FindData.cFileName;
         if (s<>'..') and (s<>'.') then
         LView.LVAdd(s, 0, [lvisFocus], 0, 0, 0);
         b:=FindNextFile(FindHandle, FindData);
       end;
     end;
     FindClose(FindHandle);
    end;

    procedure RunApp;
    begin
     Form1:=NewForm(Applet, 'Temp');
     LBox:=NewListView(Form1, lvsDetail, [lvoRowSelect], nil, nil, nil);
     Button1:=NewButton(Form1, 'Files');
     LView.Width:=236;
     Button1.Top:=220;
     LView.LVColAdd('Folders', taLeft, LBox.Width-18);
     //============================================
     Button1.OnClick:=TOnEvent(MakeMethod(nil, @FindFile));
     Run(Form1);
    end;

    begin
     Applet:=NewApplet('Temp');
     RunApp;
    end.



    В результате в ListView выводятся все файлы из корня КПК, а по идее должны только папки.
    Еще раз СПАСИБО !!!
  • mdw © (09.10.08 15:04) [4]
    А с чего вы взяли, что
    FindData.dwFileAttributes:=FILE_ATTRIBUTE_DIRECTORY;

    обеспечит вам нахождение только папок? Читайте первоисточники.
    Также можно использовать TDirlist. Есть также готовые компоненты для отображения файловой системы, это так, к слову.
  • AnarchyMob © (09.10.08 16:25) [5]
    Пробовал через PDirList вообще ничего не находит, видимо не до коца еще портирован, а по поводу FILE_ATTRIBUTE_DIRECTORY то я не пойму почему не работает ведь в VCL функции (уже точно не помню) FindRirst & FindNext с параметром FILE_ATTRIBUTE_DIRECTORY работает корректно. Я пробовал компилировать вышеприведенный текст для Win32 та-же история, отображаються все файлы. Что делать?
  • Дмитрий К © (09.10.08 16:50) [6]
    procedure FindFile(Dummy, Sender: PObj);
    var
     FindHandle: THandle;
     FindData   : TWin32FindData;
     s : KOLString;
    begin
     FindHandle := FindFirstFile('\*.*', FindData);
     if FindHandle = INVALID_HANDLE_VALUE then
       Exit;
     repeat
       if FindData.dwFileAttributes or FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then
       begin
         s := FindData.cFileName;
         if (s <> '..') and (s <> '.') then
           LView.LVAdd(s, 0, [], 0, 0, 0);
       end;
     until not FindNextFile(FindHandle, FindData);
     FindClose(FindHandle);
    end;

  • AnarchyMob © (09.10.08 18:49) [7]
    Спасибо заработало! Все как-то надо шиворот на выворот делать с этим API, но блин без API туго. Еще раз Спасибо!!!

    Чуть не забыл, еще раз про кнопки, у меня раньше был код на Си++ для вывода четырех битмапов в контекст кнопки (и не только) соответственно для разных состояний, код который вы дали выводит только один битмап. Если хотите могу дать этот код на Си++.
  • mdw © (10.10.08 00:15) [8]
    А четыре состояния, это какие? Ну обычное, нажатое, запрещенное, а четвертое? Over, возникающий при приближении стилуса к экрану?:)
  • AnarchyMob © (10.10.08 15:09) [9]
    Ну ка-же, а состояние "в фокусе" забыли. В своё время на RSDN откопал статью, и там был код, как я уже говорил, на Си++ вот он:

    > А четыре состояния, это какие? Ну обычное, нажатое, запрещенное,
    >  а четвертое? Over, возникающий при приближении стилуса
    > к экрану?:)


    Выполняя указанные требования, мы можем подготовить четыре битмапа, реализующие внешний вид каждого из состояний кнопки, и отрисовывать в нужный момент (вот где появляется необходимость знать текущее состояние кнопки) одно из них. В этом случае мы сами полностью контролируем внешний вид кнопки в каждом из состояний. Впечатление, которое вы произведете на пользователя, будет целиком зависеть от вашего вкуса и умения создавать растровые изображения.

    Что касается кода, реализующего необходимую логику работы, то его реализация может быть следующей:


    BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
    {
       static HBITMAP hBm[BM_COUNT] = {NULL, NULL, NULL, NULL}
    ;
       . . .
       case WM_DRAWITEM:
           return DrawFreeStyleBtn( (LPDRAWITEMSTRUCT) lParam, hBm );
       . . .
    }

    BOOL DrawFreeStyleBtn( LPDRAWITEMSTRUCT pis, HBITMAP* phBm )
    {
       if( IDC_BMPBTN == pis->CtlID )
       {
           HBITMAP hOld = NULL;
           HBITMAP hbm  = phBm[BM_UP];

           switch(pis->itemAction)
           {
           case ODA_DRAWENTIRE:
           case ODA_SELECT:
               if( pis->itemState & ODS_DISABLED )
                   hbm = phBm[BM_DISABLE];
               else
                   if( pis->itemState & ODS_SELECTED )
                       hbm = phBm[BM_DOWN];
               break;
           case ODA_FOCUS:
               if( pis->hwndItem == GetFocus() )
                   hbm = phBm[BM_FOCUS];
               break;
           }
         
           HDC hCompDC = CreateCompatibleDC( pis->hDC );
           hOld = (HBITMAP) SelectObject( hCompDC, hbm );
           BitBlt(
               pis->hDC,
               pis->rcItem.left,
               pis->rcItem.top,
               pis->rcItem.right - pis->rcItem.left,
               pis->rcItem.bottom - pis->rcItem.top,
               hCompDC, 0, 0, SRCCOPY );
           SelectObject( pis->hDC, hOld );
           DeleteDC( hCompDC );
           return TRUE;
       }
       return FALSE;
    }




    и еще:

    Действительно, имеется несколько функций, облегчающих придание стандартного вида OWNERDRAW-контролам. Разработчик готовит только основной битмап для кнопки, а для отрисовки границ и состояний кнопки (неактивное и в фокусе) пользуется функциями WinAPI - DrawEdge() (границы контрола - "выпуклый/вдавленный"), DrawState() (состояние "активный/неактивный") и DrawFocusRect() (состояние "в фокусе"). В таком случае вышеприведенный код примет вид:

    BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
    {
       static HBITMAP hBm = NULL;
       . . .
       case WM_DRAWITEM:
           return DrawClassicStyleBtn( (LPDRAWITEMSTRUCT) lParam, hBm );
       . . .
    }


    void DrawClassicStyleBtn(LPDRAWITEMSTRUCT pis, HBITMAP hBm, int deflate = 4)
    {
       UINT uState = DSS_NORMAL;
       UINT uEdge  = EDGE_RAISED;
       int  x = 0, y = 0;
       BOOL bFocus = FALSE;
       RECT rFocus;

       if(IDC_BMPBTN == pis->CtlID)
       {
           switch(pis->itemAction)
           {
           case ODA_DRAWENTIRE:
           case ODA_SELECT:
               if(pis->itemState & ODS_DISABLED)
               {
                   uState = DSS_DISABLED;
               }

               else
                   if(pis->itemState & ODS_SELECTED)
                   {
                       x += 1;  // сдвиг всего рисунка вправо-вниз подчеркивает
                       y += 1;  // визуальный эффект нажатия кнопки
                       uEdge  = EDGE_SUNKEN;
                   }

               break;
           case ODA_FOCUS:
               if(pis->hwndItem == GetFocus())
               {
                   memcpy(&rFocus, &pis->rcItem, sizeof(RECT));
                   rFocus.left   += deflate;
                   rFocus.top    += deflate;
                   rFocus.right  -= deflate;
                   rFocus.bottom -= deflate;
                   bFocus = TRUE;
               }

               break;
           }
           DrawState(
               pis->hDC, NULL, NULL, (LONG)hBm, 0,
               x, y, 0, 0, DST_BITMAP | uState);
           DrawEdge(pis->hDC, &pis->rcItem, uEdge, BF_RECT);
           if(bFocus)
               DrawFocusRect(pis->hDC, &rFocus);
       }
    }




    Я перевёл этот код на Паскаль, но что-то он не работает... может подскажите в чём трабла.
  • speller (12.10.08 13:32) [10]
    ошибка в 17-й строке
  • AnarchyMob © (13.10.08 11:48) [11]
    switch(pis->itemAction)
          {
          case ODA_DRAWENTIRE:
          case ODA_SELECT:
              if( pis->itemState & ODS_DISABLED )
                  hbm = phBm[BM_DISABLE];
              else
                  if( pis->itemState & ODS_SELECTED )
                      hbm = phBm[BM_DOWN];
    тута -->   break;
          case ODA_FOCUS:
              if( pis->hwndItem == GetFocus() )
                  hbm = phBm[BM_FOCUS];
              break;

    Я что-то не пойму какая в этой строке ошибка.
  • D[u]fa (13.10.08 12:02) [12]
    Он имел ввиду покажи код паскалевский, без самого кода откуда можно узнать где ошибка
  • AnarchyMob © (14.10.08 03:24) [13]
    Вот я блин приколист, вот держите код, только я не пойму куда этот код "прикрутить" я так думаю в процедуру обработки OnPaint. Пожалуйста растолкуйте как надо правильно делать.
    function DrawFreeStyleBtn(pis: LPDRAWITEMSTRUCT; phBm: HBITMAP): boolean;
    var
     hOld, hbm: HBITMAP;
     hCompDC: HDC;
    begin
     if IDC_BMPBTN=pis.CtlID then
     begin
       hOld:=NULL;
       hbm:=phBm[BM_UP];
       case pis.itemAction of
         ODA_SELECT:
         begin
           if pis.itemState and ODS_DISABLED then
           hbm:=phBm[BM_DISABLE]
           else
           if pis.itemState and ODS_SELECTED then
           hbm:=phBm[BM_DOWN];
         end;
         ODA_FOCUS:
         if pis.hwndItem=GetFocus() then hbm:=phBm[BM_FOCUS];
       end: //case of
       hCompDC:=CreateCompatibleDC(pis.hDC);
       hOld:=HBITMAP(SelectObject(hCompDC, hbm));
       BitBlt(pis.hDC, pis.rcItem.left, pis.rcItem.top,
               pis.rcItem.right - pis.rcItem.left,
               pis.rcItem.bottom - pis.rcItem.top,
               hCompDC, 0, 0, SRCCOPY);
       SelectObject(pis.hDC, hOld);
       DeleteDC(hCompDC);
       result:=True;
     end else return:=False;
    end;


    Заранее очень благодарен !!!
  • AnarchyMob © (14.10.08 23:06) [14]
    Вот еще немного исправил, но что-то опять не работает, код:

    function DrawFreeStyleBtn(pis: LPDRAWITEMSTRUCT; phBm: HBITMAP): boolean;
    var
    hOld, hbm: HBITMAP;
    hCompDC: HDC;
    begin
    if IDC_BMPBTN=pis.CtlID then
    begin
      hOld:=NULL;
      hbm:=phBm[BM_UP];
      case pis.itemAction of
        ODA_SELECT:
        begin
    ->    if (pis.itemState and ODS_DISABLED) then
          hbm:=phBm[BM_DISABLE]
          else
    ->    if (pis.itemState and ODS_SELECTED) then
          hbm:=phBm[BM_DOWN];
        end;
        ODA_FOCUS:
        if pis.hwndItem=GetFocus() then hbm:=phBm[BM_FOCUS];
      end: //case of
      hCompDC:=CreateCompatibleDC(pis.hDC);
      hOld:=HBITMAP(SelectObject(hCompDC, hbm));
      BitBlt(pis.hDC, pis.rcItem.left, pis.rcItem.top,
              pis.rcItem.right - pis.rcItem.left,
              pis.rcItem.bottom - pis.rcItem.top,
              hCompDC, 0, 0, SRCCOPY);
      SelectObject(pis.hDC, hOld);
      DeleteDC(hCompDC);
      result:=True;
    end else return:=False;
    end;



    А на что должен ссылатся переменная
    hbm

    .
  • vampir_infernal (15.10.08 07:16) [15]
    переменная
    phBm

    должна быть массивом из нескольких указателей на HBITMAP, по одному на каждое "состояние" контрола (UP, DOWN, DISABLED, FOCUSED). Еще нужно как-то определить константы BM_FOCUS, IDC_BMPBTN и подобные. Вызываться эта функция должна из обработчика OnMessage, так:

    type arBITMAP = array [0..3] of HBITMAP;
    var hBM : arBITMAP;
    //-----
    hBM[BM_UP] := hUpBitMap; //заранее подготовленный битмап

    function DrawFreeStyleBtn(pis: LPDRAWITEMSTRUCT; phBm: HBITMAP): boolean;
    begin
    //реализация
    end;

    function TfmMain.FormOnMessage(var Msg: tagMSG; var Rslt: Integer): Boolean;
    begin
     Result := false;
     case Msg.message of
       WM_DRAWITEM :
         Result := DrawFreeStyleBtn( LPDRAWITEMSTRUCT( Msg.lParam ), hBM );
     end;
    end;


    причем массив hBM вы должны будете объявить сами заранее.
    Пример мной написан так сказать "от балды", придется Вам переработать его под себя. И еще, исходный код на С явно выдернут из проекта на чистом WinAPI, и я бы советовал Вам разобраться сначала с типовыми примерами.
    Успехов,
    -------
  • vampir_infernal (15.10.08 07:19) [16]
    function DrawFreeStyleBtn(pis: LPDRAWITEMSTRUCT; phBm: arBITMAP): boolean;


    fixed
  • AnarchyMob © (16.10.08 01:47) [17]
    Спасибо за, так сказать, "расталковку", но у меня что-то опять не выходит вывести битмап, я вот что подумал может, если вас не затруднит, рассказать как это все сделать используя KOL по полной программе. Я незнаю как найти растр кнопки, я так думаю это ее хендл или хендл канвы, иными словами куда выводить битмапы.

    P.S.
    Еще немного поколдовал и что-то началось получатся, хотя попрежнему о битмапах я могу только мечтать. А ведь есть набор граш компонентов для KOL, правда под Win CE этот набор почему-то не идет :-(
  • vampir_infernal (16.10.08 14:30) [18]
    Вот Вам пример
    http://up.k10x.net/bnexuamccomon/ownerdraw.zip

    Делал на основе статей
    http://www.rsdn.ru/archive/vc/issues/pvc050.htm и
    http://www.rsdn.ru/article/qna/controls/btnod.xml

    Попробуйте объединить два метода отрисовки, как и рекомендуется в конце статьи по ссылке. А GRush скорее всего не работает из-за асмовых вставок с ММХ, хотя об этом лучше поинтересоваться у их (GRush) автора.
  • AnarchyMob © (17.10.08 01:54) [19]
    ОГРОМНЕЙШЕЕ ВАМ СПАСИБО, изучил статьи все получилось, как я уже говорил готовлю твикер для Win Mobile скоро выложу, там это все о чем я спрашиваю будет задействовано, еще раз спасибо за советы.
  • AnarchyMob © (17.10.08 02:07) [20]
    ОГРОМНЕЙШЕЕ ВАМ СПАСИБО, изучил статьи все получилось, как я уже говорил готовлю твикер для Win Mobile скоро выложу, там это все о чем я спрашиваю будет задействовано, еще раз спасибо за советы.
  • AnarchyMob © (22.10.08 14:28) [21]
    Еще вопросик какое событие происходит при долгом тапе на компоненте, нужно потому что
    MyControl.SetAutoPopupMenu(MyPopupMenu);

    выводит только меню, а мне надо чтобы, например, при долгом тапе появлялось окно сообщения или еще что-нибудь не связаное с меню.
  • mdw © (22.10.08 15:03) [22]
    Как вариант.

    procedure TForm1.PopupMenu1Popup(Sender: PObj);
    begin
       PopupMenu1.NotPopup:= True;
       showMessage('Ваша реакция  при долгом тапе');
    end;
  • AnarchyMob © (22.10.08 20:21) [23]
    "Шедевральный" форум на вопросы отвечают мгновенно, скажу более стоило мне только подуммть о том чтобы написать вопрос по поводу того как растянуть "таб" (и иже с ним компоненты) на всю форму (без краев), только зашоел на форум уже вопрос задан, но и самое главное уже на него ответили. Вообщем МОЛОДЦЫ вы. Так держать!!!!!!!
  • AnarchyMob © (22.10.08 20:31) [24]
    "Шедевральный" форум на вопросы отвечают мгновенно, скажу более стоило мне только подуммть о том чтобы написать вопрос по поводу того как растянуть "таб" (и иже с ним компоненты) на всю форму (без краев), только зашоел на форум уже вопрос задан, но и самое главное уже на него ответили. Вообщем МОЛОДЦЫ вы. Так держать!!!!!!!
  • AnarchyMob © (22.10.08 20:34) [25]
    Непойму что творится все мои посты показываются по два раза, что за Х**** может с форумом что-то, раньше такого небыло.
 
Конференция "KOL" » Вопросы по Win CE [Lazarus & KOL, Windows CE]
Есть новые Нет новых   [134432   +18][b:0][p:0.006]