Anfänger! Benötige Hilfe sichtbar machen von Objekten



  • Hallo erstmal,

    ich bin in Sachen Windowsprogrammierung noch ein newbie. Ich habe folgende Frage. Ich habe ein Windowsprogramm geschrieben mit einen Button und einen Listenfeld. Das Listenfeld ich beim start unsichtbar. Bei betätigung des Button soll dann das Listenfeld wieder sichtbar sein. Wie realisiere ich das?
    Ich habe das Listenfeld "liste" genannt. Ich dachte das man es über list.visible=true; realisieren kann, aber der Compiler sagt mir immer das auf der linken Seite eine Zeiger sein muss.

    Kann mir jemand helfen?

    Danke im Vorraus!



  • Ehm. In WinAPI? Sicher?

    Das würde so gehen:

    case IDC_DEINBUTTON: // So frägst Du ja deinen Button auf ein Klick ab, das ganze in WM_COMMAND und wParam.
    {
        ShowWindow(GetDlgItem(hWindowHandle, IDC_DEINELISTE), SW_SHOW); // Würde die Liste erscheinen lassen.
        break;
    }
    

    Jau...



  • #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    HINSTANCE GlobInst;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         GlobInst = hInstance;
    
         static TCHAR szAppName[] = TEXT ("Serials") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
         if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
          hwnd = CreateWindow (szAppName,                 // Name der Fensterklasse
                      TEXT ("Seriennummern von Software und Spielen"),  // Fenstertitel
                      WS_OVERLAPPEDWINDOW,                // Fensterstil
                      CW_USEDEFAULT,                      // X-Position des Fensters
                      CW_USEDEFAULT,                      // Y-Position des Fensters
                      700,                      // Fensterbreite
                      500,                      // Fensterhöhe
                      NULL,                               // übergeordnetes Fenster
                      NULL,                               // Menü
                      hInstance,                          // Programm-Kopiezähler (Programm-ID)
                      NULL) ;                             // zusätzliche Parameter
    
         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 SoftwareButton, GameButton, Liste;
         static TCHAR AuswahlLabel[] = TEXT ("Software") ;
         int cxChar, cyChar;
    
         HDC         hdc ;
         PAINTSTRUCT ps ;
         RECT        rect ;
    
         cxChar = LOWORD(GetDialogBaseUnits());
         cyChar = HIWORD(GetDialogBaseUnits());
    
         switch (message)
         {
         case WM_CREATE:
              SoftwareButton = CreateWindow(TEXT("button"), TEXT("Software"), WS_CHILDWINDOW|WS_VISIBLE,
                                            40, 20, cxChar*20, cyChar*3, hwnd, (HMENU) 1, GlobInst,
                                            NULL);
    
              GameButton = CreateWindow(TEXT("button"), TEXT("Games"), WS_CHILDWINDOW|WS_VISIBLE,
                                       (cxChar*20)+100, 20, cxChar*20, cyChar*3, hwnd, (HMENU) 2,
                                        GlobInst, NULL);
    
              Liste = CreateWindow(TEXT("listbox"), NULL, WS_CHILD|LBS_STANDARD,
                                   40, 100, cxChar*20+GetSystemMetrics(SM_CXVSCROLL), cyChar*20, hwnd,
                                   (HMENU) 3, GlobInst, NULL);
                                    //Soll hier noch unsichtbar sein unvisible
              return 0;
         case WM_PAINT:                            
              hdc = BeginPaint (hwnd, &ps) ;
              TextOut(hdc, 2*(cxChar*20)+200, 20+cyChar, AuswahlLabel, lstrlen(AuswahlLabel));
    
              EndPaint (hwnd, &ps) ;
              return 0 ;
    
         case WM_COMMAND:
              if(LOWORD(wParam)== 1)
                 if(HIWORD(wParam)== BN_CLICKED)
                   { //Wie kann ich hier meine Liste Sichtbar machen?
                     //visible
                   };
              return 0;
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    

    Kann mir jetzt jemand erkläre mit welchen Syntax ich beim betätigen des Buttons sichtbar machen kann.

    Danke im vorraus



  • Stegi schrieb:

    Kann mir jetzt jemand erkläre mit welchen Syntax ich beim betätigen des Buttons sichtbar machen kann.

    ChrisK schrieb:

    case IDC_DEINBUTTON: // So frägst Du ja deinen Button auf ein Klick ab, das ganze in WM_COMMAND und wParam. 
    { 
        ShowWindow(GetDlgItem(hWindowHandle, IDC_DEINELISTE), SW_SHOW); // Würde die Liste erscheinen lassen. 
        break; 
    }
    


  • Schreib einfach statt

    case WM_COMMAND: 
              if(LOWORD(wParam)== 1) 
                 if(HIWORD(wParam)== BN_CLICKED) 
                   { //Wie kann ich hier meine Liste Sichtbar machen? 
                     //visible 
                   };
    
    case WM_COMMAND:
    {
    	switch(LOWORD(wParam))
    	{
    		case 2: // So frägst Du ja deinen Button auf ein Klick ab, das ganze in WM_COMMAND und wParam.  
    		{  
    			ShowWindow(GetDlgItem(hwnd, 3), SW_SHOW); // Würde die Liste erscheinen lassen.  
    			break;  
    		}
    		break;
    	}
    	break;
    }
    

    und vor allem lass das ";" nach if, case etc. weg.



  • Danke ChrisK. Jetzt hat es gefunkt!



  • Logo! Wieso auch nicht 🙂
    Aber ein Tipp: mit (HMENU)3 kannst Du Dir die Elemente nicht so gut "merken". Nachher hast du 2,3,4,5,6,7,8 usw. belegt, und weißt nicht, was nun was ist.
    Gehe am besten schnell in die resource.h wenn Du die hast und schreibe da einen neuen Eintrag z.B.:

    #define IDC_LISTE1 300

    und schreibe dann beim erstellen der Liste (HMENU)IDC_LISTE1 rein und so weiter! Ok?


Log in to reply