-
Просмотрел всю конференцию, ответов так и не нашел, вопросов накопилось немало вот главные из них: 1) Поиск файлов
Создаю OpenDialog для КПК воспользовался API функциями FindFirstFile & FindNextFile & FindClose, атрибуты поиска поставил FILE_FIND_DERICTORY (может немного ошибся, но это не суть важно) т.е. поиск папок, но в результате в ListView попадает все, и папки и обычные файлы и скрытые, короче все подряд, фильтр ставил '\*.*' и '\' в любом случае выводиться все, подскажите пожалуйста что делать.
2)Контекстное меню
Как в Win CE используя KOL реализовать контекстное меню, или какое возникает событие при долгом тапе. Спасибо.
3)OwnerDraw
Подскажите как вывести в контекст кнопки (и подобных компонентов) битмап, если можно дайте код, и как изменить цвета в ListView т.е. цвет фона цвет шрифта цвет выделения и.т.д.. Заранее благодарен.
P.S. БОЛЬШОЕ СПАСИБО модераторам которые УДАЛИЛИ три моих вопроса, кстати очень актуальных, которые важны не только мне, но и другим программистам пишущих программы под Win CE.
-
> 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 и т.д.
-
> 1) Поиск файлов
Честно говоря не понял вопроса.
-
За ответы ОГРОМНОЕ СПАСИБО наконец-то я смогу нормально разрабатывать свою программму, вот так надо отвечать на вопросы, а не флудить по пустякам. Насчет поиска, извините, я что-то сейчас и сам непойму, вот мой код:
program Temp;
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 выводятся все файлы из корня КПК, а по идее должны только папки. Еще раз СПАСИБО !!!
-
А с чего вы взяли, что FindData.dwFileAttributes:=FILE_ATTRIBUTE_DIRECTORY; обеспечит вам нахождение только папок? Читайте первоисточники. Также можно использовать TDirlist. Есть также готовые компоненты для отображения файловой системы, это так, к слову.
-
Пробовал через PDirList вообще ничего не находит, видимо не до коца еще портирован, а по поводу FILE_ATTRIBUTE_DIRECTORY то я не пойму почему не работает ведь в VCL функции (уже точно не помню) FindRirst & FindNext с параметром FILE_ATTRIBUTE_DIRECTORY работает корректно. Я пробовал компилировать вышеприведенный текст для Win32 та-же история, отображаються все файлы. Что делать?
-
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;
-
Спасибо заработало! Все как-то надо шиворот на выворот делать с этим API, но блин без API туго. Еще раз Спасибо!!!
Чуть не забыл, еще раз про кнопки, у меня раньше был код на Си++ для вывода четырех битмапов в контекст кнопки (и не только) соответственно для разных состояний, код который вы дали выводит только один битмап. Если хотите могу дать этот код на Си++.
-
А четыре состояния, это какие? Ну обычное, нажатое, запрещенное, а четвертое? Over, возникающий при приближении стилуса к экрану?:)
-
Ну ка-же, а состояние "в фокусе" забыли. В своё время на RSDN откопал статью, и там был код, как я уже говорил, на Си++ вот он: > А четыре состояния, это какие? Ну обычное, нажатое, запрещенное, > а четвертое? Over, возникающий при приближении стилуса > к экрану?:) Выполняя указанные требования, мы можем подготовить четыре битмапа, реализующие внешний вид каждого из состояний кнопки, и отрисовывать в нужный момент (вот где появляется необходимость знать текущее состояние кнопки) одно из них. В этом случае мы сами полностью контролируем внешний вид кнопки в каждом из состояний. Впечатление, которое вы произведете на пользователя, будет целиком зависеть от вашего вкуса и умения создавать растровые изображения.
Что касается кода, реализующего необходимую логику работы, то его реализация может быть следующей:
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
;
. . .
case WM_DRAWITEM:
return DrawFreeStyleBtn( (LPDRAWITEMSTRUCT) lParam, hBm );
. . .
}
BOOL DrawFreeStyleBtn( LPDRAWITEMSTRUCT pis, HBITMAP* phBm )
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)
void DrawClassicStyleBtn(LPDRAWITEMSTRUCT pis, HBITMAP hBm, int deflate = 4)
else
if(pis->itemState & ODS_SELECTED)
break;
case ODA_FOCUS:
if(pis->hwndItem == GetFocus())
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);
}
}
Я перевёл этот код на Паскаль, но что-то он не работает... может подскажите в чём трабла.
-
ошибка в 17-й строке
-
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;
Я что-то не пойму какая в этой строке ошибка.
-
Он имел ввиду покажи код паскалевский, без самого кода откуда можно узнать где ошибка
-
Вот я блин приколист, вот держите код, только я не пойму куда этот код "прикрутить" я так думаю в процедуру обработки 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: 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; Заранее очень благодарен !!!
-
Вот еще немного исправил, но что-то опять не работает, код: 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: 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 .
-
переменная 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, и я бы советовал Вам разобраться сначала с типовыми примерами. Успехов, -------
-
function DrawFreeStyleBtn(pis: LPDRAWITEMSTRUCT; phBm: arBITMAP): boolean; fixed
-
Спасибо за, так сказать, "расталковку", но у меня что-то опять не выходит вывести битмап, я вот что подумал может, если вас не затруднит, рассказать как это все сделать используя KOL по полной программе. Я незнаю как найти растр кнопки, я так думаю это ее хендл или хендл канвы, иными словами куда выводить битмапы.
P.S. Еще немного поколдовал и что-то началось получатся, хотя попрежнему о битмапах я могу только мечтать. А ведь есть набор граш компонентов для KOL, правда под Win CE этот набор почему-то не идет :-(
-
-
ОГРОМНЕЙШЕЕ ВАМ СПАСИБО, изучил статьи все получилось, как я уже говорил готовлю твикер для Win Mobile скоро выложу, там это все о чем я спрашиваю будет задействовано, еще раз спасибо за советы.
|