![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопросы по Win CE [Lazarus, KOL, Windows CE]
AnarchyMob © (2008-10-09 02:22:00)Просмотрел всю конференцию, ответов так и не нашел, вопросов накопилось немало вот главные из них:
1) Поиск файлов
Создаю OpenDialog для КПК воспользовался API функциями FindFirstFile & FindNextFile & FindClose, атрибуты поиска поставил FILE_FIND_DERICTORY (может немного ошибся, но это не суть важно) т.е. поиск папок, но в результате в ListView попадает все, и папки и обычные файлы и скрытые, короче все подряд, фильтр ставил '\*.*' и '\' в любом случае выводиться все, подскажите пожалуйста что делать.
2)Контекстное меню
Как в Win CE используя KOL реализовать контекстное меню, или какое возникает событие при долгом тапе. Спасибо.
3)OwnerDraw
Подскажите как вывести в контекст кнопки (и подобных компонентов) битмап, если можно дайте код, и как изменить цвета в ListView т.е. цвет фона цвет шрифта цвет выделения и.т.д.. Заранее благодарен.
P.S.
БОЛЬШОЕ СПАСИБО модераторам которые УДАЛИЛИ три моих вопроса, кстати очень актуальных, которые важны не только мне, но и другим программистам пишущих программы под Win CE.
AnarchyMob (2008-10-22 20:34:00) [1]Непойму что творится все мои посты показываются по два раза, что за Х**** может с форумом что-то, раньше такого небыло.
AnarchyMob (2008-10-22 20:31:00) [2]"Шедевральный" форум на вопросы отвечают мгновенно, скажу более стоило мне только подуммть о том чтобы написать вопрос по поводу того как растянуть "таб" (и иже с ним компоненты) на всю форму (без краев), только зашоел на форум уже вопрос задан, но и самое главное уже на него ответили. Вообщем МОЛОДЦЫ вы. Так держать!!!!!!!
AnarchyMob (2008-10-22 20:21:00) [3]"Шедевральный" форум на вопросы отвечают мгновенно, скажу более стоило мне только подуммть о том чтобы написать вопрос по поводу того как растянуть "таб" (и иже с ним компоненты) на всю форму (без краев), только зашоел на форум уже вопрос задан, но и самое главное уже на него ответили. Вообщем МОЛОДЦЫ вы. Так держать!!!!!!!
mdw (2008-10-22 15:03:00) [4]Как вариант.
procedure TForm1.PopupMenu1Popup(Sender: PObj);
begin
PopupMenu1.NotPopup:= True;
showMessage('Ваша реакция при долгом тапе');
end;
AnarchyMob (2008-10-22 14:28:00) [5]Еще вопросик какое событие происходит при долгом тапе на компоненте, нужно потому что
MyControl.SetAutoPopupMenu(MyPopupMenu);выводит только меню, а мне надо чтобы, например, при долгом тапе появлялось окно сообщения или еще что-нибудь не связаное с меню.
AnarchyMob (2008-10-17 02:07:00) [6]ОГРОМНЕЙШЕЕ ВАМ СПАСИБО, изучил статьи все получилось, как я уже говорил готовлю твикер для Win Mobile скоро выложу, там это все о чем я спрашиваю будет задействовано, еще раз спасибо за советы.
AnarchyMob (2008-10-17 01:54:00) [7]ОГРОМНЕЙШЕЕ ВАМ СПАСИБО, изучил статьи все получилось, как я уже говорил готовлю твикер для Win Mobile скоро выложу, там это все о чем я спрашиваю будет задействовано, еще раз спасибо за советы.
vampir_infernal (2008-10-16 14:30:00) [8]Вот Вам пример
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-16 01:47:00) [9]Спасибо за, так сказать, "расталковку", но у меня что-то опять не выходит вывести битмап, я вот что подумал может, если вас не затруднит, рассказать как это все сделать используя KOL по полной программе. Я незнаю как найти растр кнопки, я так думаю это ее хендл или хендл канвы, иными словами куда выводить битмапы.
P.S.
Еще немного поколдовал и что-то началось получатся, хотя попрежнему о битмапах я могу только мечтать. А ведь есть набор граш компонентов для KOL, правда под Win CE этот набор почему-то не идет :-(
vampir_infernal (2008-10-15 07:19:00) [10]
function DrawFreeStyleBtn(pis: LPDRAWITEMSTRUCT; phBm: arBITMAP): boolean;
fixed
vampir_infernal (2008-10-15 07:16:00) [11]переменная
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, и я бы советовал Вам разобраться сначала с типовыми примерами.
Успехов,
-------
AnarchyMob (2008-10-14 23:06:00) [12]Вот еще немного исправил, но что-то опять не работает, код:
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.
AnarchyMob (2008-10-14 03:24:00) [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;
Заранее очень благодарен !!!
D[u]fa (2008-10-13 12:02:00) [14]Он имел ввиду покажи код паскалевский, без самого кода откуда можно узнать где ошибка
AnarchyMob (2008-10-13 11:48:00) [15]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;
Я что-то не пойму какая в этой строке ошибка.
speller (2008-10-12 13:32:00) [16]ошибка в 17-й строке
AnarchyMob (2008-10-10 15:09:00) [17]Ну ка-же, а состояние "в фокусе" забыли. В своё время на 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);
}
}
Я перевёл этот код на Паскаль, но что-то он не работает... может подскажите в чём трабла.
mdw (2008-10-10 00:15:00) [18]А четыре состояния, это какие? Ну обычное, нажатое, запрещенное, а четвертое? Over, возникающий при приближении стилуса к экрану?:)
AnarchyMob (2008-10-09 18:49:00) [19]Спасибо заработало! Все как-то надо шиворот на выворот делать с этим API, но блин без API туго. Еще раз Спасибо!!!
Чуть не забыл, еще раз про кнопки, у меня раньше был код на Си++ для вывода четырех битмапов в контекст кнопки (и не только) соответственно для разных состояний, код который вы дали выводит только один битмап. Если хотите могу дать этот код на Си++.
Дмитрий К (2008-10-09 16:50:00) [20]
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;