Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Menu Hintergrundbild (https://www.delphipraxis.net/190090-menu-hintergrundbild.html)

EWeiss 29. Aug 2016 16:18

Menu Hintergrundbild
 
Ich erstelle ein Ownerdraw Menu.
Dort möchte ich als Hintergrund ein Bild einfügen.
Das Problem dabei ist wenn ich das Handle des Menü nehme daraus den Rect auslese und das Bild als Hintergrund zuweise
das anschließend alle Items nicht mehr gezeichnet werden beim Start.

Verwende ich aber die Items und lege das Hintergrundbild dafür fest sind alle Items sichtbar.
Aber es sieht dann aus wie.. na ihr wisst schon. (Siehe Anhang Items)

Zeichnen des Hintergrund in alle items.

Delphi-Quellcode:
// DrawBackground
if GDIP_CreateFromHDC(PDis.HDC, Graphics) = 0 then
begin
  ImgBack := Cardinal(SKAERO_GetProperty(WinHandle, FORM_Center));

  if not(PDis.ItemId = IDM_SeperatorFiles) and not(PDis.ItemId = IDM_SeperatorPList)
    and not(PDis.ItemId = IDM_SeperatorSkins) and not
    (PDis.ItemId = IDM_SeperatorClose) then
  begin
    GDIP_GetImageSize(ImgBack, imgW, imgH);
    GDIP_DrawImageRectRectI(Graphics, ImgBack, PDis.rcItem.Left, PDis.rcItem.Top,
      PDis.rcItem.Right, 20, 0, 0, imgW, imgH, 2, nil, False, nil);
  end else
  begin
    GDIP_GetImageSize(ImgSep, imgW, imgH);
    GDIP_DrawImageRectRectI(Graphics, ImgSep, PDis.rcItem.Left, PDis.rcItem.Top,
      PDis.rcItem.Right, 20, 0, 0, imgW, imgH, 2, nil, False, nil);
  end;
end;
Zeichnen des Hintergrund.

Delphi-Quellcode:
// DrawBackground
if GDIP_CreateFromHDC(PDis.HDC, Graphics) = 0 then
begin
  GetClientRect(hMenuWnd, Rect);
  ImgBack := Cardinal(SKAERO_GetProperty(WinHandle, FORM_Center));

  GDIP_GetImageSize(ImgBack, imgW, imgH);
  GDIP_DrawImageRectRectI(Graphics, ImgBack, Rect.Left, Rect.Top,
    Rect.Right, Rect.Bottom, 0, 0, imgW, imgH, 2, nil, False, nil);
end;
Jemand eine Idee wie ich verhindern kann das die Items gelöscht werden?
Siehe Anhang Back.

gruss

EWeiss 29. Aug 2016 21:19

AW: Menu Hintergrundbild
 
Wenn ich nun mit

Delphi-Quellcode:
SendMessageW(hMenuWnd, WM_SETREDRAW, Integer(False), 0);


nach dem ersten Item das neu zeichnen des Hintergrund verweigere.
und vor dem zeichnen der Button für die Items es wieder erlaube

Delphi-Quellcode:
SendMessageW(hMenuWnd, WM_SETREDRAW, Integer(True), 0);


Dann bleibt das Hintergrundbild bestehen.

Der Seiten Effekt dabei ist dann das die Button der Items nicht aktualisieren ohne ein InvalidateRect.

Nur ein InvalidateRect in einem PaintEvent "WM_DRAWITEM" ist sehr schlecht.
Wo könnte ich InvalidateRect aufrufen wenn das Menü selektiert "ODS_SELECTED" wird?


gruss

himitsu 29. Aug 2016 21:37

AW: Menu Hintergrundbild
 
Falls sich die Items nur mit eigenem Hintergrund zeichnen lassen, dann kannst du denen natürlich denoch das Bild zuweisen.

Du mußt dann die Item-Position im Menü verwenden, damit den Bildausschnitt berechnen und dann nur diesen Ausschnitt als Item-Hintergrund verwenden.

EWeiss 29. Aug 2016 21:46

AW: Menu Hintergrundbild
 
Zitat:

Zitat von himitsu (Beitrag 1346115)
Falls sich die Items nur mit eigenem Hintergrund zeichnen lassen, dann kannst du denen natürlich denoch das Bild zuweisen.

Du mußt dann die Item-Position im Menü verwenden, damit den Bildausschnitt berechnen und dann nur diesen Ausschnitt als Item-Hintergrund verwenden.

Ja das Problem dabei ist das ich einen Hover Button verwende wenn das Item Selectiert wird.
Ich kann nicht für ein Item gleichzeitig zwei Bitmaps zeichnen ohne das ich den Hintergrund in den Hover Button kopiere.
Das möchte ich wenn möglich vermeiden da dieser schon transparent ist also das Hintergrund Bild durchscheint.

Wie gesagt für mich ist wichtig wo ich ein Invalidate ausführen kann außerhalb von WM_DRAWITEM
wenn ich von einem zum anderen Item springe.

Siehe Anhang select
Wie man sehen kann ist der Eintrag About selektiert und der Eintrag Skins.
Ohne ein Invalidate kann ich den vorher selektierten Eintrag nicht löschen.
Zeichne ich den Hintergrund komplett neu dann sind alle Items wieder unsichtbar bis auf den Selektierten.

gruss

EWeiss 30. Aug 2016 05:45

AW: Menu Hintergrundbild
 
Jetzt geht's soweit muss nur noch etwas an den Ausmaßen des Hintergrundbild feilschen.

Ich kopiere jetzt den Hintergrund so wie von himitsu vorgeschlagen in die Items.

Vorschau (Von meine Server da die Bilder hier schlecht sind nach dem Upload)
Inklusive Transparenten (kann man ausschalten) Menu Ownerdraw.

Zitat:

damit den Bildausschnitt berechnen
Muss ich noch machen noch nicht exakt. ;)

