[changeTopic]...



  • free/delete(wofür auch immer delete ist): Im grunde schon, allerdings kann das wohl irgendwie fehler verursachen, und es dauert eine weile bis windows den Speciehr wieder frei gibt. Das Fenster ist doch im Grunde wie eine Variable, das System macht nach Programmende ncihts mehr damit oder wie?(Ich suche eine erklärung, nicht lediglich "Jaja shcon klar*ironie*"...)

    LoadImage kann (wie bei mir aktuell) gut gehen, und SendMessage Fehlschlagen...

    An mich: Wieso vergesse ich immer GetLastError... 😡

    Danke dir, ich werde da mal nachschauen...

    €dit: "0"(successfull) ist die ausgabe von GetLastError, ein Icon wird nicht angezeigt:

    flag = LoadImage( NULL, "flag.ico", IMAGE_ICON, buttonX, buttonY, LR_DEFAULTCOLOR | LR_LOADFROMFILE );
    [...]
    case WM_RBUTTONUP:
    	if( !isEnd )
    	{
    		icon = (HANDLE)SendMessage( myWnd, BM_GETIMAGE, IMAGE_ICON, (WPARAM)NULL );
    		if( icon != flag)
    		{
    			if( NULL == (HANDLE)SendMessage( myWnd, BM_SETIMAGE, IMAGE_ICON, (WPARAM)flag ) )
    				printf( "%d; fialure ", GetLastError() );
    			printf( "disable\n" );
    		}
    		else
    		{
    			printf( "enable\n" );
    			SendMessage( myWnd, BM_SETIMAGE, IMAGE_ICON, (WPARAM)NULL );
    		}
    		visit = true;
    	}
    break;
    

    if( clickedButtonIsMine ) -> isEnd = true;
    HANDLE icon;
    glob. HANDLE flag;


  • Mod

    lippoliv schrieb:

    @Martin: Ich erwarte das sich die "STAY_ON_TOP" verhältnisse (oder wie auch immer die heißen) sich nicht verändern, nur weil ich etwas subclasse, oder ist das zuviel erwartet?

    Stay on top gilt nicht für CHild Windows. (Wieder etwas was man durch Lesen erfahren kan!)



  • Naja, aber irgendwie schon, denn bevor ich sie subgeclasst habe, waren sie ja quasi STAY_ON_TOP (in meinem Fenster) und WM_PAINT hat alles dahinter gelegt.

    Allerdings funktioniert das mit dem Bild auf dem Button noch nicht, da werd ich noch mal schauen, da die Operation nach GetLastError ja funktioniert hat.
    Aber zu diesem Thema werde ich -hoffentlich- in diesem Forum vieles finden / einen neuen Thread aufmachen.


  • Mod

    lippoliv schrieb:

    Naja, aber irgendwie schon, denn bevor ich sie subgeclasst habe, waren sie ja quasi STAY_ON_TOP (in meinem Fenster) und WM_PAINT hat alles dahinter gelegt.

    Allerdings funktioniert das mit dem Bild auf dem Button noch nicht, da werd ich noch mal schauen, da die Operation nach GetLastError ja funktioniert hat.
    Aber zu diesem Thema werde ich -hoffentlich- in diesem Forum vieles finden / einen neuen Thread aufmachen.

    Quatsch. Das hat nur etwas mit der Z-Order zu tun und ob die Child-Fenster gegeneinander geclipt werden.



  • Ja irgendwie so halt, es ging ums mal so auszudrücken.

    Folgendes:

    flag = LoadImage( NULL, "flag.ico", IMAGE_ICON, buttonX, buttonY, LR_DEFAULTCOLOR | LR_LOADFROMFILE );
    printf( "%d :: error", GetLastError() );
    

    Da kriege ich die Ausgabe:

    6 :: error
    

    😮

    ERROR_INVALID_HANDLE        The handle is invalid.
    6
    0x6
    

    Aberauch

    flag = LoadImage( NULL, "C:\\CProgs\\flag.ico", IMAGE_ICON, buttonX, buttonY, LR_DEFAULTCOLOR | LR_LOADFROMFILE );
    printf( "%d :: error", GetLastError() );
    

    funktioniert nicht. Was soll ich da jetzt machen? *needHelp*

    MFG und danke für alle Posts..



  • war doch nicht falsch 🙂

    hinst
    Handle to an instance of the module that contains the image to be loaded. To load an OEM image, set this parameter to zero.

    Da du kein OEM Image laden willst musst du hinst angeben. MSDN ist dein Freund und helfer du solltest dir angewöhnen dort zu lesen, eigentlich steht dort alles drinn 🙂

    schirrmie



  • Sry, war ein veralteter Code:

    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    //code#
    flag = LoadImage( hInstance, "flag.ico", IMAGE_ICON, buttonX, buttonY, LR_DEFAULTCOLOR | LR_LOADFROMFILE );
    printf( "%d :: error\n", GetLastError() );
    

    Hatte mir sowas schon gedacht, und habe flag jetzt auch als HICON, allerdings ist immer noch der selbe Fehler vorhanden. 😞



  • Lösung:

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

    ^^ auf ins nächste Problem...

    icon = (HANDLE)SendMessage( myWnd, BM_GETIMAGE, IMAGE_ICON, (WPARAM)NULL );
    if( icon != flag)
    {
    	if( NULL == (HANDLE)SendMessage( myWnd, BM_SETIMAGE, (LPARAM)IMAGE_ICON, (WPARAM)flag ) )
    		printf( "%d; fialure ", GetLastError() );
    	printf( "disable\n" );
    }
    

    Ich kriege da immer "failure"... Also geht es immer schief...

    Ich bin auf der Suche, falls euch was auffällt...

    Was ich machen will:
    ich will die Handles von flage und icon (das handle zu dem aktuellen bild) vergleichen, daran will ich feststellen ob ein Button schoon die Falge als bild hat... oder kannich das anders feststellen?


  • Mod

    RTFM (Read the Fine MSDN)

    BM_SETIMAGE Doku:

    The return value is a handle to the image previously associated with the button, if any; otherwise, it is NULL.

    NULL heißt doch nur: Da war nichts zuvor!



  • RTFM = Read the fucking manual... so kenne ich das 🙄

    Ich lese auf dieser (http://msdn2.microsoft.com/en-us/library/bb775987(VS.85).aspx) seite schon ewig und suche den fehler.... Tja genauer lesen währe die Lösung.

    Danke dir, allerdings bekommmt der Button kein Bild!?



  • Hat der Button denn das Style fürs Bild?, Muss der Button neu gezeichnet werden?

    schirrmie



  • Neuzeichnen kann sein BS_ICON ist vorhanden...

    [edit]InvalidateRect bringt nichts


  • Mod

    Hat der Button von Anfang an den Stil BS_ICON?



  • Bei CreateWindow... ja... steht aber nicht an erster stelle!?



  • Hmm weis zwar nicht ob es daran liegt aber versuch mal diese Typumwandlung

    SendMessage(hButton,  BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)(HANDLE) hIcon);
    

    schirrmie



  • Leider nein... Danke trotzdem, währ ja anhaltspunkt...

    Hatte allerdings WPARAM und LPARAM vertauscht (casten)... Aber auch das funktioniert nicht..



  • LRESULT CALLBACK myBtn( HWND myWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
    	bool visit = false;
    	int x = 0,
    		y = 0;
    	HICON icon;
    	switch( msg )
    	{
    		case WM_LBUTTONUP:
    			//code
    		break;
    		case WM_RBUTTONUP:
    			if( !isEnd )
    			{
    				icon = (HANDLE)SendMessage( myWnd, BM_GETIMAGE, IMAGE_ICON, (WPARAM)NULL );	//Aktuelles Icon laden
    				if( icon != flag )	//Wenn der button keine flagge hat
    				{
    					SendMessage( myWnd, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)(HANDLE)flag );
    
    					printf( "disable\n" );
    				}
    				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;
    }
    

    Der HANDLE cast in zeile 18 kann auch HICON sein, oder ganz weg, nix geht...

    help?? 😞

    PS: die sind von mir gesubbclasst...


Anmelden zum Antworten