尝试用DDX_control挂接控件时出错

Error when trying to hook up a control with DDX_CONTROL

本文关键字:控件 出错 control DDX      更新时间:2023-10-16

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

#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连接到Id为IDC_trackSlider的控件,因此我可以通过操纵变量来控制它。

然而,现在我面临这个错误:

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

由于WTL缺少文档,我真的不知道问题出在哪里。我读了一些关于子类化的文章,但最终我看不到除了我尝试的方法之外的其他方法。我也不认为CTrackBarCtrl是错误的,因为它似乎是滑块的WTL包装器。

有什么建议吗?

请尝试使用"DDX_CONTROL_HANDLE"。看起来这个宏不需要"子类窗口"方法。

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

请参阅本线程的最后一个答案和代码项目文章中的解释:

WTL 7.1中添加的一个新功能是DDX_CONTROL_HANDLE宏。在WTL 7.0中,如果您想将一个纯窗口接口类(如CWindow、CListViewCtrl等)与DDX挂钩,则不能使用DDX_CONTROL,因为DDX_CONTROL只能与CWindowImpl派生类一起使用。除了不同的基类要求外,DDX_CONTROL_HANDLE的工作原理与DDX_CONTROL相同。

MFC程序员的WTL,第四部分-对话框和控件