Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

1

20.08.2006, 22:58

Schriftart auf Buttons übertragen

Hi,

ich erstelle mir vier Buttons und möchte nun, dass in diese mit einer zuvor erstellen Schrift geschrieben wird. Der Text erscheint allerdings nur in der Standard-System-Schrift.

C-/C++-Quelltext

1
2
3
//Schrift erstellen

    TCHAR fontname[] = TEXT ("ownfont");
    HFONT hfont = CreateFont(22,10,0,0,700,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_MODERN,fontname);


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
hwndDC = GetDC(hwndButton[0]);
            SelectObject(hwndDC,hfont);
            for (i=0;i<4;i++)
                hwndButton[0] = CreateWindow (TEXT("Button"),
                            button[0].szText,
                            WS_CHILD| WS_VISIBLE | button[0].iStyle,
                            button[i].x,
                            button[i].y,
                            20 * cxChar,
                            7 * cyChar / 4,
                            hwnd,
                            (HMENU) i,
                            ((LPCREATESTRUCT) lParam)->hInstance,
                            NULL);


Warum klappt das nicht?

2

21.08.2006, 09:59

C-/C++-Quelltext

1
SendMessage (hwndButton[0], WM_SETFONT, (WPARAM)hfont, 0);


und vergiss dein

C-/C++-Quelltext

1
2
hwndDC = GetDC(hwndButton[0]);
            SelectObject(hwndDC,hfont);
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

3

21.08.2006, 12:50

