Schriftart eines Buttons ändern

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Schriftart eines Buttons ändern

Beitragvon ph4nt0m » Sonntag 5. Februar 2006, 11:39

Hallo,
nachdem CDW mir vor kurzem so nett geholfen hat, meinen Assembler Programmen den Windows XP Stil zu verleihen :D, möchte ich nun die Schriftart eines Buttons ändern. So wie es jetzt aussieht, besteht die Beschriftung meines Buttons aus einer sehr fetten, schwarzen Systemschrift. Das sieht irgendwie ziemlich alt aus.
Wie kann ich das in die Schriftart ändern, die unter Windows XP alle normalen Buttons haben? (Ich glaube, die heißt Tahoma)
ph4nt0m
Benutzeravatar
ph4nt0m
Newbie
 
Beiträge: 6
Registriert: Freitag 3. Februar 2006, 17:29
Wohnort: NRW

Beitragvon CDW » Sonntag 5. Februar 2006, 17:53

wenn es "einfach" gehen soll:
meine RC Dateien sehen in etwa so aus:
Code: Alles auswählen
Einstellungen DIALOGEX 0, 0, 257, 75
STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW

CAPTION "Sucheinstellungen"

FONT 8, "MS Sans Serif"

BEGIN
    PUSHBUTTON      "Übernehmen",ID_EINSTELLUNGEN_OK,188,39,68,17,
                    BS_MULTILINE | BS_FLAT,WS_EX_DLGMODALFRAME

usw...


Also einfach Font und die gewünschte Größe angeben.
Wobei MSDN sagt:
Syntax
FONT pointsize, "typeface"

Parameters
pointsize
Specifies the size, in points, of the font.
typeface
Specifies the name of the typeface. This name must be identical to the name defined in the [FONTS] section of WIN.INI. This parameter must be enclosed in double quotes (").
Example
The following example demonstrates the use of the FONT statement:

FONT 12, "MS Shell Dlg"



Was noch geht: im Programm selber die Fonts erstellen (CreateFontIndirect) und anwenden (selectObject) wobei man dann für jede Kleinigkeit eine eigene Schrift verwenden kann - jedoch muss man hier imho selber die komplette Button-Zeichnung übernehmen, was meistens nur für Buttons recht stressig sein kann.

Wenn man was ausgefallenes machen möchte, ohne gleich einen DubleBuffer & GDI&Co (also schweres Geschütz) zu verwenden, kann man sich die Funktion "BmpButton" (bei MASM v8 dabei) anschauen - damit kann man Bilder als Buttons einbinden, was recht nett ausschauen kann - und es liegen auch Beispiele Bei, wie man sowas realisieren kann (im EXAMPLE Ordner)

Sollte es etwas "zu viel" und unverständlich gewesen sein, einfach nochmal anfragen ;)
CDW
Alter Hase
 
Beiträge: 62
Registriert: Donnerstag 2. Oktober 2003, 17:17

Beitragvon ph4nt0m » Sonntag 5. Februar 2006, 20:54

Wiederum vielen Dank für deine Hilfe! :wink:
Ich bin bei der Assembler Programmierung noch nicht sehr weit. Ich arbeite gerade die Tuts von Iczelion durch und wollte eben das Programm aus Kapitel 9 etwas schöner machen. Erst XP-Stil und jetzt eben die Buttons.
Leider scheint der Button nicht im RC File definiert zu sein, stattdessen nur das Menü:
Code: Alles auswählen
#define IDM_HELLO 1
#define IDM_CLEAR 2
#define IDM_GETTEXT 3
#define IDM_EXIT 4

FirstMenu MENU
{
 POPUP "&Test Controls"
        {
         MENUITEM "Say Hello",IDM_HELLO
         MENUITEM "Clear Edit Box",IDM_CLEAR
         MENUITEM "Get Text", IDM_GETTEXT
         MENUITEM SEPARATOR
         MENUITEM "E&xit",IDM_EXIT
        }
}

Der Button wird einfach im normalen Code erstellt:
Code: Alles auswählen
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
                        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                        75,70,140,25,hWnd,ButtonID,hInstance,NULL

Gibts da eine einfache Möglichkeit, die Fonts im Source zu ändern oder soll ich besser den Button irgendwie im Resourcefile definieren?
ph4nt0m
Benutzeravatar
ph4nt0m
Newbie
 
Beiträge: 6
Registriert: Freitag 3. Februar 2006, 17:29
Wohnort: NRW

Beitragvon CDW » Montag 6. Februar 2006, 01:01

naja, ich hab ja gesagt, da ist etwas mehr Arbeit ;)
zuerst erweitere die Includes zu:
Code: Alles auswählen
include \masm32\include\gdi32.inc
includelib \masm32\lib\gdi32.lib

und dann (unter dem Button)
Code: Alles auswählen
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
                        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                        75,70,140,25,hWnd,ButtonID,hInstance,NULL
      mov  hwndButton,eax


.data
  Font db "Verdana",0
.code

invoke CreateFont,12,6,0,0,FW_NORMAL,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_DONTCARE,addr Font
invoke SendMessage,hwndButton,WM_SETFONT,eax ,TRUE
   

um die Parameter anzupassen, schau Dir einfach die MSDN dazu an:
erstes ist Höhe, dann Breite usw.
CDW
Alter Hase
 
Beiträge: 62
Registriert: Donnerstag 2. Oktober 2003, 17:17

Beitragvon ph4nt0m » Montag 6. Februar 2006, 14:17

Danke :D
Hat wieder sofort geklappt. Ich möchte jetzt die mit CreateFont erstellte Schriftart auch für meine EditBox verwenden. Da aber SendMessage immer mit EAX aufgerufen wird, muss ich vor jedem SendMessage immer erst die CreateFont Funktion aufrufen, damit sich das Handle zu dieser Schrift in EAX befindet. Deshalb wollte ich den return Wert (also das Handle zu des Fonts) der CreateFont Funktion jetzt in einer Variablen speichern.
Wie lautet der Datentyp dafür?
ph4nt0m
Benutzeravatar
ph4nt0m
Newbie
 
Beiträge: 6
Registriert: Freitag 3. Februar 2006, 17:29
Wohnort: NRW

Beitragvon CDW » Montag 6. Februar 2006, 21:52

Das ist Assembly - hier gibts nur wenige Typen ;)
EAX==DWORD also passt auch der Handle in einen DWORD rein ;)
einfach
hFont dd 0
in der Datensection schreiben.
Allerdings solltest Du nachschlagen, ob man den Handle danach direkt wieder schließen kann und den auch sofort schließen (CloseHandle, hFont)
CDW
Alter Hase
 
Beiträge: 62
Registriert: Donnerstag 2. Oktober 2003, 17:17


Zurück zu Assembler

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron