2015-12-30 1 views
0

C'est le code que je suis en train de se rendre au travail en ce moment:Erreur lorsque vous essayez de brancher un contrôle avec DDX_CONTROL

#pragma once 
#include "stdafx.h" 
#include "resource.h" 

class MusicPlayerDialog : public CDialogImpl<MusicPlayerDialog>, public CWinDataExchange<MusicPlayerDialog> 
{ 
public: 

    MusicPlayerDialog(); 
    ~MusicPlayerDialog(); 

    enum { IDD = IDD_MAINDIALOG }; 

    BEGIN_MSG_MAP_EX(MusicPlayerDialog) 
     MESSAGE_HANDLER(WM_CLOSE, OnClose) 
     MESSAGE_HANDLER(WM_DESTROY, OnDestroy) 
     MESSAGE_HANDLER(WM_INITDIALOG, OnInit) 

     COMMAND_ID_HANDLER_EX(IDC_CLOSE, OnExitButtonClick) 
    END_MSG_MAP() 

    BEGIN_DDX_MAP(MusicPlayerDialog) 
     DDX_CONTROL(IDC_TRACKSLIDER, m_trackSlider) 
    END_DDX_MAP() 

    LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnInit(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 


private: 

    CTrackBarCtrl m_trackSlider; 

    void OnExitButtonClick(UINT uCode, int nCtrlID, HWND hwndCtrl); 
}; 

Comme vous pouvez le voir, il est Initializing la plupart du temps de base, avec une carte de message, etc. Cependant, je veux maintenant connecter mon CTrackBarCtrl avec un DDX_MAP.

L'important est ceci:

BEGIN_DDX_MAP(MusicPlayerDialog) 
     DDX_CONTROL(IDC_TRACKSLIDER, m_trackSlider) 
    END_DDX_MAP() 

Que faut-il ici est que m_trackSlider est relié à la commande avec l'identifiant de IDC_TRACKSLIDER, donc je peux le contrôler en manipulant la variable.

Cependant, en ce moment je suis confronté à cette erreur:

error C2039: 'SubclassWindow': Is No Element Of 'WTL::CTrackBarCtrlT<ATL::CWindow>' 

En raison de l'absence de documents WTLS je ne peux pas vraiment savoir quel est le problème serait. J'ai lu sur le sous-classement, mais à la fin, je ne vois pas vraiment une autre façon de le faire que la façon dont j'essaie de le faire. Je ne pense pas non plus que CTrackBarCtrl est faux, car il semble être le wrapper WTL pour les curseurs.

Un conseil?

Répondre

1

Essayez plutôt d'utiliser "DDX_CONTROL_HANDLE". On dirait que cette macro n'a pas besoin de la méthode "SubclassWindow".

BEGIN_DDX_MAP(MusicPlayerDialog) 
    DDX_CONTROL_HANDLE(IDC_TRACKSLIDER, m_trackSlider) 
END_DDX_MAP() 

Voir ce fil de last answer et l'explication d'un article CodeProject:

A new feature that was added in WTL 7.1 is the DDX_CONTROL_HANDLE macro. In WTL 7.0, if you wanted to hook up a plain window interface class (such as CWindow, CListViewCtrl, etc.) with DDX, you couldn't use DDX_CONTROL because DDX_CONTROL only works with CWindowImpl-derived classes. With the exception of the different base class requirement, DDX_CONTROL_HANDLE works the same as DDX_CONTROL.

WTL for MFC Programmers, Part IV - Dialogs and Controls