WTL和CContainedWindow导致访问冲突

时间:2012-05-16 20:50:49

标签: c++ atl wtl

我正在尝试使用以下代码在对话框中继承进度控件:

ATL::CContainedWindowT<WTL::CProgressBarCtrl> progress;
// ...
progress.SubclassWindow(GetDlgItem(IDC_PROGRESS));

一切都很好。现在,如果我尝试这样做:

progress.SetRange(0, 100);

我在一个简单的WTL SendMessage实现中的SetRange()上获得了访问冲突异常。我一直在寻找,我所能找到的就是这可能是Applications Using Older ATL Components May Experience Conflicts With DEP中提到的一些“thunking”问题,它不应该真正适用于我,因为我使用的是最新的ATL和WTL(Visual Studio 2010和WTL 8.1)。即使我使用WTL 8.0,我也会遇到同样的问题。

由于HWND有效,子类化已完成。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

WTL :: CProgressBarCtrl m_Progress; &lt;〜用它来附加进度条,而不是CContainedWindow。

答案 1 :(得分:2)

如果您子类化窗口,那么您应该为此子类控件实现消息映射。这包括将构件变量连接到构造函数中的消息映射,并将ALT_MSG_MAP添加到类消息映射中。你在做这个吗?我想你没有。

你首先需要这个吗?要仅发送不需要子类化的消息,您只需要将真实HWND附加到CProgressBarCtrl实例:

WTL::CProgressBarCtrl m_ProgressBar;
// ...
m_ProgressBar = GetDlgItem(IDC_PROGRESS);
m_ProgressBar.SetRange(...
  

由于HWND有效,子类化已经完成

不,不行。你挂钩了窗口,但你没有提供你的WindowProc。因此,问题。