-
По ходу обсуждения. А возможно ли реализовать компонент, аналогичный этому, только на основе richedit? Любопытно, но я никогда не видел подобной реализации.
-
У тедди на сайте есть нечто подобное, но довольно глючно работает. Я вообще на основе richedit не одной работоспособной реализации не видел.
-
У Thaddy? Это где? Я не видел... Было бы интересно посмотреть. Просто я видел на wasm.ru статью о реализации подсветки на основе richedit, но на asm-е. Думаеццо, раз можно на asm-t, то можно и на delphi :)
-
www.thaddy.com
-
> www.thaddy.com
Да я понял. Только нету там такого компонента :) Если есть у тебя, можешь скинуть?
-
-
Еще один, наверное простой, вопрос: Как сделать так, чтобы вкладка в TabControl выделялась по правому щелчку мыши(я подвязал к нему popup менюшку, вот и хочется, чтобы popup срабатывал для той вкладки, по которой был сделан правый клик)
-
Индекс вкладки над которой находится курсор можно узнать вот так: function TabUnderCursorIndex: Integer;
var p: TPoint; r: TRect;
begin
GetCursorPos(p);
GetWindowRect(Tabs.Handle, r);
Result := Tabs.TC_TabAtPos(p.X - r.Left, p.Y - r.Top);
end;
-
Спасибо, Дмитрий! Программа стла гораздо симпатичней.
-
А кто - нить знает, как к popup привязать иконки (чтобы слева от пунктов отображались) и как в main-меню такое-же сотворить?
-
> А кто - нить знает, как к popup привязать иконки (чтобы > слева от пунктов отображались) и как в main-меню такое-же > сотворить?
В design-time свойства bitmap* элементов меню. Независимо от типа меню (main/popup).
-
Снова выручаешь, Danger, спасибо!
Остался еще вопрос:
У меня в ImageList иконки хранятся 48х48
а как их уменьшить? а то у меня в менюшках только краешки этих иконок рисуются...
-
MYRX, уменьшать надо графическим редактором, либо редактором иконок.
-
> Demt (07.05.08 19:13) [32] > MYRX, уменьшать надо графическим редактором, либо редактором > иконок.
Или сразу грузить иконки подходящего размера (16х16). Обычно иконки (ICO) содержат в себе изображения разных размеров, скорее всего будут содержать и маленький значок. Можно выдрать его из коллекции и грузить только его в ImageList.
А если неохота заморачиваться, можно в нете поискать готовые наборы значков нужного размера, их там на любой вкус и цвет...
-
Очень хочется позаморачивться ) у Битмапа есть же StretchDraw Может можно это как-то использовать? Просто неохота разбабахивать (увеличивать размер) программу еще и уменьшенными копиями уже имеющихся иконок
Нет ничего невозможного Наверняка - же существует способ решить и эту проблему Только я сам не додумаюсь, потому и уповаю на более опытных товарищей
-
> MYRX (08.05.08 09:38) [34] > Просто неохота разбабахивать (увеличивать размер) > программу еще и уменьшенными копиями > уже имеющихся иконок >
Если есть ICO-файл с нужной коллекцией значков, открываете его в редакторе иконок, и экспортируете из всего набора только маленькую иконку. Потом в вашей программе ставите размер значков в ImageList'e 16х16, и добавляете туда ваш значок, вот и все. А большие значки из коллекции (32х32, 48х48) нет нужды таскать за собой, если они реально не будут использоваться.
Аналогично, если требуется размер 32х32 - ставите соответствующий размер в ImageList'e и добавляете в него только значок размером 32х32, выдранный из ICO-файла.
-
> Очень хочется позаморачивться )
Сколько угодно. ;)
procedure BitmapCopyRect(OutBmp:HBITMAP; const OutRect: TRect; InBmp: HBITMAP;
const InRect: TRect);
var InDC, OutDC: HDC;
OldInDC, OldOutDC: THandle;
begin
if (OutBmp = 0) or (InBmp = 0) or
(OutBmp =InBmp) then Exit;
InDC := CreateCompatibleDC( 0 );
OldInDC := SelectObject( InDC, InBmp );
OutDC := CreateCompatibleDC( 0 );
OldOutDC := SelectObject( OutDC, OutBmp );
StretchBlt( OutDC, OutRect.Left, OutRect.Top, OutRect.Right - OutRect.Left,
OutRect.Bottom - OutRect.Top, InDC, InRect.Left, InRect.Top,
InRect.Right - InRect.Left, InRect.Bottom - InRect.Top,
SRCCOPY );
SelectObject( OutDC, OldOutDC );
DeleteDC( OutDC );
SelectObject( InDC, OldInDC );
DeleteDC( InDC );
end;
var IL: pImageList;
procedure TForm1.KOLFormFormCreate(Sender: PObj);
var
Ob,InB:PBitmap;
begin
inb:=NewBitmap(0,0); Ob:=NewBitmap(144,16); InB.LoadFromResourceName(hinstance,'MAIN');
BitmapCopyRect(OB.Handle,MakeRect(0,0,Ob.Width,Ob.Height),
InB.Handle,MakeRect(0,0,InB.Width,InB.Height));
IL := NewImageList( Form );
IL.Colors := ilcColorDDB;
IL.ImgWidth := 16;
IL.ImgHeight := 16;
IL.AddMasked(Ob.Handle,ClWhite);
InB.Free;
Ob.Free;
-
Супер! Спасибо, Compiler. Работает гораздо лучше моего алгоритма вот что значит опыт. При большом количестве иконок выигрыш на лицо.
-
По ходу назрело еще два вопроса:
1) Кто-нибудь знает, как расширить сами пункты меню, чтобы в них влезали большие иконки? (большие - красивше смотрятся)
2) И еще просьбочка: Поделитесь, пожалуйста, алгоритмом для анализа pas-файлов очень нужно определить уровень вложенности циклов.
-
> 1) Кто-нибудь знает, как расширить сами пункты меню, чтобы > в них влезали большие иконки? (большие - красивше смотрятся)
Изврат конечно, но для решения некоторвх задач подойдет const
mItemHeight=30;
mItemWidth=100;
procedure DrawBitmap(DC: HDC;R:TRect;Bitmap:HBITMAP);
var
DCfrom, DC0: HDC;
oldBmp: HBitmap;
B: TagBitmap;
begin
if Bitmap <> 0 then
begin
if GetObject( Bitmap, sizeof( B ), @B ) <> 0 then
begin
DC0 := GetDC( 0 );
DCfrom := CreateCompatibleDC( DC0 );
ReleaseDC( 0, DC0 );
oldBmp := SelectObject( DCfrom, Bitmap );
BitBlt( DC, R.Left+1,
R.Top+(((R.Bottom- R.Top)-B.bmHeight) div 2),
B.bmWidth, B.bmHeight,
DCfrom, 0, 0, SRCCOPY );
SelectObject( DCfrom, oldBmp );
DeleteDC( DCfrom );
end;
end;
end;
function TForm1.MainMenu1DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
var
r:TRect;
begin
if (ItemIdx>=0) then begin
R:=Rect;
Inc(R.Left,40);
FillRect(DC,Rect,GetSysColorBrush(COLOR_MENU));
if PMenu(Sender).ItemEnabled[ItemIdx] then
begin
if odsSelected in ItemState then
FillRect(DC,Rect,GetSysColorBrush(COLOR_BTNFACE));
SetTextColor(DC,ClBlack);
end else begin
SetTextColor(DC,ClGrey);
end;
SetBkMode(DC,TRANSPARENT);
DrawBitmap(DC,Rect,PMenu(Sender).ItemBitmap[ItemIdx]);
DrawText(DC, Pchar(PMenu(Sender).ItemText[ItemIdx]),Length(PMenu(Sender).ItemText[ItemIdx]),
R,DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
end;
end;
function TForm1.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
var MIS: PMeasureItemStruct;
begin
Result := FALSE;
case Msg.message of
WM_MEASUREITEM : begin
MIS := Pointer(msg.lParam);
with MIS^ do begin
begin
itemHeight := mItemHeight;
ItemWidth:=mItemWidth;
Result := True;
end;
end;
end;
end;
end;
Еще можно использовать XPMenus, там можно задавать высоту и ширину меню не используя OnDrawItem, да и выглядит он лучше
|