Текущий архив: 2007.09.09;
Скачать: CL | DM;
Вниз
избирательный OwnerDraw Найти похожие ветки
← →
Katya (2007-01-15 21:53) [0]посмотрела все доки по способам изменения цвета и стиля шрифтов в 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; знаю ;)
← →
MTsv DN © (2007-01-15 22:12) [1]> Katya, приведи минимальный код...
> p.s. про MyPopupMenu.OwnerDraw := TRUE; знаю ;)
Устанавливать надо для каждого элемента меню...
← →
Psychedelic © (2007-01-15 23:40) [2]Удалено модератором
← →
Katya (2007-01-16 14:41) [3]
// ТИПЫ
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;
← →
AndreyRus (2007-01-16 22:52) [4]Удалено модератором
← →
MTsv DN © (2007-01-21 17:55) [5]2 Katya
Если честно, то я имел ввиду минимально-рабочий код...а не куски из MCK-проекта... Разбираться в твоем коде не стал.
Качай вот отсюда: http://www.uus4u.com/download/other/pm_choosenownerdraw.rar - "избирательный" OwnerDraw для PopUpMenu...
> Гы-ы. Жы-ырненьким :)
> Первый секс - Katya!
Ребята, по-моему - это Грубо!!!
← →
Don © (2007-01-22 10:20) [6]По поводу избирательного рисования для меню:
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 уже дает указатель на первый файл, а ты его не обрабатываешь)
← →
Katya (2007-01-22 12:50) [7]2MTsv DN, Don
cпасибо за помощь!
только приехала, вечером буду пробовать!!!
отдельно MTsv DN
на форуме как-то попался совет одного из уважаемых кодеров - не вываливать весь код, а давать только те части (куски), которые нужны для понимания ситуации
поэтому я так и сделала...
отдельно Don
верно, порезана - написание здесь кода, который роли в проблеме не играет только введет в заблуждение...
остальным
спасибо за поднятие настроения!
от блондинки с голубыми глазами и великолепными формами :Р
← →
AndreyRus (2007-01-22 23:09) [8]Удалено модератором
← →
Katya (2007-01-23 10:55) [9]2MTsv DN
вчера разбиралась
в указанном примере отрисовка применяется к статическому компоненту pm, а у меня в динамическом... не работает...
сегодня ещё буду пробовать, если не получится, ещё напишу!!!!!
2AndreyRus
;)
← →
Psychedelic © (2007-01-23 11:47) [10]Удалено модератором
← →
Katya (2007-01-23 22:21) [11]ничего не выходит с динамическим подменю....
вот фрагмент кода (из примера 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;
← →
MTsv DN © (2007-01-23 23:35) [12]Привет...
Замени: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-24 12:26) [13]привет
вчера добила ))
но решение несколько другое:
в обработчиках pm - OnDrawItem и OnMeasureItem
установлены pmDrawItem и pmMeasureItem (соответственно)
а для замены "дизайна" нужного (текущего) пункта после его инициализации (или переименования)MyPopup.Items[Сгid].OwnerDraw := true;
работает :)
Страницы: 1 вся ветка
Текущий архив: 2007.09.09;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.027 c