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

11

21.08.2006, 17:16

Ich erstelle die Schrift doch einmal hiermit:

C-/C++-Quelltext

1
2
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);


Und weise sie dann allen vier Buttons zu:

C-/C++-Quelltext

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


Oder sehe ich das falsch?

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

12

21.08.2006, 17:24

jo... weil du das in der Callback machst... die wird bei JEDER neuen WindowsNachricht aufgerufen! Mach das in der Init oder Main oder setz ein flag oder so was... zB

C-/C++-Quelltext

1
2
3
4
5
6
7
if(!bFlag)
{
    //Font erstellen

    //...


    bFlag = true;
}
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

13

21.08.2006, 17:47

Okay habe das ganze jetzt verändert, aber wie übergebe ich meine Schrift dem normalen Text (grundsätzlich)? Habe für solche Probleme keine Ansätze :( .

Fonterstellung nun in der WinMain -> ist in der Callback nicht bekannt. Wie mache ich sie dort am besten bekannt (global taugt ja nichts).

DarkFitzi

Alter Hase

Beiträge: 608

Wohnort: Eisenberg, Thüringen

Beruf: Schüler, 10te Klasse

  • Private Nachricht senden

14

21.08.2006, 17:58

probiers doch in der WM_CREATE, wird afaik nur einmal gesendet
Ich würde die Welt gern verbessern, doch Gott gibt mir den Sourcecode nicht! :-(

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

15

21.08.2006, 17:59

Also auch auf die Gefahr hin, schläge einstecken zu müssen, könntest dus PROBEHALBER als globale Variable deklarieren... Wenns funkt, und sich der aufwand lohnt, dann schreib ein schönes OOP-Grundgerüst... dann brauchst die globale Var nicht mehr...
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

16

21.08.2006, 22:24

Okay, ich setze das GAnze in WM_CREATE. Aber dann kennt SelectObject() in WM_PAINT diese Schrift immer noch nicht. Wie gebe ich die nun dort bekannt? (Ist eingentlich ein grundsätzliches Problem, das ich aber noch nie richtig lösen konnte. Zeiger? :( ).

Und was wäre in diesem Fall ein angebrachtes OOP-Gerüst. Könnte mir jemand hierfür einen Ansatz liefern?

Anonymous

unregistriert

17

21.08.2006, 22:35

Ein angebrachtes OOP Gerüst könnte ich posten, aber ich glaube das würde jeden hier im Topic zur verzweiflung bringen :lol:

Nee Scherz bei Seite.

Wenn Du Dich schon was mit Recieverfunktionen und den Additional Data Pointer von CreateFile beschäftigt hast, kannst Du ein Interfacedesign anstreben, wo jede klasse von IElement (Oder IWindow) erbt mit diversen Funktionen und das dann tiefer verschachteln.

Darin musst Du dann später jedoch entscheiden wo du Additional Data benutzt und wo SubClassing um an die WndProc des jeweiligen Controls zu gelangen.

Überleg Dir erstmal auf Papier von was welches Control was erbt und zeichne ne Verschachtelung. Bei der Implementierung können wir Dir sicherlich haufenweise Infos geben. Es ist aber kein einfaches Thema ;)

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

18

21.08.2006, 22:39

Ich habe gerade leider (fast) nichts verstanden :( .

Und mein dringenderes Problem ist auch, wie ich hfont an SelectObject weitergebe (trotzdem schon mal danke nix da).

DarkFitzi

Alter Hase

Beiträge: 608

Wohnort: Eisenberg, Thüringen

Beruf: Schüler, 10te Klasse

  • Private Nachricht senden

19

21.08.2006, 23:23

probier doch mal hfont static in der Callbackmethode, aber auserhalb des switch zweiges zu deklarieren (da wo du auch static HWND hwndButton[4] deklariert hast), initialisieren tust dus halt in der WM_CREATE
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

20

21.08.2006, 23:31

Klappt nicht. Die Buttons werden dann mit der Statndard-Schrift beschrieben. Oder habe ich dich falsch verastancen? Hier der 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
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static RECT rect; 
    static int cxChar, cyChar;
    
    //Schrift erstellen

    static TCHAR fontname[] = TEXT ("ownfont");
    static HFONT hfont = CreateFont(22,10,0,0,700,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_MODERN,fontname);
    
    HDC hdc, hwndDC;
    PAINTSTRUCT ps;
    int i = 0;
    TCHAR t_frage_1[] = TEXT("Wie groß ist Europa?");
    BUTTON button[4];
    
    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:
        {       
            //Schrift zuweisen

            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[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);
}

Werbeanzeige