[unlösbar]BM_SETIMAGE versagt, gesubbclasster button bleibt "leer"



  • Hey @ll,
    ich wollte nochmal verdeutlichen, dass es nicht mehr um mein anfängliches Problem geht...

    Hier mein Problem:
    Ich will mit SendMessage einem Button ein Bild verleihen...
    Ich habe 3 Phasen eingebaut an denen -falls != 0- GetLastError ausgegeben wird.

    LoadIcon:       No Failure
    BM_GETIMAGE:    No Failure
    BM_SETIMAGE:    No Failure
    

    Würde ich auch glauben WENN der Button ein Bild bekommen würde...

    LRESULT CALLBACK myBtn( HWND myWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
    	bool visit = false;
    	int x = 0,
    		y = 0,
    		err = 0;
    	HICON icon;
    	switch( msg )
    	{
    		case WM_RBUTTONUP:
    			if( !isEnd )
    			{
    				icon = (HANDLE)SendMessage( myWnd, BM_GETIMAGE, IMAGE_ICON, (WPARAM)NULL );	//Aktuelles Icon laden
    				err = GetLastError();
    				switch( err )
    				{
    					case 0:
    						printf( "BM_GETIMAGE:\tNo Failure\n" );
    					break;
    					default:
    						printf( "BM_GETIMAGE:\t%d\n", err );
    					break;
    				}
    
    				if( icon != flag )	//Wenn der button keine flagge hat
    				{
    					SendMessage( myWnd, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)(HICON)flag );
    					err = GetLastError();
    					switch( err )
    					{
    						case 0:
    							printf( "BM_SETIMAGE:\tNo Failure\n" );
    						break;
    						default:
    							printf( "BM_SETIMAGE:\t%d\n", err );
    						break;
    					}
    				}
    				else	//Wenn der button die Flage hat
    				{
    					printf( "enable\n" );
    					SendMessage( myWnd, BM_SETIMAGE, IMAGE_ICON, (WPARAM)NULL );//Flagge entfernen
    				}
    				visit = true;
    			}
    			else
    				restart();
    		break;
    	}
    	if( !visit )
    		return DefWindowProc( myWnd, msg, wParam, lParam );
    
    	return visit;
    }
    

    Es wird immer disable angezeigt, und die Failure-abfragen, nie enable..

    help 😞



  • dein Button-Child hat aber schon den BS_BITMAP oder BS_ICON style drin?



  • Ehm und mit deinem Visit ... du kennst aber schon default: (als Zweig von switch ...) ?

    Nimm wenn du den VC++ hast, statt immer GetLastError aufzurufen und auszuwerten, einfach @err im Watch-Window. Dann kannst du beim Step-by-Step debuggen auch immer den Wert kontrollieren.

    Beschreib mal bitte was wo passieren soll. So wie es aussieht machst du da viel murkss.



  • @(D)Evil: Ich programmiere in C... Mit Notepad++ (kein interner Compiler).
    @Fake oder echt: Ja;

    Ok ich habe schon oft gehört ich schreibe ... murks im Code, also überflüssige Teile die leichter gehen würden. Bin ja auch erst seid knapp 5 Monaten am C programmieren...

    Also was passieren soll:
    Wie man aus Minesweeper kenn gibt es Felder, die Miene/Zahl/nichts sind.
    Wenn sie nichts sind, werden alle umliegenden bis zu den nächsen Mienen aufgedeckt, wenn sie Zahlen sind, werden sie einfach aufgedeckt, wenn sie eine Miene sind, werden alle Mienen aufgedeckt.
    Damit man leichter Spielen kann, kann man Mienen mit einer fahne versehen, um zu kennzeichnen: Das ist eine Miene; ausserdem kann man dieses Feld dann nicht mehr klicken.

    Die von mir gepostete Prozedur soll diese Fahnenmöglichkeit (und einige andere) stellen.
    Ist die Fahne gesetzt, soll sie entfernt werden, wenn sie nicht gesetzt ist, soll sie gesetzt werden.

    Ich wollte dies durch den vergleich der durch GETIMAGE und LoadImage erhaltenen HICON-HANDLEs tun, was meiner meinung auch funktioniert, allerdings, wie gepostet, wird nie eine Fahne/ein Bild gesetzt...

    [eidt]

    flag = LoadImage( hInstance, "flag1.ico", IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE );
    


  • lippoliv schrieb:

    Ist die Fahne gesetzt, soll sie entfernt werden, wenn sie nicht gesetzt ist, soll sie gesetzt werden.

    Ich wollte dies durch den vergleich der durch GETIMAGE und LoadImage erhaltenen HICON-HANDLEs tun, was meiner meinung auch funktioniert, allerdings, wie gepostet, wird nie eine Fahne/ein Bild gesetzt...

    Ein allgemeiner Tipp: Benutze nicht dein UI, um den Zustand deines Spiels zu speichern.

    Ach ja: Es schreibt sich "Mine". Miene ist der Gesichtsausdruck.



  • @MFK: danke...
    UI? Was ist das?



  • lippoliv schrieb:

    UI? Was ist das?

    User Interface. Benutzerschnittstelle. Das, was der Benutzer von deinem Programm sieht.



  • GUI ist da glaube ich gängiger?!...
    naja ich könnts auch wieder in einer einfach verketteten Liste machen, aber ich wollt davon nich so ewig viele nutzen(aber eig ises erst eins...).



  • wollt ihr den gesamten Quellcode?
    Stell den ma hier on: http://nopaste.info/2d6ee453b2_nl.html

    Geht allerdings noch nicht alles, da ich jetzt diese Liste eingebaut habe (für geflaggt und nicht gefalggt...)...

    Hoffe ihr könnt zu den Buttons was sagen... MFG und Danke...

    [edit]
    Ziemlich komisch: ich habe mal ein einem anderen Projekt, wo ich keine subclass für die buttons habe, genau diesen code verwendet um Icons auf die Buttoons zu legen, und es funktionierte. 😮 Es liegt also an der subclass? Aber wofür ist dann DefWindowProc(...) eigentlich? Macht der nicht die Standardaktionen?



  • Immer noch aktuell... Weiß da wer nen Tipp?
    http://nopaste.info/bb0d4c8361.html



  • subclass -> CallWindowProc ()



  • Hey Danke... Jetzt funktionierts...


Log in to reply