Meine Steuerelemente funktionieren nicht, wieso nicht?



  • hallo ich habe mir mal eine einfache anwendung geschreiben die ein fenster erstellt nun möchte ich mich langsam mal darum bemühen mich mir Steuerelementen vertraut zu machen. also hier er einmal mein quelltext:

    #include <windows.h>
    
    #include "MW_Trainer.h"
    #pragma hdrstop
    #pragma argsused
    
    HINSTANCE hInst;
    HWND hWnd;
    WNDCLASS wc;
    HDC hDC;
    MSG msg;
    
    HANDLE hProc;
    HWND mw;
    DWORD r, w;
    DWORD procID;
    
    unsigned int _mw_time = 0x100579C;
    int _b_time = 0;
    
    char name[] = "szMW_Trainer";
    
    void _CreateWin( char *title, int width, int height );
    void _KillWin();
    
    LRESULT CALLBACK WinProc( HWND, UINT, WPARAM, LPARAM );
    
    WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
                    int nCmdShow) {
    
        _CreateWin( "MineSweeper Trainer", 400, 300 );
    
        while( GetMessage( &msg, 0, 0, 0 ) ) {
    
            TranslateMessage( &msg);
            DispatchMessage( &msg );
        }
        _KillWin();
        return( msg.wParam);
    }
    
    void _CreateWin( char *title, int width, int height ) {
    
        wc.hInstance = hInst;
        wc.lpfnWndProc = WinProc;
        wc.lpszClassName = name;
        wc.lpszMenuName = 0;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
        wc.hCursor = LoadCursor( 0, IDC_ARROW );
        wc.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH );
        wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    
        if( !( RegisterClass( &wc ) ) ) {
    
            MessageBox( 0, " Couldn't register this Window by Windows.",
                        " Shutdown error", MB_OK | MB_ICONEXCLAMATION );
            return;
        }
    
        hWnd = CreateWindow( name, title,
                             WS_OVERLAPPED | WS_SYSMENU,
                             400, 300, width, height,
                             0,
                             0,
                             hWnd,
                             0 );
    
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    }
    
    void _KillWin() {
    
        if( hDC ) {
    
            ReleaseDC( hWnd, hDC );
        }
        hDC = 0;
    
        if( hWnd ) {
    
            DestroyWindow( hWnd );
        }
        hWnd = 0;
    
        if( hInst ) {
    
            UnregisterClass( name, hInst );
        }
        hInst = 0;
    }
    
    LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam,
                              LPARAM lParam ) {
    
        static HWND tfield_1;
        char buffer[128];
        switch( message ) {
    
            case WM_CREATE: {
    
                tfield_1 = CreateWindow( "listbox", 0, WS_CHILD | WS_VISIBLE,
    	                      10, 10, 200, 120, hWnd, (HMENU)ID_TFIELD_001, hInst,
                              0 ) ;
    
                CreateWindow( "button", "mein Button",
                              WS_CHILD | WS_VISIBLE | WS_BORDER,
    	                      10, 135, 100, 30, hWnd, (HMENU)ID_BUTTON_001, hInst,
                              0 );
    
                SendMessage( tfield_1, WM_SETTEXT, 0, (long)"Hallo hallo" );
    
                return 0;
            }
    
            case WM_SIZE: {
    
                return 0;
            }
    
            case WM_COMMAND: {
    
                switch( HIWORD( wParam ) ) {
    
                    case BN_CLICKED: {
    
                        switch( LOWORD( wParam ) ) {
    
                            case ID_BUTTON_001: {
    
                                MessageBox( 0, "klick", "klick", MB_OK );
                                break;
                            }
                        }
                    }
    
                    case ID_TFIELD_001: {
    
                        SendMessage( tfield_1, WM_GETTEXT, sizeof( buffer ),
                                     (long)buffer );
                        MessageBox( 0, buffer, "lol", MB_OK );
                        break;
                    }
                }
                return 0;
            }
    
            case WM_PAINT: {
    
                return 0;
            }
    
            case WM_DESTROY: {
    
                PostQuitMessage( 0 );
                return 0;
            }
        }
        return( DefWindowProc( hWnd, message, wParam, lParam ) );
    }
    

    die ID's sind in dem header. eigentlich muesste nun Text in der liste stehen und beim klicken des buttons ne MSGBOX aufgehen oder?... wieso funktioniert des net?



  • Bei deinem switch für HIWORD( wParam ) hast du einmal ein BN_CLICKED und einmal ein ID_TFIELD_001 - es kann natürlich nur eines davon richtig sein (welche das ist, findest du hier)

    Und bei einer listbox kannst du nicht einfach mit WM_SETTEXT und WM_GETTEXT arbeiten. Näheres findest du hier



  • sorry, aba ich weiss einfach net weiter wie ich es modifizieren muss damit es geht... hmmm??? koenntet ihr mir net mal an meinem code zeigen was geaendert werden muss?



  • Hier findest du ein Beispiel: http://msdn2.microsoft.com/en-us/library/ms671395.aspx#simple_listbox
    Wenn du keinen Dialog hast, sondern ein normales Fenster kommt der Code, der dort bei WM_INITDIALOG steht bei dir in den WM_CREATE-Zweig.



  • hm, also soweit funktioniert es das wenn ich mit
    SendMessage( ..., LB_ADDSTRING, ... ) was in die liste schreibe... doch wenn ich mein button klicke passiert nicht mit SendM. erst wenn ich das fenster bewege wird der text angezeigt.. hmmm auch InvalidateRect(); brachte nichts. also der auftrg wird an die lb gegeben nur wird erst angezeigt wenn ich das fenster bewege ooder mit der maus in die lb klicke. weitergehen sollte doch dann die msgbox aufgehen tut sie aber auch nicht also irgend was ist da noch nicht richtig:

    LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam,
                              LPARAM lParam ) {
    
        static HWND tfield_1;
        char buffer[128];
    
        switch( message ) {
    
            case WM_CREATE: {
    
                tfield_1 = CreateWindow( "listbox", 0, WS_CHILD | WS_VISIBLE,
    	                      10, 10, 200, 120, hWnd, (HMENU)ID_TFIELD_001, hInst,
                              0 ) ;
    
                CreateWindow( "button", "mein Button",
                              WS_CHILD | WS_VISIBLE | WS_BORDER | BS_PUSHBUTTON,
    	                      10, 135, 100, 30, hWnd, (HMENU)ID_BUTTON_001, hInst,
                              0 );
    
                SendMessage( tfield_1, LB_ADDSTRING, 0, (long) "Test Text hier.1" );
    
                return 0;
            }
    
            case WM_SIZE: {
    
                return 0;
            }
    
            case WM_COMMAND: {
    
                switch( LOWORD( wParam ) ) {
    
                    case ID_TFIELD_001: {
    
                        SendMessage( tfield_1, WM_GETTEXT, sizeof( buffer ),
                                     (long)buffer );
                        break;
                    }
    
                    case ID_BUTTON_001: {
    
                        switch( HIWORD( wParam ) ) {
    
                            case BN_CLICKED: {
    
                                SendMessage( tfield_1, LB_ADDSTRING, 0,
                                             (long)"Hallo hallo" );
                                break;
                            }
                        }
                    }
                }
    [...]
    

    woran liegts?



  • T0bi schrieb:

    wenn ich mein button klicke passiert nicht mit SendM. erst wenn ich das fenster bewege wird der text angezeigt.. hmmm auch InvalidateRect(); brachte nichts. also der auftrg wird an die lb gegeben nur wird erst angezeigt wenn ich das fenster bewege ooder mit der maus in die lb klicke.

    Also bei mir funktioniert dein Code (soweit du ihn gepostet hast) ohne Probleme.

    T0bi schrieb:

    weitergehen sollte doch dann die msgbox aufgehen tut sie aber auch nicht also irgend was ist da noch nicht richtig:

    SendMessage( tfield_1, WM_GETTEXT, sizeof( buffer ), (long)buffer );
    

    Durch SendMessage wird doch keine MessageBox erzeugt?!



  • jo sry hab bei mir noch MessabeBox( 0, "klick", "klick", MB_OK" ); stehen 🙂 aber wieso geht das bei dir so einwandfrei -.-... bei mir wird alles nur sicht bar wenn ich mein window verscheibe, hmm.... oder muss ich noch includen ?



  • alles klar ich habs... da muss kein InvalidateRect hin sondern nen UpdateWindow() 🙂 alles klar ^^ funktioniert so weit, denke aba mal das ich mich bald wieder melden werde, so lass ich den thread noch offen xD ~i'll be back~
    danke fuer alles erst einmal



  • Sagmal @T0bi, in welche Klasse gehst du eigentlich ?

    Kannst du eigentlich auch etwas selbstständig.... ?

    Ich frage nur, da ich deine Fragen immer sehr 'hilfsbedürftig' und unkonkret formuliert finde...


Anmelden zum Antworten