尝试使用DDX_CONTROL挂接控件时出错

时间:2015-12-30 11:18:02

标签: c++ atl wtl

这是我正在尝试开始工作的代码:

#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);
};

正如你所看到的,它主要是基本的初始化,带有消息映射等。但是,我现在想要用DDX_MAP连接我的CTrackBarCtrl。

重要的是这个:

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

这里应该发生的是m_trackSlider通过IDC_TRACKSLIDER的Id连接到控件,所以我可以通过操作变量来控制它。

但是,现在我正面临这个错误:

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

由于WTL缺少文档,我无法确定问题是什么。我读到了子类化,但最后我还没有看到另一种方法,而不是我想要的方式。我也不认为CTrackBarCtrl是错误的,因为它似乎是滑块的WTL包装器。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

尝试使用&#34; DDX_CONTROL_HANDLE&#34;代替。好像这个宏不需要&#34; SubclassWindow&#34;方法

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

请参阅此主题的last answer以及代码项目文章中的解释:

  

WTL 7.1中添加的新功能是DDX_CONTROL_HANDLE宏。在WTL 7.0中,如果要使用DDX连接普通窗口接口类(例如CWindow,CListViewCtrl等),则无法使用DDX_CONTROL,因为DDX_CONTROL仅适用于CWindowImpl派生类。除了不同的基类要求外,DDX_CONTROL_HANDLE的工作方式与DDX_CONTROL相同。

WTL for MFC Programmers, Part IV - Dialogs and Controls