Seite 1 von 2

ListIconGadget - Zelle Fett?

Verfasst: 14.01.2009 19:50
von pickelrobert
Hallo.

Gibt es eine einfache Möglichkeit eine Zelle in einem ListIconGadget "Fett", "Kursiv" usw. zu machen, OHNE irgendwelche Fonts zu laden? Also Quasi den standardmäßig verwendeten Font zu benutzen?

Danke schonmal.

Verfasst: 14.01.2009 22:58
von Dare Devil
Das geht, indem du einen Leerstring als fontname uebergibst. Dadurch benutzt dein Programm den "Standardfont" :wink:



Sofern du Windows benutzt, koennte folgender Link fuer dich interessant sein:

http://www.purearea.net/pb/CodeArchiv_v ... or+Font.pb

Verfasst: 15.01.2009 18:51
von Shardik
pickelrobert hat geschrieben:Gibt es eine einfache Möglichkeit eine Zelle in einem ListIconGadget "Fett", "Kursiv" usw. zu machen, OHNE irgendwelche Fonts zu laden? Also Quasi den standardmäßig verwendeten Font zu benutzen?
Eine "einfache" Möglichkeit kenne ich nicht, aber ich kann eine Teil-Lösung anbieten, um mit einem Callback den Schriftstil einer einzelnen Zelle abzuändern. Ohne einen zusätzlichen Font zu laden wird wohl kaum eine Lösung zu finden sein, da der Callback ja ein Handle für einen zusätzlich geladenen Font mit verändertem Stil benötigt. Wie man den in einem bestimmten Gadget verwendeten Font-Namen, die Font-Größe und den Font-Stil ermittelt, hat edel bereits demonstriert:
http://www.purebasic.fr/german/viewtopi ... 91&start=5
Mit diesen Routinen ließe sich mein Beispiel erweitern, um den in einem ListIconGadget verwendeten Font-Namen und seine Größe zu ermitteln und dann diesen Font noch einmal erneut mit dem gewünschten veränderten Stil zu laden.

Code: Alles auswählen

EnableExplicit

#WindowHeight = 112
#WindowWidth = 239