Klappt leider trotzdem noch nicht :( .

4

21.08.2006, 12:54

dann wird dein Font nicht richtig erstellt.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

5

21.08.2006, 13:17

Doch wird es (ich nutze es nämlich schon für eine normale Textausgabe in dem gleichen Programm).

DarkFitzi

Alter Hase

Beiträge: 608

Wohnort: Eisenberg, Thüringen

Beruf: Schüler, 10te Klasse

  • Private Nachricht senden

6

21.08.2006, 15:03

C-/C++-Quelltext

1
SendMessage(hwndButton[0],WM_SETFONT,(WPARAM)hfont,MAKELPARAM(TRUE,0));
Ich würde die Welt gern verbessern, doch Gott gibt mir den Sourcecode nicht! :-(

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

7

21.08.2006, 16:30

Es klappt trotzdem nicht. Poste jetzt mal den ganzen Code. Vielleicht habe ich ja etwas falsch gemacht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <windows.h>

struct BUTTON
{
    TCHAR * szText;
    int     x, y;
};

typedef struct BUTTON button;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[]= TEXT("Euroquiz 0.2"); 
    HWND       hwnd;
    MSG        msg;
    WNDCLASS   wc;

    wc.style         =  CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   =  WndProc;
    wc.cbClsExtra    =  0;
    wc.cbWndExtra    =  0;
    wc.hInstance     =  hInstance;
    wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
    wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
    wc.hbrBackground =  NULL;
    wc.lpszClassName =  szAppName;
    wc.lpszMenuName  =  NULL;

    if(!RegisterClass(&wc))
    {
        MessageBox(NULL,TEXT("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,
                       TEXT("Euroquiz 0.2"),
                       WS_OVERLAPPEDWINDOW & ~(WS_SIZEBOX) & ~(WS_MAXIMIZEBOX),
                       300,                     /* X-Position auf dem Monitor */
                       200,                     /* Y-Position auf dem Monitor */
                       400,                     /* Fensterbreite              */
                       290,                     /* Fensterhoehe               */
                       NULL,
                       NULL,
                       hInstance,
                       NULL);
    
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndButton[4];
    static RECT rect; 
    static int cxChar, cyChar;
    HDC hdc, hwndDC;
    PAINTSTRUCT ps;
    int i;
    TCHAR t_frage_1[] = TEXT("Wie groß ist Europa?");
    BUTTON button[4];
    
    //Schrift erstellen

    TCHAR fontname[] = TEXT ("ownfont");
    HFONT hfont = CreateFont(22,10,0,0,700,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_MODERN,fontname);

    button[0].szText = TEXT(" 7.345.000 km²");
    button[1].szText = TEXT("10.532.000 km²");
    button[2].szText = TEXT("22.489.000 km²");
    button[3].szText = TEXT("31.157.000 km²");

    switch(message)
    {
    case WM_CREATE:
        {       
            for(i=0;i<4;i++)
            {
                SendMessage(hwndButton[i],WM_SETFONT,(WPARAM)hfont,MAKELPARAM(TRUE,0));
            }
            cxChar = LOWORD (GetDialogBaseUnits());
            cyChar = HIWORD (GetDialogBaseUnits());

            button[0].x = cxChar * 3;
            button[1].x = cxChar * 3 + 165;
            button[2].x = cxChar * 3;
            button[3].x = cxChar * 3 + 165;
    
            button[0].y = cyChar * 7;
            button[1].y = cyChar * 7;
            button[2].y = cyChar * 7 + 35;
            button[3].y = cyChar * 7 + 35; 

            
            for (i=0;i<4;i++)
                hwndButton[0] = CreateWindow (TEXT("Button"),
                            button[i].szText,
                            BS_PUSHBUTTON | WS_CHILD| WS_VISIBLE |BS_MULTILINE | BS_TEXT,
                            button[i].x,
                            button[i].y,
                            20 * cxChar,
                            7 * cyChar / 4,
                            hwnd,
                            (HMENU) i,
                            ((LPCREATESTRUCT) lParam)->hInstance,
                            NULL);
            return 0;
        }

    case WM_PAINT:
        {
            InvalidateRect(hwnd, &rect, TRUE);      
            
            //Begin des Zeichenvorgangs

            hdc =BeginPaint (hwnd, &ps);

            //Hintergrund zeichnen

            HBITMAP hBackground = (HBITMAP)LoadImage(NULL, "euroquiz_bk_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
            HDC hDCBackground   = CreateCompatibleDC(0);
            SelectObject(hDCBackground, hBackground);
            RECT rc;
            GetClientRect(hwnd, &rc); 
            HDC hDChWnd = GetDC(hwnd);
            BitBlt(hDChWnd,0,0,rc.right,rc.bottom,hDCBackground,0,0,SRCCOPY);
            ReleaseDC(hwnd, hDChWnd);

            //Textrechteck festlegen

            GetClientRect(hwnd,&rect);
            rect.top = 45;
    
            //Schrift einsetzen

            SelectObject(hdc, hfont); 

            //Text ausgeben

            SetBkMode(hdc,TRANSPARENT);
            DrawText(hdc,t_frage_1,strlen(t_frage_1),&rect,DT_CENTER);

            //Ende des Zeichenvorgangs

            EndPaint(hwnd, &ps);
            return 0;
        }
    
    case WM_COMMAND:
        
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

8

21.08.2006, 16:45

Du erstellst ja bei jeder nachricht die du bekommst eine neue Font... ich glaub nicht, dass das gut geht...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

9

21.08.2006, 16:58

Perfekt, danke. Jetzt wird die Font genutz.

Aber: Jetzt flackert mein letztes Button immer und nach ein, zwei Sekunden nimmt es wieder die System-Standard-Schrift an?!?

Mein neuer Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <windows.h>

struct BUTTON
{
    TCHAR * szText;
    int     x, y;
};

typedef struct BUTTON button;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[]= TEXT("Euroquiz 0.2"); 
    HWND       hwnd;
    MSG        msg;
    WNDCLASS   wc;

    wc.style         =  CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   =  WndProc;
    wc.cbClsExtra    =  0;
    wc.cbWndExtra    =  0;
    wc.hInstance     =  hInstance;
    wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
    wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
    wc.hbrBackground =  NULL;
    wc.lpszClassName =  szAppName;
    wc.lpszMenuName  =  NULL;

    if(!RegisterClass(&wc))
    {
        MessageBox(NULL,TEXT("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,
                       TEXT("Euroquiz 0.2"),
                       WS_OVERLAPPEDWINDOW & ~(WS_SIZEBOX) & ~(WS_MAXIMIZEBOX),
                       300,                     /* X-Position auf dem Monitor */
                       200,                     /* Y-Position auf dem Monitor */
                       400,                     /* Fensterbreite              */
                       290,                     /* Fensterhoehe               */
                       NULL,
                       NULL,
                       hInstance,
                       NULL);
    
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndButton[4];
    static RECT rect; 
    static int cxChar, cyChar;
    HDC hdc, hwndDC;
    PAINTSTRUCT ps;
    int i;
    TCHAR t_frage_1[] = TEXT("Wie groß ist Europa?");
    BUTTON button[4];
    
    //Schrift erstellen

    TCHAR fontname[] = TEXT ("ownfont");
    HFONT hfont = CreateFont(22,10,0,0,700,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_MODERN,fontname);

    for(i=0;i<4;i++)
            {
                SendMessage(hwndButton[i],WM_SETFONT,(WPARAM)hfont,MAKELPARAM(TRUE,0));
            }

    i=0;

    button[0].szText = TEXT(" 7.345.000 km²");
    button[1].szText = TEXT("10.532.000 km²");
    button[2].szText = TEXT("22.489.000 km²");
    button[3].szText = TEXT("31.157.000 km²");

    switch(message)
    {
    case WM_CREATE:
        {       
            cxChar = LOWORD (GetDialogBaseUnits());
            cyChar = HIWORD (GetDialogBaseUnits());

            button[0].x = cxChar * 3;
            button[1].x = cxChar * 3 + 165;
            button[2].x = cxChar * 3;
            button[3].x = cxChar * 3 + 165;
    
            button[0].y = cyChar * 7;
            button[1].y = cyChar * 7;
            button[2].y = cyChar * 7 + 35;
            button[3].y = cyChar * 7 + 35; 

            
            for (i=0;i<4;i++)
            {
                hwndButton[i] = CreateWindow (TEXT("Button"),
                            button[i].szText,
                            BS_PUSHBUTTON | WS_CHILD| WS_VISIBLE |BS_MULTILINE | BS_TEXT,
                            button[i].x,
                            button[i].y,
                            20 * cxChar,
                            7 * cyChar / 4,
                            hwnd,
                            (HMENU) i,
                            ((LPCREATESTRUCT) lParam)->hInstance,
                            NULL);
            }
            i = 0;
            return 0;
            
        }

    case WM_PAINT:
        {
            InvalidateRect(hwnd, &rect, TRUE);      
            
            //Begin des Zeichenvorgangs

            hdc =BeginPaint (hwnd, &ps);

            //Hintergrund zeichnen

            HBITMAP hBackground = (HBITMAP)LoadImage(NULL, "euroquiz_bk_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
            HDC hDCBackground   = CreateCompatibleDC(0);
            SelectObject(hDCBackground, hBackground);
            RECT rc;
            GetClientRect(hwnd, &rc); 
            HDC hDChWnd = GetDC(hwnd);
            BitBlt(hDChWnd,0,0,rc.right,rc.bottom,hDCBackground,0,0,SRCCOPY);
            ReleaseDC(hwnd, hDChWnd);

            //Textrechteck festlegen

            GetClientRect(hwnd,&rect);
            rect.top = 45;
    
            //Schrift einsetzen

            SelectObject(hdc, hfont); 

            //Text ausgeben

            SetBkMode(hdc,TRANSPARENT);
            DrawText(hdc,t_frage_1,strlen(t_frage_1),&rect,DT_CENTER);

            //Ende des Zeichenvorgangs

            EndPaint(hwnd, &ps);
            return 0;
        }

    case WM_DESTROY:
        DeleteObject(hfont);
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}


Außerdem glaube ich, dass ich noch nicht alles freigegeben habe (Objecte und DC's). Habe schon an einigen Stellen versucht sie freizugeben, gab aber immer Laufzeitfehler :( .

Anonymous

unregistriert

10

21.08.2006, 17:11

Zitat von »"Black-Panther"«

Du erstellst ja bei jeder nachricht die du bekommst eine neue Font... ich glaub nicht, dass das gut geht...


@ spacegeier: Ist immer noch der Fall.

Werbeanzeige