Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.26;
Скачать: CL | DM;

Вниз

Вопросы по Win CE   Найти похожие ветки 

 
AnarchyMob ©   (2008-10-09 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 ©   (2008-10-09 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 ©   (2008-10-09 10:59) [2]


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

Честно говоря не понял вопроса.


 
AnarchyMob ©   (2008-10-09 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 ©   (2008-10-09 15:04) [4]

А с чего вы взяли, что FindData.dwFileAttributes:=FILE_ATTRIBUTE_DIRECTORY; обеспечит вам нахождение только папок? Читайте первоисточники.
Также можно использовать TDirlist. Есть также готовые компоненты для отображения файловой системы, это так, к слову.


 
AnarchyMob ©   (2008-10-09 16:25) [5]

Пробовал через PDirList вообще ничего не находит, видимо не до коца еще портирован, а по поводу FILE_ATTRIBUTE_DIRECTORY то я не пойму почему не работает ведь в VCL функции (уже точно не помню) FindRirst & FindNext с параметром FILE_ATTRIBUTE_DIRECTORY работает корректно. Я пробовал компилировать вышеприведенный текст для Win32 та-же история, отображаються все файлы. Что делать?


 
Дмитрий К ©   (2008-10-09 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 ©   (2008-10-09 18:49) [7]

Спасибо заработало! Все как-то надо шиворот на выворот делать с этим API, но блин без API туго. Еще раз Спасибо!!!

Чуть не забыл, еще раз про кнопки, у меня раньше был код на Си++ для вывода четырех битмапов в контекст кнопки (и не только) соответственно для разных состояний, код который вы дали выводит только один битмап. Если хотите могу дать этот код на Си++.


 
mdw ©   (2008-10-10 00:15) [8]

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


 
AnarchyMob ©   (2008-10-10 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   (2008-10-12 13:32) [10]

ошибка в 17-й строке


 
AnarchyMob ©   (2008-10-13 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   (2008-10-13 12:02) [12]

Он имел ввиду покажи код паскалевский, без самого кода откуда можно узнать где ошибка


 
AnarchyMob ©   (2008-10-14 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 ©   (2008-10-14 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   (2008-10-15 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   (2008-10-15 07:19) [16]

function DrawFreeStyleBtn(pis: LPDRAWITEMSTRUCT; phBm: arBITMAP): boolean;
fixed


 
AnarchyMob ©   (2008-10-16 01:47) [17]

Спасибо за, так сказать, "расталковку", но у меня что-то опять не выходит вывести битмап, я вот что подумал может, если вас не затруднит, рассказать как это все сделать используя KOL по полной программе. Я незнаю как найти растр кнопки, я так думаю это ее хендл или хендл канвы, иными словами куда выводить битмапы.

P.S.
Еще немного поколдовал и что-то началось получатся, хотя попрежнему о битмапах я могу только мечтать. А ведь есть набор граш компонентов для KOL, правда под Win CE этот набор почему-то не идет :-(


 
vampir_infernal   (2008-10-16 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 ©   (2008-10-17 01:54) [19]

ОГРОМНЕЙШЕЕ ВАМ СПАСИБО, изучил статьи все получилось, как я уже говорил готовлю твикер для Win Mobile скоро выложу, там это все о чем я спрашиваю будет задействовано, еще раз спасибо за советы.


 
AnarchyMob ©   (2008-10-17 02:07) [20]

ОГРОМНЕЙШЕЕ ВАМ СПАСИБО, изучил статьи все получилось, как я уже говорил готовлю твикер для Win Mobile скоро выложу, там это все о чем я спрашиваю будет задействовано, еще раз спасибо за советы.


 
AnarchyMob ©   (2008-10-22 14:28) [21]

Еще вопросик какое событие происходит при долгом тапе на компоненте, нужно потому что MyControl.SetAutoPopupMenu(MyPopupMenu); выводит только меню, а мне надо чтобы, например, при долгом тапе появлялось окно сообщения или еще что-нибудь не связаное с меню.


 
mdw ©   (2008-10-22 15:03) [22]

Как вариант.

procedure TForm1.PopupMenu1Popup(Sender: PObj);
begin
   PopupMenu1.NotPopup:= True;
   showMessage("Ваша реакция  при долгом тапе");
end;


 
AnarchyMob ©   (2008-10-22 20:21) [23]

"Шедевральный" форум на вопросы отвечают мгновенно, скажу более стоило мне только подуммть о том чтобы написать вопрос по поводу того как растянуть "таб" (и иже с ним компоненты) на всю форму (без краев), только зашоел на форум уже вопрос задан, но и самое главное уже на него ответили. Вообщем МОЛОДЦЫ вы. Так держать!!!!!!!


 
AnarchyMob ©   (2008-10-22 20:31) [24]

"Шедевральный" форум на вопросы отвечают мгновенно, скажу более стоило мне только подуммть о том чтобы написать вопрос по поводу того как растянуть "таб" (и иже с ним компоненты) на всю форму (без краев), только зашоел на форум уже вопрос задан, но и самое главное уже на него ответили. Вообщем МОЛОДЦЫ вы. Так держать!!!!!!!


 
AnarchyMob ©   (2008-10-22 20:34) [25]

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



Страницы: 1 вся ветка

Текущий архив: 2010.09.26;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.011 c
2-1278005352
faiwer
2010-07-01 21:29
2010.09.26
Уборка мусора


6-1226523473
Yozch1
2008-11-12 23:57
2010.09.26
Учесть в программе используемый в системе Proxy


15-1277827538
MBo
2010-06-29 20:05
2010.09.26
Сами мы не местные...


15-1277763229
AlexDn
2010-06-29 02:13
2010.09.26
Еще один вопрос по Inno Setup


2-1278064750
linuxoid
2010-07-02 13:59
2010.09.26
как сохранить и данные свойства Data к узлам Treeview в файл?