Define i
Define ModRow = 1
Define ModColumn = 1
Define RegularFont = FontID(LoadFont(#PB_Any, "Arial", 10))
Define BoldFont = FontID(LoadFont(#PB_Any, "Arial", 10, #PB_Font_Bold))
Define Style = 1
Define WindowEvent


Procedure WindowCallback(WindowID, Message, wParam, lParam)
  Shared BoldFont
  Shared RegularFont
  Shared ModRow
  Shared ModColumn
  Shared Style

  Protected *NMLVCustomDraw.NMLVCUSTOMDRAW

  If Message = #WM_NOTIFY
    *NMLVCustomDraw = lParam

    If *NMLVCustomDraw\nmcd\hdr\hWndFrom = GadgetID(0) And *NMLVCustomDraw\nmcd\hdr\code = #NM_CUSTOMDRAW
      Select *NMLVCustomDraw\nmcd\dwDrawStage
        Case #CDDS_PREPAINT
          ProcedureReturn #CDRF_NOTIFYITEMDRAW
        Case #CDDS_ITEMPREPAINT
          ProcedureReturn #CDRF_NOTIFYSUBITEMDRAW
        Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM
          If *NMLVCustomDraw\nmcd\dwItemSpec = ModRow And *NMLVCustomDraw\iSubItem = ModColumn And Style
            SelectObject_(*NMLVCustomDraw\nmcd\hDC, BoldFont)
          Else
            SelectObject_(*NMLVCustomDraw\nmcd\hDC, RegularFont)
          EndIf

          ProcedureReturn #CDRF_NEWFONT
      EndSelect
    EndIf
  EndIf

  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


If OpenWindow(0, 100, 100, #WindowWidth, #WindowHeight, "Demo für Schriftstil-Wechsel", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CompilerIf #PB_Compiler_Version < 430
    CreateGadgetList(WindowID(0))
  CompilerEndIf

  SetGadgetFont(#PB_Default, RegularFont)

  ListIconGadget(0, 5, 5, #WindowWidth - 10, #WindowHeight - 35, "Spalte 1", 75, #PB_ListIcon_GridLines)
  AddGadgetColumn(0, 1, "Spalte 2", 75)
  AddGadgetColumn(0, 2, "Spalte 3", 75)
  ButtonGadget(1, 25, #WindowHeight - 25, 189, 20, "Ändere Schriftstil von Z2S2")

  For i = 1 To 3
    AddGadgetItem(0, -1, "Z" + Str(i) + "S1" + #LF$ + "Z" + Str(i) + "S2" + #LF$ + "Z" + Str(i) + "S3")
  Next i

  SetWindowCallback(@WindowCallback(), 0)

  Repeat
    WindowEvent = WaitWindowEvent()

    If WindowEvent = #PB_Event_Gadget
      If EventGadget() = 1
        Style ! 1
        SendMessage_(GadgetID(0), #LVM_REDRAWITEMS, ModRow, ModRow)
        UpdateWindow_(GadgetID(0))
      EndIf
    EndIf
  Until WindowEvent = #PB_Event_CloseWindow
EndIf
Edit: Das fälschlicherweise hineingerutschte If...EndIf bei der Abfrage der Compiler-Version gegen CompilerIf...CompilerEndIf getauscht! Danke an edel für den Hinweis. :wink:

Verfasst: 16.01.2009 17:49
von Andesdaf
interessant... schöne Lösung, auch wenn du (nebenbei gesagt) CreateGadgetLis
weglassen könntest...

Verfasst: 16.01.2009 18:25
von Shardik
Andesdaf hat geschrieben:interessant... schöne Lösung, auch wenn du (nebenbei gesagt) CreateGadgetLis weglassen könntest...
Dankeschön, daß Dir meine Lösung gefallen hat... 8)

Zu Deinem Vorschlag des Weglassens von CreateGadgetList() habe ich allerdings eine andere Meinung. Ich persönlich arbeite parallel mit PB 4.20 und 4.30 (teilweise habe ich sogar noch einige in PB 3.94 programmierte größere Anwendungen in Produktion bei Kunden, die ich wahrscheinlich auch nicht mehr portieren werde). Es sind doch nur 3 zusätzliche Zeilen, die aber bewirken, daß der Code ohne Fehlermeldung in 4.00 - 4.20 läuft und in 4.30 keinen nervigen Hinweis ausgibt. Es gibt auch genug Beschwerden im deutschen und englischen Forum über diese Meldungen von Anfängern, aber auch von Fortgeschrittenen, die die Abschaffung von CreateGadgetList() noch nicht mitbekommen haben, weil sie vielleicht auch nur von Zeit zu Zeit ins Forum schauen...

Verfasst: 16.01.2009 18:31
von Andesdaf
> Ich persönlich arbeite parallel mit PB 4.20 und 4.30 (teilweise habe ich sogar noch einige in PB 3.94 programmierte größere Anwendungen in Produktion bei Kunden, die ich wahrscheinlich auch nicht mehr portieren werde)

Ja gut ist ja nicht ersichtlich...
Mir ist es auch egal wer wann was für einen veralteten Befehl nutzt, solange
der Code noch geht ist alles in Budda

Verfasst: 16.01.2009 18:50
von hjbremer
Alles sehr schön und affengeil, nur dann taucht wieder das alte Problem auf. :mrgreen:

es funktionieren die PB Farbbefehle außerhalb des Callbacks nicht mehr. :D und das kann sehr nervig sein.

Verfasst: 16.01.2009 19:56
von edel
Statt "If" sollte das dann aber besser "CompilerIf" heissen.

@hjbremer
Wo ist da das Problem? Malen mit API ist doch genauso einfach
wie mit PB. Zumal es aber auch dafuer Loesungen gibt.

Verfasst: 16.01.2009 21:05
von Shardik
edel hat geschrieben:Statt "If" sollte das dann aber besser "CompilerIf" heissen.
Danke für den Hinweis, edel. Ich hatte das CompilerIf zu Anfang drin, habe dann aber noch eine Änderung gemacht, das komplette Beispiel noch einmal überschrieben und dabei auch das CompilerIf überklatscht... :twisted:
Jetzt verstehe ich auch Andesdafs Bemerkung :lol:

Verfasst: 18.01.2009 14:11
von Andesdaf
Shardik hat geschrieben:Jetzt verstehe ich auch Andesdafs Bemerkung :lol:
Ja, meine Bemerkungen versteht man immer erst auf den zweiten Blick :wink: