Конференция "KOL" » Вопросы к Старшим [D7, WinXP]
 
  • =BuckLr= © (22.04.08 11:02) [20]
    По ходу обсуждения. А возможно ли реализовать компонент, аналогичный этому, только на основе richedit? Любопытно, но я никогда не видел подобной реализации.
  • mdw © (22.04.08 11:51) [21]
    У тедди на сайте есть нечто подобное, но довольно глючно работает. Я вообще на основе richedit не одной работоспособной реализации не видел.
  • =BuckLr= © (22.04.08 13:20) [22]
    У Thaddy? Это где? Я не видел... Было бы интересно посмотреть. Просто я видел на wasm.ru статью о реализации подсветки на основе richedit, но на asm-е. Думаеццо, раз можно на asm-t, то можно и на delphi :)
  • mdw © (22.04.08 13:24) [23]
    www.thaddy.com
  • =BuckLr= © (22.04.08 15:12) [24]

    > www.thaddy.com

    Да я понял. Только нету там такого компонента :) Если есть у тебя, можешь скинуть?
  • mdw © (22.04.08 19:17) [25]
  • MYRX (30.04.08 10:51) [26]
    Еще один, наверное простой, вопрос:
    Как сделать так, чтобы вкладка в TabControl выделялась по правому щелчку мыши(я подвязал к нему popup менюшку, вот и хочется, чтобы popup срабатывал для той вкладки, по которой был сделан правый клик)
  • Дмитрий К © (30.04.08 14:46) [27]
    Индекс вкладки над которой находится курсор можно узнать вот так:
    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;

  • MYRX (03.05.08 14:21) [28]
    Спасибо, Дмитрий!
    Программа стла гораздо симпатичней.
  • MYRX (03.05.08 14:24) [29]
    А кто - нить знает, как к popup привязать иконки (чтобы слева от пунктов отображались) и как в main-меню такое-же сотворить?
  • Danger © (03.05.08 20:57) [30]

    > А кто - нить знает, как к popup привязать иконки (чтобы
    > слева от пунктов отображались) и как в main-меню такое-же
    > сотворить?


    В design-time свойства bitmap* элементов меню. Независимо от типа меню (main/popup).
  • MYRX (07.05.08 09:54) [31]
    Снова выручаешь, Danger, спасибо!

    Остался еще вопрос:

    У меня в ImageList иконки хранятся 48х48

    а как их уменьшить?
    а то у меня в менюшках только краешки этих иконок рисуются...
  • Demt (07.05.08 19:13) [32]
    MYRX, уменьшать надо графическим редактором, либо редактором иконок.
  • Danger © (08.05.08 06:13) [33]

    > Demt   (07.05.08 19:13) [32]
    > MYRX, уменьшать надо графическим редактором, либо редактором
    > иконок.


    Или сразу грузить иконки подходящего размера (16х16). Обычно иконки (ICO) содержат в себе изображения разных размеров, скорее всего будут содержать и маленький значок. Можно выдрать его из коллекции и грузить только его в ImageList.

    А если неохота заморачиваться, можно в нете поискать готовые наборы значков нужного размера, их там на любой вкус и цвет...
  • MYRX (08.05.08 09:38) [34]
    Очень хочется позаморачивться )
    у Битмапа есть же StretchDraw
    Может можно это как-то использовать?
    Просто неохота разбабахивать (увеличивать размер)
    программу еще и уменьшенными копиями
    уже имеющихся иконок

    Нет ничего невозможного
    Наверняка - же существует способ решить и эту проблему
    Только я сам не додумаюсь,
    потому и уповаю на более опытных товарищей
  • Danger © (08.05.08 11:01) [35]

    > MYRX   (08.05.08 09:38) [34]
    > Просто неохота разбабахивать (увеличивать размер)
    > программу еще и уменьшенными копиями
    > уже имеющихся иконок
    >


    Если есть ICO-файл с нужной коллекцией значков, открываете его в редакторе иконок, и экспортируете из всего набора только маленькую иконку. Потом в вашей программе ставите  размер значков в ImageList'e 16х16, и добавляете туда ваш значок, вот и все. А большие значки из коллекции (32х32, 48х48) нет нужды таскать за собой, если они реально не будут использоваться.

    Аналогично, если требуется размер 32х32 - ставите соответствующий размер в ImageList'e и добавляете в него только значок размером 32х32, выдранный из ICO-файла.
  • Compiler © (08.05.08 14:14) [36]
    > Очень хочется позаморачивться )

    Сколько угодно. ;)

    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); //Рисунок из ресурса Высота 22 Ширина 216
    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;

  • MYRX (14.05.08 13:40) [37]
    Супер!
    Спасибо, Compiler.
    Работает гораздо лучше моего алгоритма
    вот что значит опыт.
    При большом количестве иконок выигрыш на лицо.
  • MYRX (14.05.08 13:45) [38]
    По ходу назрело еще два вопроса:

    1) Кто-нибудь знает, как расширить сами пункты меню, чтобы в них влезали большие иконки? (большие - красивше смотрятся)

    2) И еще просьбочка:
      Поделитесь, пожалуйста, алгоритмом для анализа pas-файлов
      очень нужно определить уровень вложенности циклов.
  • Compiler © (15.05.08 00:21) [39]
    > 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]);
      // или DrawIconEx(DC, Rect.Left,Rect.Top, LoadIcon(0,IDI_HAND),30,30, 0, 0, DI_NORMAL );
      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, да и выглядит он лучше
 
Конференция "KOL" » Вопросы к Старшим [D7, WinXP]
Есть новые Нет новых   [134431   +14][b:0.001][p:0.003]