Der ganze Kram..
Delphi-Quellcode:
{$REGION 'WM_DRAWITEM'}
    WM_DRAWITEM:
      begin
        PDis := Pointer(lP);
        case PDis^.CtlType of
          ODT_MENU: // 1 Ownerdrawn menu item
            begin
              hMenuWnd := WindowFromDC(PDis.HDC);

              if (IsWindow(hMenuWnd)) then
              begin
                if OnTransMenu then
                begin
                  if ckAeroBlur.GetCheckButtonStatus(ckAeroBlur.Handle)
                    or ckCrystal.GetCheckButtonStatus(ckCrystal.Handle) then
                    if trbGlassOpacity.GetTrackValue(trbGlassOpacity.Handle) >= 128 then
                      SKAERO_SetLayeredAlpha
                        (hMenuWnd, trbGlassOpacity.GetTrackValue(trbGlassOpacity.Handle))
                    else
                      SKAERO_SetLayeredAlpha(hMenuWnd, 128);
                end
                else
                  SKAERO_SetLayeredAlpha(hMenuWnd, 255)
              end;

              if hSubSkinMenu = PDis.ItemId then
                PDis.ItemId := IDM_Skin;

              GDIP_DisposeImage(Img);
              GDIP_DisposeImage(ImgItem);
              Img := 0;
              ImgItem := 0;

              SetBkMode(PDis.HDC, OPAQUE);

              Txt := PWideChar(GetMenuTxt(PDis.ItemId, Img, ImgItem, ImgSep));

              // Create Graphics
              if GDIP_CreateFromHDC(PDis.HDC, Graphics) = 0 then
              begin
                // DrawButton
                if (PDis.itemState and ODS_SELECTED) <> 0 then
                  SKAERO_PaintButton(Graphics, 3, ImgItem, PDis.rcItem.Left, PDis.rcItem.Top,
                    PDis.rcItem.Right, 20, BS_PUSHBUTTON)
                else
                begin
                  ImgBack := Cardinal(SKAERO_GetProperty(WinHandle, FORM_Center));

                  GetClientRect(hMenuWnd, Rect);
                  GDIP_GetImageSize(ImgBack, imgW, imgH);
                  GDIP_SetInterpolationMode(Graphics, InterpolationModeHighQualityBicubic);
                  //GDIP_DrawImageRectRectI(Graphics, ImgBack, PDis.rcItem.Left, PDis.rcItem.Top,
                  //  PDis.rcItem.Right, Rect.Bottom, 0, PDis.rcItem.Top, imgW, imgH , 2, nil, False, nil);

                  GDIP_DrawImageRectRectI(Graphics, ImgBack, PDis.rcItem.Left, PDis.rcItem.Top,
                    PDis.rcItem.Right, 20, 0, PDis.rcItem.Top, imgW, 20 , 2, nil, False, nil);

                  if (PDis.ItemId = IDM_SeperatorFiles) or (PDis.ItemId = IDM_SeperatorPList)
                    or (PDis.ItemId = IDM_SeperatorSkins) or
                    (PDis.ItemId = IDM_SeperatorClose) then
                  SKAERO_PaintButton(Graphics, 4, ImgItem, PDis.rcItem.Left, PDis.rcItem.Top,
                    PDis.rcItem.Right, 20, BS_PUSHBUTTON)
                end;

                // DrawText
                GDIP_GetImageSize(Img, imgW, imgH);
                if not(PDis.ItemId = IDM_SeperatorFiles) and not(PDis.ItemId = IDM_SeperatorPList)
                  and not(PDis.ItemId = IDM_SeperatorSkins) and not
                  (PDis.ItemId = IDM_SeperatorClose) then
                begin
                  PDis.rcItem.Left := 18;
                  PDis.rcItem.Top := PDis.rcItem.Top + 2;
                  GDIP_DrawTextToDC(PDis.HDC, Txt, PDis.rcItem, SKAERO_INACTIVECAPTION, PWideChar
                      (SKAERO_TEXTFONT), SKAERO_PUSHBUTFONTSIZE, FontStyleBoldItalic, -1, 0);
                end
                else
                begin
                  PDis.rcItem.Left := 0;
                  PDis.rcItem.Top := PDis.rcItem.Top + 2;
                  GDIP_DrawTextToDC(PDis.HDC, Txt, PDis.rcItem, SKAERO_ACTIVECAPTION, PWideChar
                      (SKAERO_TEXTFONT), SKAERO_PUSHBUTFONTSIZE, FontStyleBoldItalic, -1, 0);
                end;

                PDis.rcItem.Left := 0;

                case PDis.ItemId of
                  IDM_WMPPRESET .. IDM_WMPPRESET_LAST:
                    begin
                      newItem := WMPVisPreset[PlgSelectedPreset];
                      if Txt = newItem then
                      begin
                        imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 3, PDis.rcItem.Top + 2, imgW, imgH,
                          imgW, 0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end
                      else
                      begin
                        if (PDis.ItemId >= IDM_WMPPRESET) and (PDis.ItemId <= IDM_WMPPRESET_LAST)
                          then
                          imgW := imgW div 2;
                          GDIP_DrawImageRectRectI
                            (Graphics, Img, PDis.rcItem.Left + 3, PDis.rcItem.Top + 2, imgW, imgH, 0,
                            0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end;
                    end;
                  IDM_AMPMODULE .. IDM_AMPMODULE_LAST:
                    begin
                      newItem := AmpVisPreset[PlgSelectedModule];
                      if Txt = newItem then
                      begin
                        imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 3, PDis.rcItem.Top + 2, imgW, imgH,
                          imgW, 0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end
                      else
                      begin
                        if (PDis.ItemId >= IDM_AMPMODULE) and (PDis.ItemId <= IDM_AMPMODULE_LAST)
                          then
                          imgW := imgW div 2;
                          GDIP_DrawImageRectRectI
                            (Graphics, Img, PDis.rcItem.Left + 3, PDis.rcItem.Top + 2, imgW, imgH, 0,
                            0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end;
                    end;
                  IDM_SKINS .. IDM_SKINS_LAST:
                    begin
                      newItem := SkinList[ActiveSkin];
                      if Txt = newItem then
                      begin
                        imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 3, PDis.rcItem.Top + 2, imgW, imgH,
                          imgW, 0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end
                      else
                      begin
                        if (PDis.ItemId >= IDM_SKINS) and (PDis.ItemId <= IDM_SKINS_LAST) then
                          imgW := imgW div 2;
                          GDIP_DrawImageRectRectI
                            (Graphics, Img, PDis.rcItem.Left + 3, PDis.rcItem.Top + 2, imgW, imgH, 0,
                            0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end;
                      PDis.rcItem.Left := 0;
                    end;
                else
                  begin
                    GDIP_GetImageSize(Img, imgW, imgH);
                    GDIP_DrawImageRectRectI(Graphics, Img, PDis.rcItem.Left + 3, PDis.rcItem.Top,
                      imgW, imgH, 0, 0, imgW, imgH, 2, nil, False, nil);
                  end;
                end;
                GDIP_DeleteGraphics(Graphics);
              end;
              Result := 1;
              exit;
            end;
          ODT_LISTBOX:
            begin
              Result := 1;
              exit;
            end;
        end;
      end;
{$ENDREGION}
gruss

EWeiss 30. Aug 2016 19:40

AW: Menu Hintergrundbild
 
Ich nochmal .. ;)

Irgendwo habe ich noch ein Problem.
Habe mal ein test Projekt in VB zum testen erstellt.

Ich erstelle ein Image..

Code:
Call GdipCreateFromHDC(Me.hdc, graphics)

Call GdipLoadImageFromFile(StrConv(App.path & "\GrapeBunch.jpg", vbUnicode), img)
Call GdipGetImageHeight(img, lngHeight)
Call GdipGetImageWidth(img, lngWidth)
Call GdipDrawImageRectRectI(graphics, img, 10, 10, picGrapes.Width, picGrapes.Height, 0, 0, lngWidth, lngHeight, UnitPixel)
So weit so gut.
Das Image wird auf die richtige Größe Skaliert.

Jetzt habe ich ein Menü den will ich dieses Bitmap als Hintergrundbild zuweisen.
Das geht aber nur über die Items.
Ein Item ist 20x hoch.

Jetzt erstelle ich zum testen ein 2 Graphics Objekt.
Code:
Call GdipCreateFromHDC(picGrapes.hdc, graphics2)

Call GdipGetImageHeight(img, lngHeight)
Call GdipGetImageWidth(img, lngWidth)
Call GdipSetInterpolationMode(graphics2, InterpolationModeHighQualityBicubic)

For i = 0 To 9
  Call GdipDrawImageRectRectI(graphics2, img, 0, (i * 20), picGrapes.Width, 20, 0, 20 * i, lngWidth, 20, UnitPixel)
Next

Das Problem ist aber nun das die Dimensionen nicht gleich dem vom ersten Image sind.
Siehe Anhang..

Ich kann die höhe picGrapes.Height nicht setzen siehe (i * 20) die Y Position des aktuellen Menu Item.
Wo liegt mein Denkfehler bzw.. etwas vergessen?

Image Vorschau

gruss

EWeiss 31. Aug 2016 14:34

AW: Menu Hintergrundbild
 
Muss sich niemand mehr melden.. :)
Alleinunterhalter!

Geht jetzt so wie es soll.
Mein Fehler war das ich die Top Position berechnet habe aber nicht die Höhe
deshalb wurde das Bild nicht korrekt Skaliert.

Ach ja ein Invalidate war nicht nötig.
Vorher.
Delphi-Quellcode:
GDIP_DrawImageRectRectI(Graphics, ImgBack, PDis.rcItem.Left, PDis.rcItem.Top,
  PDis.rcItem.Right, 20, 0, PDis.rcItem.Top, imgW, 20 , 2, nil, False, nil);
Nachher.
Delphi-Quellcode:
GDIP_DrawImageRectRectI(Graphics, ImgBack, 20, PDis.rcItem.Top,
  Rect.Right, ImgItemHeight, 0, PDis.rcItem.Top * (Integer(imgH) div Rect.Bottom),
  imgW, (Integer(imgH) div Rect.Bottom) * ImgItemHeight, 2, nil, False, nil);


gruss

Sherlock 31. Aug 2016 15:15

AW: Menu Hintergrundbild
 
Die Anzahl der NonVCL-Entwickler geht leider zurück. Umso genialer finde ich es, daß Du erstens weitermachst, und zweitens hier Deine Fortschritte und beeindruckenden Ergebnisse postest. :thumb:

Sherlock

EWeiss 31. Aug 2016 15:18

AW: Menu Hintergrundbild
 
Zitat:

Zitat von Sherlock (Beitrag 1346347)
Die Anzahl der NonVCL-Entwickler geht leider zurück. Umso genialer finde ich es, daß Du erstens weitermachst, und zweitens hier Deine Fortschritte und beeindruckenden Ergebnisse postest. :thumb:

Sherlock

Danke ... Kann ich gebrauchen. :thumb: :-D

Hier nochmal alle benötigten Parts falls es mal jemand braucht. (In der Reihenfolge wie sie ausgeführt werden)
Die GDI+ Sachen muss man dann halt dementsprechend umlegen.
Jo ist was viel ;) Aber was soll's.

