Форум: "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.005 c