Eine (warscheinlich) dumme frage



  • Der selbe Code, nur anders eingerückt:

    case WM_DRAWITEM:
    		{ 
    			LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT) lParam; 
    			switch (pdis->CtlID)
    			{ 
    			case IDC_BUTTON1:
    				{ 
    					HDC hDC = GetDC(hButton); 
    					HDC hComDC = CreateCompatibleDC(hDC); 
    					SelectObject(hComDC, hBitmap); 
    					BitBlt(hDC, 0, 0, bmpbut.bmWidth, bmpbut.bmHeight, hComDC, 0, 0, SRCCOPY); 
    					DeleteObject(hComDC); 
    					ReleaseDC(hButton, hDC);
    				} 
    				break; 
    
    			case IDC_BUTTON2:
    				{ 
    					HDC hDC = GetDC(hButton1); 
    					HDC hComDC = CreateCompatibleDC(hDC); 
    					SelectObject(hComDC, hBitmap1); 
    					BitBlt(hDC, 0, 0, bmpbut.bmWidth, bmpbut.bmHeight, hComDC, 0, 0, SRCCOPY); 
    					DeleteObject(hComDC); 
    					ReleaseDC(hButton1, hDC);
    				} 
    				break; 
    
    				if (pdis->itemState & ODS_SELECTED) 
    					InvertRect(pdis->hDC, &pdis->rcItem); // wenn Button gedrückt invertieren 
    			}
    		}
    

    Siehst du es jetzt?

    Was ich über Einrückungsstil/Klammerstil geschrieben habe hat schon seinen Grund.

    ps: Der Compiler müsste dir hier auch eine Warning geben. Irgendwas über "unreachable code". Warnings ignorieren ist auch keine gute Idee.



  • mmh ne hat auch nicht geholfen



  • Beschreib mal wie du meinst dass die Ausführung die Zeile if (pdis->itemState & ODS_SELECTED) erreichen soll.



  • Tja gute frage.

    Aber wenn ich nur einen button habe funktioniert ja alles. Warum nicht wenn ich 2 habe



  • Okay ich habe das Problem gelöst. Waren nur 2 kleine Wörter.

    break;
    // und
    break;
    


  • Nein, die break s sind da schon OK.

    Ich glaube dir fehlen einfach noch viel zu viele Grundlagen.

    Eine "korrekte" Lösung wäre:

    case WM_DRAWITEM:
            { 
                LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT) lParam; 
                bool invertIfSelected = false;
                switch (pdis->CtlID)
                { 
                case IDC_BUTTON1:
                    invertIfSelected = true;
                    { 
                        HDC hDC = GetDC(hButton); 
                        HDC hComDC = CreateCompatibleDC(hDC); 
                        SelectObject(hComDC, hBitmap); 
                        BitBlt(hDC, 0, 0, bmpbut.bmWidth, bmpbut.bmHeight, hComDC, 0, 0, SRCCOPY); 
                        DeleteObject(hComDC); 
                        ReleaseDC(hButton, hDC);
                    } 
                    break; 
    
                case IDC_BUTTON2:
                    invertIfSelected = true;
                    { 
                        HDC hDC = GetDC(hButton1); 
                        HDC hComDC = CreateCompatibleDC(hDC); 
                        SelectObject(hComDC, hBitmap1); 
                        BitBlt(hDC, 0, 0, bmpbut.bmWidth, bmpbut.bmHeight, hComDC, 0, 0, SRCCOPY); 
                        DeleteObject(hComDC); 
                        ReleaseDC(hButton1, hDC);
                    } 
                    break; 
                }
    
                if (invertIfSelected && (pdis->itemState & ODS_SELECTED))
                    InvertRect(pdis->hDC, &pdis->rcItem); // wenn Button gedrückt invertieren 
            }
    


  • Mmh nachdem ich aber die breaks; weggenommen habe, hat alles funktioniert



  • Ja, das ist mir schon klar.
    Trotzdem ist es Mist ohne die break s.

    Ist dir denn klar was ohne die break s passiert wenn das ganze mit pdis->CtlID == IDC_BUTTON1 ausgeführt wird?



  • ne warum?



  • Verstehst du überhaupt irgendwas davon was das Programm macht?



  • hustbaer schrieb:

    Verstehst du überhaupt irgendwas davon was das Programm macht?

    Die erste Frage war eigentlich schon Beweis genug, das dies nicht der Fall ist:

    https://www.c-plusplus.net/forum/331622-10

    Weitere Buttons waren als Kommentar schon vorgesehen ...


Anmelden zum Antworten