[changeTopic]...



  • wie sieht denn dein subclass aus?



  • regStandardWnd( hInstance, "myButton", (WNDPROC)myBtn, (HBRUSH)COLOR_BTNFACE )<<aufruf
    [...]
    bool regStandardWnd( HINSTANCE hInst, char *name, WNDPROC procedure, HBRUSH color )<<standardfunktion
    /*
    	This function registers a standard Window
    */
    {
    	WNDCLASSEX wndMain;
    
    	wndMain.cbSize = sizeof(WNDCLASSEX);
    	wndMain.style = CS_HREDRAW | CS_VREDRAW;
    
    	wndMain.lpfnWndProc = procedure;						//if there is an incomming message
    
    	wndMain.cbClsExtra = 0;									//extra memory for the class
    	wndMain.cbWndExtra = 0;									//extra memory for the window
    
    	wndMain.hInstance = hInst;								//handle from that instance, wich the window belong to
    
    	wndMain.hIcon = LoadIcon( NULL, IDI_APPLICATION );		//Program icon (set to std)
    	wndMain.hCursor = LoadCursor( NULL, IDC_ARROW );		//the cursor, wich schould been used in this program
    
    	wndMain.hbrBackground = color;		//background of the window
    
    	wndMain.lpszMenuName = NULL;							//there is no menue
    
    	wndMain.lpszClassName = name;							//application name
    
    	wndMain.hIconSm = LoadIcon( NULL, IDI_APPLICATION );	//smal Icon( eventually the tray-icon )
    
    	return RegisterClassEx( &wndMain );						//register the class, return the 
    }
    [...]
    LRESULT CALLBACK myBtn( HWND myWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
    	bool visit = false;
    	int x = 0,
    		y = 0;
    	HANDLE icon;
    	switch( msg )
    	{
    		case WM_LBUTTONUP:
    			[...]
    		break;
    		case WM_RBUTTONUP:
    			[...]
    		break;
    	}
    	if( !visit )
    		return DefWindowProc( myWnd, msg, wParam, lParam );
    
    	return visit;
    }
    

    Meintest du dass?
    Wenn nicht einfach genauer werden, dann poste ich alles... Ahso:

    for( y = 0; y < Yaxe; y++ )		//create all Buttons
    {
    	for( x = 0; x < Xaxe; x++ )
    	{
    		mines[y][x] = CreateWindow( "BUTTON", "", WS_CHILD | WS_VISIBLE | WS_DLGFRAME, aktXPos, aktYPos, buttonX, buttonY, myWnd, (HMENU)bmMine, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
    		SetWindowLong( mines[y][x], GWL_WNDPROC, (LONG)myBtn );
    		aktXPos += buttonX;					//generate the position of the new button
    	}
    	aktYPos += buttonY;
    	aktXPos = 0;
    }
    

    HWND mines[Yaxe][Xaxe] //2D - Array of HWND
    Hoffe die Variablen sprechen für sich...



  • Hmm deine neue wndproc sieht komisch aus! Und du speicherst dir nicht die alte wndproc adresse und schreibst sie beim Beenden nicht wieder zurück!

    Hier das war das tut von win-api.de guck dir das an und probier das.

    #include <windows.h>
    static LONG_PTR PrevWndProcEdit;
    
    // Hauptnachrichtenschleife
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       static HWND hwndEditAlt;
    
       switch (message)
       {
       case WM_CREATE:
    // Editfeld erzeugen
          hwndEditAlt = CreateWindow("EDIT","",WS_VISIBLE|WS_CHILD|WS_BORDER,20,20,100,30,
                               hwnd,0,((LPCREATESTRUCT)lParam)->hInstance,0);
    // Den ursprünglichen WND-PROC Pointer sichern und durch den eigenen ersetzen.
          PrevWndProcEdit = SetWindowLongPtr (hwndEditAlt, GWLP_WNDPROC, 
                                    (LONG_PTR) EditWndProc);
          return 0;
    
       case WM_DESTROY:
    // Den ursprünglichen Pointer wieder einsetzen
          SetWindowLongPtr (hwndEditAlt, GWLP_WNDPROC, PrevWndProcEdit);
          PostQuitMessage (0);
          return 0;
       }
    
    return DefWindowProc (hwnd, message, wParam, lParam);
    }
    
    // Die neue WND-PROC für das Editfeld
    LRESULT CALLBACK EditWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       switch (message)
       {
          case WM_CHAR:
             MessageBox (NULL, "Taste!", "Tasteneingabe im Editfeld", NULL);
    // stünde hier ein "return 0;" würde keine Taste im Editfeld erscheinen!
             break;  
       }
    
    return CallWindowProc ((WNDPROC) PrevWndProcEdit, hwnd, message, wParam, lParam);
    }
    


  • DANKE MARTIN... JEA...

    Muss man die wieder umschreiben? Warum, das Window wird ja eh zerstört...

    PS: es klappt jetzt übrigens... Jetzt noch dedr SET_IMAGE SenMessage fehler weg und man kann spielen.. Ich meld mich bestimmt wieder 😞



  • lippoliv schrieb:

    Muss man die wieder umschreiben? Warum, das Window wird ja eh zerstört...

    Jaja schon klar und ein free/delete brauch man in einem Programm ja auch nicht, das Programm wird ja eh irgendwann wieder geschlossen, ne 🙄



  • Achso und wegen dem hier

    Eine neue Frage:

    icon = LoadImage( NULL, "./flag.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE );
    if( 0 == SendMessage( myWnd, BM_SETIMAGE, IMAGE_ICON, (WPARAM)icon ) )
        printf( "nio\n" );
    

    Warum prüfst du erst bei SendMesage und nicht schon bei LoadImage, falls es an LoadImage liegt dann guck dir GetLastError an!

    schirrmie



  • 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!?


Anmelden zum Antworten