Ошибка при попытке подключить элемент управления с помощью 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);
};

Как видите, это в основном базовая инициализация с картой сообщений и т. д. Однако теперь я хочу подключить свой CTrackBarCtrl к DDX_MAP.

Важная часть заключается в следующем:

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

Что здесь должно произойти, так это то, что m_trackSlider подключен к элементу управления с идентификатором IDC_TRACKSLIDER, поэтому я могу управлять им, манипулируя переменной.

Однако прямо сейчас я сталкиваюсь с этой ошибкой:

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

Из-за отсутствия документации WTL я не могу понять, в чем проблема. Я читал о подклассах, но, в конце концов, я не вижу другого способа сделать это, кроме того, как я пытаюсь. Я также не думаю, что CTrackBarCtrl неверен, так как это, похоже, оболочка WTL для ползунков.

Любой совет?


person Sossenbinder    schedule 30.12.2015    source источник


Ответы (1)


Попробуйте вместо этого использовать "DDX_CONTROL_HANDLE". Похоже, что этому макросу не нужен метод "SubclassWindow".

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

См. последний ответ этой темы и объяснение из статьи codeproject:

Новая функция, добавленная в WTL 7.1, — это макрос DDX_CONTROL_HANDLE. В WTL 7.0, если вы хотели связать простой класс оконного интерфейса (такой как CWindow, CListViewCtrl и т. д.) с DDX, вы не могли использовать DDX_CONTROL, потому что DDX_CONTROL работает только с классами, производными от CWindowImpl. За исключением требования другого базового класса, DDX_CONTROL_HANDLE работает так же, как DDX_CONTROL.

WTL для программистов MFC, Часть IV. Диалоги и элементы управления

person CppChris    schedule 30.12.2015