Конференция "WinAPI" » Стиль Windows Xp для нарисованой кнопки на Caption bar ? [D7, WinXP]
 
  • kolj (08.01.09 15:07) [0]
    Привет всем!!!
    Возникла следующа проблемка:
    Нужно сделать кнопку на Caption bar формы (код ниже),с этим проблем нет, однако возникла другая проблема: Когда в Windows xp стоит стиль Windows Xp  (не классический) кнопка рисуется в классическом стиле, и наложение Xpmanifest не помогает. Как можно решить эту проблему ? Благодарю.

    procedure TForm1.DrawCaptButton;
    var
     xFrame, yFrame, xSize, ySize: integer;
     R: TRect;
    begin
     
     xFrame:= GetSystemMetrics(SM_CXFRAME);
     yFrame:= GetSystemMetrics(SM_CYFRAME);

     
     xSize:= GetSystemMetrics(SM_CXSIZE);
     ySize:= GetSystemMetrics(SM_CYSIZE);

       CaptionBtn:= Bounds(Width - xFrame - 4*xSize + 2,
                         yFrame + 2, xSize - 2, ySize - 4);


     Canvas.Handle:= GetWindowDC(Self.Handle);

     Canvas.Font.Name:= 'Symbol';
     Canvas.Font.Color:= clBlue;
     Canvas.Font.Style:= [fsBold];
     Canvas.Pen.Color:= clYellow;
     Canvas.Brush.Color:= clBtnFace;

     try
       DrawButtonFace(Canvas, CaptionBtn, 1, bsnew, False, False, False);
       
       R:= Bounds(Width - xFrame - 4*xSize + 2,
                   yFrame + 3, xSize - 6, ySize - 7);
       with CaptionBtn do
         Canvas.TextRect(R, R.Left + 2, R.Top - 1, 'W');
     finally
       ReleaseDC(Self.Handle, Canvas.Handle);
       Canvas.Handle:= 0;
     end;
    end;
  • Eraser © (08.01.09 16:24) [1]
    > [0] kolj   (08.01.09 15:07)

    для начала, посмотреть готорые решения, например из пакета JEDI VCL. но там у кнопки серьезный недостаток, при ресайзе формы есть утечка огромного количества GDI дескрипторов.
  • kolj (08.01.09 19:25) [2]
    Как оказалось всьо просто. В место ф-и DrawButtonFace надо использовать ф-ю DrawThemeBackground.
  • Eraser © (08.01.09 19:59) [3]
    научишься рисовать такие стилизованные кнопки в висте с включенным аеро - скажи )
  • Maks1509 (26.01.09 00:33) [4]
  • Eraser © (29.01.09 08:08) [5]
    вот так в висте выглядит этот пример http://f.imagehost.org/0470/example.png
  • Maks1509 (01.02.09 11:03) [6]
    Я кстати хотел универсально сделать с пересчетом координат на нестандартных темах оформления еще.

     SizeX := GetSystemMetrics(SM_CXSMSIZE) - GetSystemMetrics(SM_CXFRAME);
     SizeY := GetSystemMetrics(SM_CYSMSIZE) - GetSystemMetrics(SM_CYFRAME);
     xFrame := GetSystemMetrics(SM_CXFRAME);
     yFrame := GetSystemMetrics(SM_CYFRAME);

     iWidth := WindowRect.Right - WindowRect.Left;
     hhh:=GetSystemMetrics(SM_CXEDGE)*2+1;

     if InitThemeLibrary and UseThemes then
       //  ширина        -         5         -       16
       MinBtnRect := Bounds(
       iWidth - (hhh + (SizeX*2) + GetSystemMetrics(SM_CXEDGE)),
       xFrame+1,
       SizeX,
       Sizey
       );
     MinBtnRect.Left := iWidth - (hhh + (SizeX*2) + GetSystemMetrics(SM_CXEDGE))-15;
     MinBtnRect.top := xFrame+1;
     MinBtnRect.right := 192+SizeX;//192 заменить на величину, не помню, тут она вычисляется, я просто так еще решил проверить
     MinBtnRect.bottom := MinBtnRect.top+Sizey;



    Как-то так вычислял длинну и высоту кнопок. Только с посдчетом координат фигня. Кнопка вполовину рисуется почему -то.
 
Конференция "WinAPI" » Стиль Windows Xp для нарисованой кнопки на Caption bar ? [D7, WinXP]
Есть новые Нет новых   [134435   +38][b:0][p:0.001]