Text zeichnen

13/02/2011 - 15:41 von Lothar Geyer | Report spam
Ich bin dabei, einige Controls, die ich mir aus dem Netz geholt habe, an
meine Bedürfnisse anzupassen. Dabei ist mir zusammen mit den Visual
Styles folgendes passiert.

Nach den üblichen Prüfungen (OS-Version, CommonControls Version und so)
wird Text mit der Routine DrawThemeText geschrieben. Funktioniert auch.
Mit dieser Routine kann ich aber keine Eigenschaften der Schrift àndern
(Farbe usw.). Ich habe das zwar nun anderweitig gelöst - aber das ist
nicht das Gelbe vom Ei.

Es gibt eine Routine DrawThemeTextEx. Bei dieser kann ich eine
zusàtzliche Datenstruktur (DTTOPTS) angeben, über die man verschiedene
Schrift-Eigenschaften setzen kann. Meine Deklaration lautet (kopiert aus
dem Netz):

Private Declare Function DrawThemeTextEx Lib "uxtheme.dll" _
(ByVal hTheme As Long, ByVal hdc As Long, ByVal iPartId As Long _
, ByVal iStateId As Long, ByVal pszText As String _
, ByVal iCharCount As Long, ByVal dwflags As Long _
, pRect As RECT, pOptions As DTTOPTS_Type) _
As Long

Der Aufruf dazu:

DTTOPTS.dwSize = Len(DTTOPTS)
If b_Accel Then
DrawThemeTextEx hTheme, hdc, BP_GROUPBOX, 1, StrConv(Caption,
vbUnicode), Len(Caption) _
, 0, rText, DTTOPTS

Formal kann ich keinen Fehler feststellen. Zur Laufzeit bekomme ich dann
aber die Fehlermeldung

DLL-Einsprungpunkt DrawThemeTextEx in uxtheme.dll nicht gefunden

Ich habe nichts gefunden, dass diese Routine erst unter Vista usw. zur
Verfügung stehen würde (ich teste jetzt unter XP).

Lothar Geyer
 

Lesen sie die antworten

#1 Thorsten Albers
13/02/2011 - 18:16 | Warnen spam
Lothar Geyer schrieb im Beitrag
...
Private Declare Function DrawThemeTextEx Lib "uxtheme.dll" _
(ByVal hTheme As Long, ByVal hdc As Long, ByVal iPartId As Long _
, ByVal iStateId As Long, ByVal pszText As String _
, ByVal iCharCount As Long, ByVal dwflags As Long _
, pRect As RECT, pOptions As DTTOPTS_Type) _
As Long

Der Aufruf dazu:

DTTOPTS.dwSize = Len(DTTOPTS)
If b_Accel Then
DrawThemeTextEx hTheme, hdc, BP_GROUPBOX, 1, StrConv(Caption,
vbUnicode), Len(Caption) _
, 0, rText, DTTOPTS

Formal kann ich keinen Fehler feststellen. Zur Laufzeit bekomme ich dann
aber die Fehlermeldung



Seit WinXP wird in der Regel bei jeder Windows API-Funktion zwischen ANSI-
und Unicode-Version unterschieden. Gibt es nicht jeweils eine eigene
Funktion für die jeweilige Zeichencodierung ('A' und 'W') sondern nur eine
einzige, kannst Du davon ausgehen, daß die Funktion nur Unicode
unterstützt. Das ist bei DrawThemeTextEx() auch der Fall ("in LPCWSTR
pszText").
"ByVal pszText As String"
muß also z.B.
"ByVal pszText As Long"
werden mit Übergabe a la "StrPtr(MyString$)".

DLL-Einsprungpunkt DrawThemeTextEx in uxtheme.dll nicht gefunden

Ich habe nichts gefunden, dass diese Routine erst unter Vista usw. zur
Verfügung stehen würde (ich teste jetzt unter XP).



In solchen Fàllen kannst Du doch einfach die Exporte der lokalen DLL mit
dem Dependency Walker prüfen. Für Version 6.0.2900.2180 der UXTHEME.DLL
unter WinXP wird dort >kein< Export "DrawThemeTextEx" aufgeführt. Und im
MSDN steht für die Funktion: "Minimum supported client: Windows Vista".

Thorsten Albers

gudea (a) gmx.de

Ähnliche fragen