[solved] Slider sendet keine Nachrichten.



  • Hallo.

    Ich wieder mit meinem bescheuerten AX-Teil, langsam verlier' ich echt den Nerv. Ich möchte per WIN32 einen Slider erzeugen, der in einem ActiveX-Control eingebettet ist. die Klassendefinition des Teils sieht so aus, ich kopier' der Einfachheit halber nur die Basisklassenliste:

    [ coclass,
      uuid(984B6A6B-1E70-4D00-B1AE-88D99EE139D7),
      helpstring("RTSClient Attrib class"),
      default("IRTSClientObj"),
      implements_category("CATID_Control"),
      registration_script("control.rgs"),
      progid("RTSClient.RTSClientAttrib.1"),
      vi_progid("RTSClient.RTSClientAttrib")
    ]
    class CRTSClientObj :
    	public CComControl<CRTSClientObj>,
    	public IRTSClientObj,
    	public IPersistStreamInitImpl<CRTSClientObj>,
    	public IPersistStorageImpl<CRTSClientObj>,
    	public IOleControlImpl<CRTSClientObj>,
    	public IOleObjectImpl<CRTSClientObj>,
    	public IOleInPlaceActiveObjectImpl<CRTSClientObj>,
    	public IOleInPlaceObjectWindowlessImpl<CRTSClientObj>,
    	public IViewObjectExImpl<CRTSClientObj>,
    	public IObjectSafetyImpl<CRTSClientObj, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
    

    In OnCreate erzeuge ich den Slider:

    HWND hwndTrack = CreateWindowEx( 
            0,                             // no extended styles 
            TRACKBAR_CLASS,                // class name 
            _T( "Trackbar Control" ),            // title (caption) 
            WS_CHILD | WS_VISIBLE | 
    		TBS_HORZ | TBS_ENABLESELRANGE,  // style 
            10, 10,                        // position 
            200, 40,                       // size 
    		this->m_hWnd,                       // parent window 
            NULL,             // control identifier 
            NULL,                       // instance 
            NULL                           // no WM_CREATE parameter 
            );
    

    Das Problem, mit dem ich mich jetzt konfrontiert sehe, und für das ich keine Lösung finde ist folgendes: Ich hab keinen Schimmer, welches HWND ich dem slider übergeben soll. Ich bin mir nicht sicher, ob in meinem Fall this->m_hWnd stimmt. (Dubioserweise stammt m_hWnd allem Anschein nach (laut Intellisense) von der Klasse ATL::CWindow, die ich in der kompletten Klassenhierarchie meiner CRTSClientObj-Klasse nicht entdecken kann. WTH? Wo kommt das her?)

    Wenn ich also auf den Slider (der immerhin schonmal sichbar ist, also für den Anfang nicht schlecht...) jetzt reagieren möchte, dann sollte ich in meiner ProcessWindowMessage-Methode (fragt mich bloß nicht, aus welcher Basisklasse das wieder stammt) doch auf das WM_COMMAND prüfen, oder nicht? Hier die Methode, aus den MSG_MAP-Makros per Hand zusammengebaut, da sich die etwas schwer debuggen lassen... Laut Petzold sollte das doch funktionieren:

    BOOL CRTSClientObj::ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, 
    	LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID)
    {
    	BOOL bHandled = TRUE;
    	switch( dwMsgMapID )
    	{
    	case 0:
    
    		// [....]
    
    		if(uMsg == WM_COMMAND)
    		{
    			bHandled = TRUE;
    			lResult = OnCommand(uMsg, wParam, lParam, bHandled);
    			if(bHandled)
    				return TRUE;
    		}
    	default:
    		ATLTRACE(ATL::atlTraceWindowing, 0, _T("Invalid message map ID (%i)\n"), dwMsgMapID);
    		ATLASSERT(FALSE);
    		break;
    	}
    	return FALSE;
    }
    

    In den if-Block komm' ich nie rein. Sendet der Slider seine Nachrichten an das falsche Fenster oder was ist da los?

    Bitte um Hilfe, ich bin hier echt langsam am Verzweifeln!

    <edit>
    Achja: Mir ist gerade aufgefallen, dass this->m_hWnd in den meisten Fällen ohnehin ungültig zu sein scheint. unused == 0x00000000 bzw. unused == ??? -> Error: expression cannot be evaluated. Manchmal steht aber trotzdem ein scheinbar sinnvoller Wert drinnen, je nach Wetterlage.
    </edit>



  • Heureka. WM_HSCROLL, nicht WM_COMMAND.

    Wo gibts denn für solche Angelegenheiten 'ne vernünftige Referenz? Bitte nicht MSDN sagen, ich mein 'ne Referenz, mit der man nicht nur dann was anfangen kann, wenn man eh schon weiß wie alles zusammenspielt. Wenn man jede Kleinigkeit googeln und sich durch den Dickicht an Ergebnissen kämpfen muss, wird ma echt alt... Ich wär echt sehr dankbar für Tipps.


Anmelden zum Antworten