PopupMenu erstellen.
Delphi-Quellcode:
{$REGION 'WM_NCRBUTTONDOWN'}
    WM_NCRBUTTONDOWN:
      begin
        hPopupMenu := CreatePopupMenu; // Bitmap Popupmenu
        hSubSkinMenu := CreatePopupMenu; // Bitmap SkinSubmenu
        if hPopupMenu <> 0 then
        begin
          AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_About, '');
          AppendMenu(hPopupMenu, MF_OWNERDRAW or MF_SEPARATOR, IDM_SeperatorSkins, '');
          AppendMenu(hPopupMenu, MF_OWNERDRAW or MF_POPUP, hSubSkinMenu, 'Skins');

          MnuSkins := nil;
          Files := nil;
          FindAllFiles(ExtractFilePath(ParamStr(0)) + 'Skins', '.ske', TRUE);
          SetLength(MnuSkins, Length(Files));

          if Assigned(SkinList) then
            SkinList.Clear;
          for IntI := 0 to Length(Files) - 1 do
          begin
            if not Assigned(SkinList) then
              SkinList := TStringList.Create;
            sSkinItem := Split(ExtractFileDir(Files[IntI]), '\');
            Item := High(sSkinItem);
            SkinList.Add(sSkinItem[Item]);
            AppendMenu(hSubSkinMenu, MF_OWNERDRAW, IDM_SKINS + IntI, '');
          end;

          AppendMenu(hPopupMenu, MF_OWNERDRAW or MF_SEPARATOR, IDM_SeperatorFiles, '');
          AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_AddFile, '');
          AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_AddFolder, '');
          AppendMenu(hPopupMenu, MF_OWNERDRAW or MF_SEPARATOR, IDM_SeperatorPList, '');
          AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_Playlist, '');
          AppendMenu(hPopupMenu, MF_OWNERDRAW or MF_SEPARATOR, IDM_SeperatorClose, '');
          AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_Close, '');

          GetCursorPos(p);
          MenuWahl := TrackPopupMenuEx(hPopupMenu, TPM_RETURNCMD, p.x, p.y, WinHandle, nil);
          DestroyMenu(hPopupMenu);
          ImgBack := 0;
          if MenuWahl then
            SendMessage(WinHandle, WM_COMMAND, Makelong(word(MenuWahl), 0), 0);
        end;
      end;
{$ENDREGION}
Delphi-Quellcode:
{$REGION 'WM_MEASUREITEM'}
    WM_MEASUREITEM:
      begin
        PMis := Pointer(lP);
        case PDis^.CtlType of
          ODT_MENU: // 1 Ownerdrawn menu
            begin
              if wP = 0 then
              begin
                Txt := WideString(GetMenuTxt(PDis.ItemId, Img, ImgItem, ImgSep));
                try
                  hFDefault := TFont.Create(PDis.hDC);
                  hFDefault.Name := SKAERO_TEXTFONT;
                  hFDefault.Size := SKAERO_PUSHBUTFONTSIZE;
                  PMis^.itemWidth := GetTextWidth(hFDefault, Txt) + 20;
                  PMis^.itemHeight := 20;
                  ImgItemHeight := PMis^.itemHeight;
                finally
                  hFDefault.Free;
                end;
                Result := 1;
                exit;
              end;
            end;
          ODT_LISTBOX:
            begin
              Result := 1;
              exit;
            end;
        end;
      end;
{$ENDREGION}
Delphi-Quellcode:
{$REGION 'WM_DRAWITEM'}
    WM_DRAWITEM:
      begin
        PDis := Pointer(lP);
        case PDis^.CtlType of
          ODT_MENU: // 1 Ownerdrawn menu
            begin
              hMenuWnd := WindowFromDC(PDis.HDC);

              if (IsWindow(hMenuWnd)) then
              begin
                if OnTransMenu then
                begin
                  if ckAeroBlur.GetCheckButtonStatus(ckAeroBlur.Handle)
                    or ckCrystal.GetCheckButtonStatus(ckCrystal.Handle) then
                    if trbGlassOpacity.GetTrackValue(trbGlassOpacity.Handle) >= 128 then
                      SKAERO_SetLayeredAlpha
                        (hMenuWnd, trbGlassOpacity.GetTrackValue(trbGlassOpacity.Handle))
                    else
                      SKAERO_SetLayeredAlpha(hMenuWnd, 128);
                end
                else
                  SKAERO_SetLayeredAlpha(hMenuWnd, 255)
              end;

              if hSubSkinMenu = PDis.ItemId then
                PDis.ItemId := IDM_Skin;

              GDIP_DisposeImage(Img);
              GDIP_DisposeImage(ImgItem);

              SetBkMode(PDis.HDC, OPAQUE);

              Txt := PWideChar(GetMenuTxt(PDis.ItemId, Img, ImgItem, ImgSep));

              // Create Graphics
              if GDIP_CreateFromHDC(PDis.HDC, Graphics) = 0 then
              begin
                // DrawButton
                if (PDis.itemState and ODS_SELECTED) <> 0 then
                  SKAERO_PaintButton(Graphics, 3, ImgItem, 20, PDis.rcItem.Top,
                    PDis.rcItem.Right, ImgItemHeight, BS_PUSHBUTTON)
                else
                begin
                  ImgBack := Cardinal(SKAERO_GetProperty(WinHandle, FORM_Center));

                  GetClientRect(hMenuWnd, Rect);
                  GDIP_GetImageSize(ImgBack, imgW, imgH);
                  GDIP_SetInterpolationMode(Graphics, InterpolationModeHighQualityBicubic);

                  GDIP_DrawImageRectRectI(Graphics, ImgBack, 20, PDis.rcItem.Top,
                    Rect.Right, ImgItemHeight, 0, PDis.rcItem.Top * (integer(imgH) div Rect.Bottom),
                      imgW, (integer(imgH) div Rect.Bottom) * ImgItemHeight, 2, nil, False, nil);

                  if (PDis.ItemId = IDM_SeperatorFiles) or (PDis.ItemId = IDM_SeperatorPList)
                    or (PDis.ItemId = IDM_SeperatorSkins) or
                    (PDis.ItemId = IDM_SeperatorClose) then

                  SKAERO_PaintButton(Graphics, 4, ImgItem, 20, PDis.rcItem.Top,
                    PDis.rcItem.Right, ImgItemHeight, BS_PUSHBUTTON)
                end;

                // DrawText
                GDIP_GetImageSize(Img, imgW, imgH);
                if not(PDis.ItemId = IDM_SeperatorFiles) and not(PDis.ItemId = IDM_SeperatorPList)
                  and not(PDis.ItemId = IDM_SeperatorSkins) and not
                  (PDis.ItemId = IDM_SeperatorClose) then
                begin
                  PDis.rcItem.Left := 38;
                  PDis.rcItem.Top := PDis.rcItem.Top + 2;
                  GDIP_DrawTextToDC(PDis.HDC, Txt, PDis.rcItem, SKAERO_INACTIVECAPTION, PWideChar
                    (SKAERO_TEXTFONT), SKAERO_PUSHBUTFONTSIZE, FontStyleBoldItalic, 1.1, 0);
                end
                else
                begin
                  // Allign Text Center
                  hFDefault := TFont.Create(PDis.hDC);
                  TxtLen := GetTextWidth(hFDefault, Txt);
                  PDis.rcItem.Left := ((PDis.rcItem.Right - TxtLen) div 2) - 6;
                  PDis.rcItem.Top := PDis.rcItem.Top;

                  GDIP_DrawTextToDC(PDis.HDC, Txt, PDis.rcItem, SKAERO_ACTIVECAPTION, PWideChar
                      (SKAERO_TEXTFONT), 13, FontStyleBold, 1.1, 0);
                  hFDefault.Free;
                end;

                PDis.rcItem.Left := 0;

                case PDis.ItemId of
                  IDM_WMPPRESET .. IDM_WMPPRESET_LAST:
                    begin
                      newItem := WMPVisPreset[PlgSelectedPreset];
                      if Txt = newItem then
                      begin
                        imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 23, PDis.rcItem.Top + 2, imgW, imgH,
                          imgW, 0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end
                      else
                      begin
                        if (PDis.ItemId >= IDM_WMPPRESET) and (PDis.ItemId <= IDM_WMPPRESET_LAST)
                          then
                          imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 23, PDis.rcItem.Top + 2, imgW, imgH, 0,
                          0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end;
                    end;
                  IDM_AMPMODULE .. IDM_AMPMODULE_LAST:
                    begin
                      newItem := AmpVisPreset[PlgSelectedModule];
                      if Txt = newItem then
                      begin
                        imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 23, PDis.rcItem.Top + 2, imgW, imgH,
                          imgW, 0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end
                      else
                      begin
                        if (PDis.ItemId >= IDM_AMPMODULE) and (PDis.ItemId <= IDM_AMPMODULE_LAST)
                          then
                          imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 23, PDis.rcItem.Top + 2, imgW, imgH, 0,
                          0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end;
                    end;
                  IDM_SKINS .. IDM_SKINS_LAST:
                    begin
                      newItem := SkinList[ActiveSkin];
                      if Txt = newItem then
                      begin
                        imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 23, PDis.rcItem.Top + 2, imgW, imgH,
                          imgW, 0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end
                      else
                      begin
                        if (PDis.ItemId >= IDM_SKINS) and (PDis.ItemId <= IDM_SKINS_LAST) then
                          imgW := imgW div 2;
                        GDIP_DrawImageRectRectI
                          (Graphics, Img, PDis.rcItem.Left + 23, PDis.rcItem.Top + 2, imgW, imgH, 0,
                          0, imgW, imgH, 2, nil, False, nil);

                        GDIP_DisposeImage(Img);
                      end;
                      PDis.rcItem.Left := 0;
                    end;
                else
                  begin
                    GDIP_GetImageSize(Img, imgW, imgH);
                    GDIP_DrawImageRectRectI(Graphics, Img, 23, PDis.rcItem.Top,
                      imgW, imgH, 0, 0, imgW, imgH, 2, nil, False, nil);
                  end;
                end;

                if (PDis.itemAction and ODA_DRAWENTIRE) <> 0 then
                begin
                  GetClipBox(PDis.hDC, Rect);
                  GDIP_FillRect(Graphics, 0, 0, 20, Rect.Bottom, SKAERO_INACTIVECAPTION);

                  if Rect.Bottom > 100 then
                  begin
                    hFDefault := TFont.Create(PDis.hDC);
                    hFDefault.Name := SKAERO_TEXTFONT;
                    hFDefault.Size := 10;
                    hFDefault.Style := [fsBold, fsUnderline];
                    hFDefault.Orientation := 900;
                    hFDefault.Color := RGB(255,255,250);
                    Rect.Bottom := Rect.Bottom + 12;
                    DrawText(PDis.hDC, 'Sound Machine', length('Sound Machine'), Rect,
                      DT_BOTTOM or DT_LEFT or DT_SINGLELINE);

                    hFDefault.Free;
                  end;
                end;
                GDIP_DeleteGraphics(Graphics);
              end;
              Result := 1;
              exit;
            end;
          ODT_LISTBOX:
            begin
              Result := 1;
              exit;
            end;
        end;
      end;
{$ENDREGION}
Delphi-Quellcode:
{$REGION 'function GetMenuTxt'}

