![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
избирательный OwnerDraw
Katya © (2007-01-15 21:53:00)посмотрела все доки по способам изменения цвета и стиля шрифтов в ListView, MainMenu, поковыряла демку DemoMenuBitmap...
но остались вопросы...
у меня в проге есть собственное PopupMenu, создаваемое NewMenu(nil,0,[''],nil);
пункты добавляются посредством MyPopupMenu.AddItem(PChar(TmpStr),mySelectItem,[ ]);
как мне избирательно назначить для некоторых пунктов (чтобы выделить их жирненьким) function TMainForm.MyPopupMenuDrawItem(Sender: PObj; DC: HDC;
const Rect: TRect; ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean; ????
чувствую, что ответ рядом, но не получается...
p.s. про MyPopupMenu.OwnerDraw := TRUE; знаю ;)
Katya (2007-01-24 12:26:00) [1]привет
вчера добила ))
но решение несколько другое:
в обработчиках pm - OnDrawItem и OnMeasureItem
установлены pmDrawItem и pmMeasureItem (соответственно)
а для замены "дизайна" нужного (текущего) пункта после его инициализации (или переименования)
MyPopup.Items[Сгid].OwnerDraw := true;
работает :)
MTsv DN (2007-01-23 23:35:00) [2]Привет...
Замени:
procedure TForm1.KOLFormFormCreate(Sender: PObj);
var
id: integer;
item: PMenu;
begin
pm.Items[1].OwnerDraw := true;
MyPopup := NewMenu(nil,0,[''],nil);
PMenuAccess(MyPopup).FCaption := 'Вставка';
Form1.pm.InsertSubMenu(MyPopup,1);
MyPopup.AddItem('Item1',nil,[ ]);
id := MyPopup.AddItem('Item2',nil,[ ]);
item := MyPopup.Items[id];
item.OwnerDraw := true;
item.OnDrawItem := pmDrawItem;
end;
на:
var
id : integer;
item: PMenu;
begin
pm.Items[1].OwnerDraw := true;
MyPopup := NewMenu(nil,0,[''],nil);
PMenuAccess(MyPopup).FCaption := 'Âñòàâêà';
Form1.pm.InsertSubMenu(MyPopup,1);
MyPopup.AddItem('Item1',nil,[ ]);
id := MyPopup.AddItem('Item2',nil,[ ]);
pm.Items[MyPopup.ItemSubmenu[id]].OnDrawItem := pmDrawItem;
MyPopup.Items[id].OwnerDraw := true;
end;
Katya (2007-01-23 22:21:00) [3]ничего не выходит с динамическимподменю....
вот фрагмент кода (из примера pm_choosenownerdraw.rar)
type
{$IFDEF KOL_MCK}
{$I MCKfakeClasses.inc}
{$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
{$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
Form: PControl;
{$ELSE not_KOL_MCK}
TForm1 = class(TForm)
{$ENDIF KOL_MCK}
KOLProj: TKOLProject;
KOLForm: TKOLForm;
pm: TKOLPopupMenu;
function pmDrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
function pmMeasureItem(Sender: PObj; Idx: Integer): Integer;
procedure KOLFormFormCreate(Sender: PObj);
private
{ Private declarations }
public
{ Public declarations }
end;
// для вставки подменю
PMenuAccess = ^TMenuAccess;
TMenuAccess = object(TMenu)
end;
var
Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
MyPopup : PMenu; // подменю
procedure TForm1.KOLFormFormCreate(Sender: PObj);
var
id: integer;
item: PMenu;
begin
pm.Items[1].OwnerDraw := true;
MyPopup := NewMenu(nil,0,[''],nil);
PMenuAccess(MyPopup).FCaption := 'Вставка';
Form1.pm.InsertSubMenu(MyPopup,1);
MyPopup.AddItem('Item1',nil,[ ]);
id := MyPopup.AddItem('Item2',nil,[ ]);
item := MyPopup.Items[id];
item.OwnerDraw := true;
item.OnDrawItem := pmDrawItem;
end;
Psychedelic (2007-01-23 11:47:00) [4]Удалено модератором
Katya (2007-01-23 10:55:00) [5]2MTsv DN
вчера разбиралась
в указанном примере отрисовка применяется к статическому компоненту pm, а у меня в динамическом... не работает...
сегодня ещё буду пробовать, если не получится, ещё напишу!!!!!
2AndreyRus
;)
AndreyRus (2007-01-22 23:09:00) [6]Удалено модератором
Katya (2007-01-22 12:50:00) [7]2MTsv DN, Don
cпасибо за помощь!
только приехала, вечером буду пробовать!!!
отдельно MTsv DN
на форуме как-то попался совет одного из уважаемых кодеров - не вываливать весь код, а давать только те части (куски), которые нужны для понимания ситуации
поэтому я так и сделала...
отдельно Don
верно, порезана - написание здесь кода, который роли в проблеме не играет только введет в заблуждение...
остальным
спасибо за поднятие настроения!
от блондинки с голубыми глазами и великолепными формами :Р
Don (2007-01-22 10:20:00) [8]По поводу избирательного рисования для меню:
varпопробуй так, хотя из кода не понял, зачем тебе избирательное рисование элементов меню.
idx: Integer;
item: PMenu;
begin
...
idx := MyPopup.AddItem(PChar(CurrentItemName), zSelectMyPopupItem, []);
item := MyPopup.Items[idx];
item.OwnerDraw := True;
item.OnDrawItem := MyPopupDrawItem;
...
end;
И еще, твоя процедура zMyPopupRefresh или сильно порезана, или написана неправильно (не забывай, что вызов FindFirstFile уже дает указатель на первый файл, а ты его не обрабатываешь)
MTsv DN (2007-01-21 17:55:00) [9]2 Katya
Если честно, то я имел ввиду минимально-рабочий код...а не куски из MCK-проекта... Разбираться в твоем коде не стал.
Качай вот отсюда: http://www.uus4u.com/download/other/pm_choosenownerdraw.rar- "избирательный" OwnerDraw для PopUpMenu...
> Гы-ы. Жы-ырненьким :)
> Первый секс - Katya!
Ребята, по-моему - это Грубо!!!
AndreyRus (2007-01-16 22:52:00) [10]Удалено модератором
Katya (2007-01-16 14:41:00) [11]
// ТИПЫ
type
{$IFDEF KOL_MCK}
{$I MCKfakeClasses.inc}
{$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
{$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
Form: PControl;
{$ELSE not_KOL_MCK}
TForm1 = class(TForm)
{$ENDIF KOL_MCK}
KOLProject1: TKOLProject;
KOLForm1: TKOLForm;
PopupMenu1: TKOLPopupMenu;
KOLApplet1: TKOLApplet;
procedure zSelectMyPopupItem(Sender: PMenu; Item: Integer);
procedure zMyPopupCreate;
procedure zMyPopupRefresh;
// для вставки подменю
PMenuAccess = ^TMenuAccess;
TMenuAccess = object(TMenu)
end;
// ПЕРЕМЕННЫЕ
var
Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
MyPopup : PMenu;
{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}
implementation
{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}
{$IFDEF KOL_MCK}
{$I Unit1_1.inc}
{$ENDIF}
// ОБРАБОТЧИКИ
// Создание формы
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
Form1.zMyPopupCreate;
end;
// Создание меню
procedure TForm1.zMyPopupCreate;
begin
MyPopup := NewMenu(nil,0,[''],nil);
PMenuAccess(MyPopup).FCaption := 'Файлы';
Form1.PopupMenu1.InsertSubMenu(PopupTerminator,2); // вторым пунктам
// старая редакция - Form1.MyPopup.Caption := 'Файлы';
zMyPopupRefresh; // получение списка файлов и заполнение меню
end;
// Обработчик событий этого меню
procedure TForm1.zSelectMyPopupItem(Sender: PMenu; Item: Integer);
begin
end;
// Заполнение/обновление меню
procedure TForm1.zMyPopupRefresh;
begin
hFile := FindFirstFileA(PChar(zCurrentDir + '*.dll'),WFD);
if hFile <> INVALID_HANDLE_VALUE
then // файл(ы) найден(ы)
while FindNextFileA(hFile,WFD) do
begin
// имеем кол-во строк в MyPopup.Count
// получение списка имён и т.п.
// переименование существующих
MyPopup.ItemText[i] := CurrentItemName;
// добавление новых
MyPopup.AddItem(PChar(CurrentItemName),zSelectMyPopupItem,[ ]);
end;
FindClose(hFile);
end;
Psychedelic (2007-01-15 23:40:00) [12]Удалено модератором
MTsv DN (2007-01-15 22:12:00) [13]> Katya, приведи минимальный код...
> p.s. про MyPopupMenu.OwnerDraw := TRUE; знаю ;)
Устанавливать надо для каждого элемента меню...