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

1

10.07.2007, 17:05

Radiobutton, Checkbox checken??

hi,

also ich bin grade am Üben von WinApi, und habe schon jetzt ein paar Probleme
mit meinem ersten WinApi Programm:

Hier mein Source
http://nopaste.de/p/aTYfO4DHh

Also i-wie checkt er nicht ob AUTORADIOBUTTON und AUTOCHECKBOX ausgewählt wurde-.-

Und ich weiß nicht mehr weiter...

Kann mir da einer weiter helfen ??

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

10.07.2007, 17:19

z.B. irgendwelche Steuerlemente mit CreateWindow erstellen.

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
...

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch ( uMsg )
    {
    case WM_CREATE:
        {
            HWND btn_chkbox = CreateWindow( _T( "BUTTON" ), _T( "click me" ), WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, 100, 100, 150, 70, hWnd, 0, 0, 0 );
            SendMessage( btn_chkbox, WM_SETFONT, ( WPARAM )GetStockObject( DEFAULT_GUI_FONT ), TRUE );
            SetWindowLong( btn_chkbox, GWL_ID, ID_BUTTON1 );
        }
        break;

...

    default:
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }

    return 0;
}
@D13_Dreinig

3

10.07.2007, 18:28

Also ich habe das jetzt nach deinem ersten Beispiel gemacht, weil bei dem zweiten steige ich i-wie nicht durch:

http://nopaste.de/p/aYttyjstW

Aber das klappt auch nicht...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

10.07.2007, 18:32

Ich seh nix von BM_GETCHECK. Du hast übrigens viele Denkfehler drin. Erstmal:

C-/C++-Quelltext

1
2
3
4
5
6
case ID_CHECKBOX:
            if ( HIWORD( wParam ) == BN_CLICKED )
            {
                iWort = SendMessage( ( HWND )lParam, BM_GETCHECK, 0, 0 );
            }
            break;


Dann passt das iWort wenigstens. Aber: iWort wird bei jedem WM_COMMAND erstmal auf 0 gesetzt, d.h. beim Klick auf Ok ist iWort immer 0 und deine Nachricht wird somit verfälscht.
@D13_Dreinig

5

10.07.2007, 19:48

JUHUU danke für den Tipp mit iWort, darauf wäre ich wirklich niee gekommen, DANKEE alta ich will ein Kind von dir XD, nein scherz .

Also das erklärt auch warum mein Compiler gestreickt hat als ich iWort direkt 0 zuweisen wollte.

Ich habe das zwar nicht ganz genauso wie du gesagt hast gemacht, sondern etwas anders.

Habe dort gesehen das BM_GETCHECK den Wert BST_CHECKED zurückgibt und habe es dann dementsprechend etwas anders gemacht:
http://nopaste.de/p/agTZ1IDvr

Jetzt habe ich noch eine Frage:
Ist das die besste Lösung um so eine Anwendung zu schreiben? Also sind da evtl ein paar "Speed-Stopper" dabei ? Hätte ich einige Stellen besser machen können ?

Ach und wenn ich schon dabei bin Fragen zu schreiben, habe ich noch ein paar (Ich lerne ja schließlich noch).

Was bedeutet:
1. ( HWND )lParam
2. LOWORD( wParam )
3. HIWORD(wParam)

Ich meine großgeschriebene Wörter sind in WinApi doch meistens typedefs, aber was sollen dann diese wParams in Klammern danach ??
Oder das HWND vor lParam ??

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

10.07.2007, 19:57

C-/C++-Quelltext

1
2
3
( HWND )lParam // castet lParam zu HWND

LOWORD( wParam ) // extrahiert das tiefere WORD vom DWORD

HIWORD( wParam ) // extrahiert das höhere WORD vom DWORD


LOWORD und HIWORD sind Macros der WinAPI. Equivalente Funktionen wären folgende:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
inline unsigned short hiword( unsigned long value )
{
    return ( value >> 16 ) & 0xffff;
}

inline unsigned short loword( unsigned long value )
{
    return value & 0xffff;
}
@D13_Dreinig

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

7

10.07.2007, 23:26

so ists richtig:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
inline unsigned short LOWORD(unsigned long value)
{
    return static_cast<unsigned short>(value & 0x00ff);
}

inline unsigned short HIWORD(unsigned long value)
{
    return static_cast<unsigned short>(value & 0xff00);
}
"Don't trust your eyes: They are a hell of a lot smarter than you are"

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

8

10.07.2007, 23:43

Nee... es geht ja um die ersten 16 bit ;)

Ich musste auch 2* hinschaun, aber bei Davids hiword wird per Bitshift erstmal Bit 17-32 auf Platz 1-16 verschoben ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

11.07.2007, 07:41

Zitat von »"ChrisJ"«

so ists richtig:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
inline unsigned short LOWORD(unsigned long value)
{
    return static_cast<unsigned short>(value & 0x00ff);
}

inline unsigned short HIWORD(unsigned long value)
{
    return static_cast<unsigned short>(value & 0xff00);
}


Naja, viel falscher gehts kaum noch! ;) Ne... Aber falsch ist es dennoch. Zum einen soll, wie grek40 schon bemerkte, WORD Typen (16 bit) extrahiert werden zum anderen maskierst du extremst falsch.
@D13_Dreinig

10

11.07.2007, 11:46

Gut dann habe ich noch ne Frage:

ich habe ja einmal in der WinMain das um das Fenster anzeigen zu lassen:

C-/C++-Quelltext

1
2
3
        // Fenster aqnzeigen lassen

         ShowWindow(hWnd, iCmdShow);
         UpdateWindow(hWnd);


Aba in der Callback- Funktion habe ich ja auch noch das:

C-/C++-Quelltext

1
2
3
     case WM_CREATE:
            // Das Fenster wurde erstellt.

                break;


Und das kann ich auch problemlos auskommentieren.

I-wie finde ich das aber nicht so sinnvoll, was bringt mir den überhaupt dieses WM_CREATE ?? Also ich weiß das das auch i-was mit dem anzeigen des Fensters zu tun hat, nur was ??

Werbeanzeige