Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2010.09.26;
Скачать: [xml.tar.bz2];

Вниз

Вопросы по 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 вся ветка

Форум: "KOL";
Текущий архив: 2010.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.004 c
8-1205893890
VoVan
2008-03-19 05:31
2010.09.26
fmod


2-1277805860
Cross
2010-06-29 14:04
2010.09.26
insert для нескольких записей


15-1277647767
tesseract
2010-06-27 18:09
2010.09.26
Жаренное солнце. У меня помер внешний термометр.


15-1277814153
_REA
2010-06-29 16:22
2010.09.26


2-1277975828
Андрей Воркин
2010-07-01 13:17
2010.09.26
Изменение имени TextEdit в цикле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский