Koordinaten eines Bitmap in der Anwendung suchen



  • Genau das hab ich ganz vergessen. Das Problem bei dieser OwnerDraw-Technik is, das ich die Buttons nicht per Resource-Editor anordnen kann.

    Mann muss ja die Position immer "per Hand" angeben.
    Mein Layout enthält aber so viele Elemente das es immer sehr lang dauert etwas üer Koordinaten zu plazieren.

    Daher greife ich gerne auf den Resource-Editor von VS zurück.
    Dort hab ich mir nen leeren Dialog erstellt auf dem ich bequem und schnell meine Element anordnen kann ohne tausend mal die Position nachbessern zu müssen.

    Ausserdem kann es ja nicht so schwer sein die Koordinaten eines Controls bzw.
    die eines Bitmaps zu bekommen.

    Allerdings muss ich auch zugeben das ich gestern zwei Stunden in google gesucht habe. Leider wurde ich nicht fündig. 😞

    Naja, sicher is nur mal das sowas auch mit Bitmaps geht. Und das wäre der von mir bevorzugte Lösungsweg.



  • OHPen schrieb:

    Genau das hab ich ganz vergessen. Das Problem bei dieser OwnerDraw-Technik is, das ich die Buttons nicht per Resource-Editor anordnen kann.

    doch kannst du. 😉
    hole dir den handle GetDlgItem(..) mach den btn ownerdraw SetWindowLong(..) und los gehts

    OHPen schrieb:

    Ausserdem kann es ja nicht so schwer sein die Koordinaten eines Controls bzw.
    die eines Bitmaps zu bekommen.
    Allerdings muss ich auch zugeben das ich gestern zwei Stunden in google gesucht habe. Leider wurde ich nicht fündig. 😞

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/GetWindowRect.asp



  • Okay, sorry für meine falsche Behauptung, aber ich dachte nicht das das geht.

    Was den Link angeht danke, der schaut vielversprechend aus.
    Nur wie gekomm ich nun aus dem Bitmap ein Rectange Object ?

    THX



  • Ähm vergesst den letzten Post, ich sollte genauer lesen.
    Hat sich erledigt, danke 😃



  • OHPen schrieb:

    Ähm vergesst den letzten Post, ich sollte genauer lesen.
    Hat sich erledigt, danke 😃

    schon gemacht 😃



  • So, ich schon wieder...

    LPRECT rb;
    

    und dann

    GetWindowRect(GetDlgItem(hwnd,IDB_BUTTON_NEW),rb);
    

    funktioniert auch schön problemlos. Und wenn ich euch richtig verstanden habe
    dann habe ich nun die Koordinaten und die Größe in diesem LPRECT namens rb.

    Das is alles schön und gut, aber WIE KRIEG ICH DIE DA RAUS in einzelne Variablen ? 🙂

    Ich weiß ich stell dumme Fragen auch nur so lernt man.
    Ich habs versucht mit

    rb.
    

    aber dieses Struct schein keine Attribute zu haben.

    Kann einer weiterhelfen ?



  • Langsam muss ich mich über mich selbst ärgern. 😡

    rb->
    

    und dann gehts auch.

    Bis bald.



  • wenn du dir die fragen selber beantwortest warum bin dann ich hier 🤡



  • OHPen ich hoffe du hast auch Speicher geholt.

    Ansonsten hast du einen Wild-Pointer.

    Tipp: RECT auf dem Stack anlegen.



  • Also Speicher hab ich keinen geholt ...

    Bei mir sieht das im Moment so aus:

    else if(Message==WM_MOUSEMOVE){		
    		GetCursorPos(&p);
    		ScreenToClient(hwnd,&p);
    		GetWindowRect(GetDlgItem(hwnd,IDB_BUTTON_NEW),rb);
    		if ((p.x > rb->left && p.x < rb->right) &&
    			(p.y > rb->top && p.y > rb->bottom)){
    				MessageBox(NULL,NULL,NULL,NULL);
    			}
    	}
    

    rb ist wie gesagt ein globles Struct:

    // Positon of the Window
    POINT p;
    // RectangeStruct of the Bitmap
    LPRECT rb;
    

    genau wie auch meine Mausposition p.

    Ich krieg nun aber ne unhandle exception.
    Hat jemand nen Verbesserungsvorschlag ?

    PS: so wies aussieht gekommt er keine Werte in rb. Dort stürzt er nämlich ab wenn ich versuche die Werte in der IF anweisung auszulesen...

    SO STOP

    Ich habs nun so gemacht:

    else if(Message==WM_MOUSEMOVE){		
    		GetCursorPos(&p);
    		ScreenToClient(hwnd,&p);
    		GetWindowRect(GetDlgItem(hwnd,IDB_BUTTON_NEW),&rb);
    		if ((p.x > rb.left && p.x < rb.right) &&
    			(p.y > rb.top && p.y > rb.bottom)){
    				MessageBox(NULL,NULL,NULL,NULL);
    			}
    	}
    

    jetzt verwende ich statt LPRECT für rb RECT.
    Das Programm stürzt nun nicht mehr ab, das is ja schonmal was.
    Allerdings seh ich keine MessageBox wenn ich auf mein Button fahre.
    Naja wahrscheinlich noch ein Fehler in der Abfrage.

    Scheint kein Fehler in der Abfrage zu sein. Ich hab grad festgestellt das ich nachdem ich mir die Koordinaten per:

    GetWindowRect(GetDlgItem(hwnd,IDB_BUTTON_NEW),&rb);
    

    hole, dort in allen Attributen 0 drin steht. Mach ich noch was falsch bei ???



  • LPRECT ist nur ein Zeiger auf ein RECT.



  • OK, aber dann müsste es doch nun gehn oder, da ich nun RECT verwende und dieses
    Struct als Pointer übergebe...



  • wie schon gesagt benutz lieber RECT.

    LPRECT rb
    GetWindowRect(GetDlgItem(hwnd,IDB_BUTTON_NEW),&rb)
    

    kann nicht gehen den du übergibts eine adresse von einem nicht akkolierten pointer. ich glaub kaum das getwindowrect(..) den speicher für dich dann bereit stellt.

    so wäre es richtig

    RECT rb
    GetWindowRect(GetDlgItem(hwnd,IDB_BUTTON_NEW),&rb)
    

    OHPen schrieb:

    GetWindowRect(GetDlgItem(hwnd,IDB_BUTTON_NEW),&rb);
    

    hole, dort in allen Attributen 0 drin steht. Mach ich noch was falsch bei ???

    rückgabewert von getwindowrect(..)
    liefert getdlgitem(..) ein gültiges handle ?


Anmelden zum Antworten