// Hier wird der Text für den Menu Eintrag übergeben
// und für diesen Eintrag zugehörige icon als *.png File 16x16
function GetMenuTxt(ItemId: integer; var Img: Cardinal; var ImgItem: Cardinal;
  var ImgSep: Cardinal): WideString;
var
  sItem: string;
  hList: HWND;

begin

  case ItemId of
    IDM_SeperatorClose:
      Result := '-Application-';
    IDM_Close:
    begin
      sItem := 'Menu\MEN_Close.png';
      Result := 'Close SoundMachine';
    end;
    IDM_About:
    begin
      sItem := 'Menu\MEN_About.png';
      Result := 'About';
    end;
    IDM_WMPPRESET .. IDM_WMPPRESET_LAST:
    begin
      sItem := 'BTN_Check.png';
      Result := WMPVisPreset[ItemId - IDM_WMPPRESET];
    end;
    IDM_AMPMODULE .. IDM_AMPMODULE_LAST:
    begin
      sItem := 'BTN_Check.png';
      Result := AmpVisPreset[ItemId - IDM_AMPMODULE];
    end;
    IDM_SeperatorSkins:
      Result := '-Appearance-';
    IDM_Skin:
    begin
      sItem := 'Menu\MEN_SkinFolder.png';
      Result := 'Skins';
    end;
    IDM_SKINS .. IDM_SKINS_LAST:
    begin
      sItem := 'BTN_Check.png';
      Result := SkinList[ItemId - IDM_SKINS];
    end;
    IDM_SeperatorFiles:
      Result := '-File Dependencies-';
    IDM_AddFile:
    begin
      sItem := 'Menu\MEN_File.png';
      Result := 'Add File';
    end;
    IDM_AddFolder:
    begin
      sItem := 'Menu\MEN_Folder.png';
      Result := 'Add Folder';
    end;
    IDM_SeperatorPList:
      Result := '-Playlist-';
    IDM_Playlist:
      begin
        sItem := 'Menu\MEN_Playlist.png';
        hList := SKAERO_GetMainItem(MainHandle, ID_PLAYLIST);
        if isWindowVisible(hList) then
          Result := 'Hide PlayList'
        else
          Result := 'Show PlayList';
      end;
  end;

  Img := SKAERO_AddResource(MainHandle, PWideChar(SKAERO_CONFIG_GetSkinFolder + sItem));
  if TmpImgItem = 0 then
    TmpImgItem := SKAERO_AddResource(MainHandle, PWideChar
        (SKAERO_CONFIG_GetSkinFolder + 'List\ListSelect.png'))
  else
    ImgItem := TmpImgItem;

  if TmpImgSep = 0 then
    TmpImgSep := SKAERO_AddResource(MainHandle, PWideChar
        (SKAERO_CONFIG_GetSkinFolder + 'Shape.png'))
  else
    ImgSep := TmpImgSep;
end;
{$ENDREGION}
Delphi-Quellcode:
function GetTextWidth(fnt: TFont; const text: string): Integer;
var
  dc: hdc;
  tsize: Windows.tsize;
begin
  dc := GetDC(0);
  SelectObject(dc, fnt.Handle);
  GetTextExtentPoint32(dc, PWideChar(text), Length(text), tsize);
  ReleaseDC(0, dc);
  Result := tsize.cx;
end;
gruss

Luckie 1. Sep 2016 07:46

AW: Menu Hintergrundbild
 
Reine Psychologie. Wir hören dir interessiert zu und lassen dich die Lösungen selber finden. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz