Window-Code aufteilen



  • Ich will sicherlich keinen ganzen Wrapper fuer die Win-Api schreiben, aber ich bin gerade dabei den Code grob in Klassen einzuteilen. Hierzu wollte ich mir eine Klasse schreiben, die sich um das erzeugen eines (bestimmten) Fensters kuemmert, in etwa so:

    // definition (header)
    class UserWnd
    {
    private:
    	UserWnd(void);	
    	LRESULT CALLBACK UserWndProc(HWND, UINT, WPARAM, LPARAM);
    public:
    	static UserWnd& instance(void); // returns singleton
    	void init(void); // initializes the window
    private:
    	HWND hwnd;
    	HWND hChild;
    };
    

    Tja, der erste Problem ist die Window-Prozedur: Wenn die Funktion eine statische Membermethode der Klasse UserWnd ist, kann ich sie nicht so einfach verwenden

    void UserWnd::init()
    {	
        WNDCLASS wndclass ;	
        wndclass.lpfnWndProc = &UserWnd::UserWndProc; // Compilerfehler
    //...
    

    der Compilerfehler lautet

    cannot convert from 'LRESULT (__stdcall UserWnd::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'
    

    Offensichtlich entspricht die Methode also nicht mehr dem Prototyp. Wenn ich stattdessen einfach eine Funktion im globalen Namespace benutze, kann ich innerhalb dieser natuerlich nicht auf die Membervariablen der Klasse zugreifen, was ja eigentlich der ganze Vorteil dieser Kapselung sein sollte..

    Geh ich da vielleicht einen grundliegend falschen Ansatz? Ich koennte den Code ja auch einfach auf mehrere Dateien aufteilen, ohne dabei Klassen zu verwenden.

    Nochmal, nur im sicher zu sein: Das ganze soll keine Window-Klasse werden die man benutzen koennte um beliebige Fenster zu erstellen, es soll ein ganz bestimmtes Fenster sein, dass einmal erzeugt wird. Ich will den Code nur irgendwie auslagern.



  • Dazu hatten wir schon Millionen Beträge 😡 . Warum guckt eigentlich keiner in die FAQ ? 👎



  • Oh ja, sorry!

    Noch eine ganz andere Frage, hoffentlich ist die nicht auch schon in den FAQs 😕
    Gibt es eine Moeglichkeit, Nachrichten an Steuerelemente (also Child-Fenster) innerhalb der WndProc des Parents "abzufangen" ? Ich hab bereits von mehrere Methoden gelesen bei der die ChildProc einfach ersetzt wird, aber gibt es eine Alternative ?

    Eigentlich brauch ich bloss eine Nachricht wenn in einem Editfield RETURN gedrueckt wird.



  • Chase schrieb:

    Ich hab bereits von mehrere Methoden gelesen bei der die ChildProc einfach ersetzt wird, aber gibt es eine Alternative ?

    Eigentlich brauch ich bloss eine Nachricht wenn in einem Editfield RETURN gedrueckt wird.

    Nein es gibt keine Alternative... . Außerdem kann man eigentlich nur bedingt von einem 'Ersetzen' sprechen, da man lediglich die Nachrichten-Handler ersetzt, auf die man selbst reagieren will, lies: die man modifizieren will.

    Hier gibts eine Anleitung ➡ Subclassing



  • Jo, so hab ichs bisher auch gehandhabt, es kam mir nur wie ein viel zu grosser Aufwand vor, nur um mal auf ein RETURN zu reagieren 🙂

    Und noch was 🙂 (sorry das das alles so durcheinander kommt)
    Ich habe ein statisches Textfeld, in das nur das Programm schreibt. Eigentlich hab ich erwartet, dass Windows das scrollen fuer mich uebernimmt wenn
    WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE gesetzt sind. Das klappt aber nicht so ganz. Ich hab bereits ein (schlechtes) Workaround gefunden, ich muss das Editfield bei jeder Veraenderung des Textes manuell scrollen

    SendMessage(hEdit,EM_SCROLL,SB_BOTTOM,TRUE); // scroll to bottom
    

    Das ist aber nicht so das Wahre, da die Message andauernd gesendet werden muss und das Textfeld bei jeder Gelegenheit hochscrollen "will". Ich vermute mal, dass es sowas wie eine Caretposition gibt, auf die automatisch gescrollt wird. Kann ich diese nicht irgendwie setzen? MSDN-Suche war erfolglos.





  • flenders schrieb:

    http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/editcontrols/editcontrolreference/editcontrolmessages/em_scrollcaret.asp ?!

    Die Message hab ich auch gefunden, aber irgendwie war das nicht was ich brauchte. Ueberhaupt versteh ich diesen Satz nicht:

    The EM_SCROLLCARET message scrolls the caret into view



  • Du musst eben vorher die Markierung bzw. das Caret entsprechend setzen (wie das geht siehst du bei dem Link zu deinem anderen Post) und dann sollter diese Nachricht dafür sorgen, dass der gewählte Bereich durch entsprechendes scrollen des Inhalts sichtbar wird...


Anmelden zum Antworten