2

我正在尝试使用以下代码在对话框中对进度控件进行子类化:

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

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

progress.SetRange(0, 100);

SendMessage我在一个简单的 WTLSetRange()实现中遇到了访问冲突异常。我一直在上下搜索,我所能找到的只是这可能是“使用旧 ATL 组件的应用程序可能会与 DEP 发生冲突”中提到的一些“thunking”问题,这不应该真正适用于我,因为我使用的是最新的 ATL 和 WTL (Visual Studio 2010 和WTL 8.1)。即使我使用 WTL 8.0,我也会遇到同样的问题。

由于 HWND 有效,子类化完成。有任何想法吗?

4

2 回答 2

2

WTL::CProgressBarCtrl m_Progress; <~ 使用它来附加进度条,而不是 CContainedWindow。

于 2012-05-16T21:02:14.233 回答
2

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

你首先需要这个吗?要仅发送不需要子类化的消息,只需将 real 附加HWNDCProgressBarCtrl实例:

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

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

不,这不好。你钩住了窗口,但你没有提供你的 WindowProc。因此,问题。

于 2012-05-17T08:08:56.123 回答