这是我现在要开始工作的代码:
#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的ID连接到控件,因此我可以通过操作变量来控制它。
但是,现在我正面临这个错误:
error C2039: 'SubclassWindow': Is No Element Of 'WTL::CTrackBarCtrlT<ATL::CWindow>'
由于WTL缺少文档,因此我无法真正找到问题所在。我读了有关子类化的内容,但最后我没有看到除尝试之外的另一种方法。我也不认为CTrackBarCtrl是错误的,因为它似乎是滑块的WTL包装器。
有什么建议吗?
最佳答案
尝试改用“ DDX_CONTROL_HANDLE”。似乎此宏不需要“ SubclassWindow”方法。
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