问题标签 [wtl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Visual Studio 2008 c++ 条件模板继承错误?
我正在将 C++/ WTL项目从 Visual Studio 2005 移植到 VS 2008。项目配置之一是单元测试构建,它定义了预处理器符号 UNIT_TEST。
为了让我的 WTL 类进入我的测试工具,我创建了一个CFakeWindow
存根所有 CWindow 方法的类。然后在我的 stdafx.h 文件中,我在 atlwin.h(它定义了 CWindow 类)的导入下方执行此操作:
我的窗口类看起来像这样:
这在 VS 2005 中效果很好。问题是在 VS 2008 中,来自原始 CWindow 类的方法被调用,而不是 CFakeWindow 类。这当然会导致测试失败,CWindow
因为ATLASSERT(::IsWindow(m_hWnd))
.
当我在调试器中单步执行代码时,我看到 CAboutDialog 类继承自CDialogImpl<CAboutDialog, CFakeWindow>
. 然而,当我在CAboutDialog
(例如EndDialog(code)
)上调用一个方法时,该CWindow
方法被调用了。
这是 VS 2008 中的错误,还是我的条件模板继承技术是 VS 2005 允许但 VS 2008“修复”的可憎?是否有解决方法,或者我是否需要考虑一种不同的技术来对 WTL 类进行单元测试?我真的很喜欢这种技术,因为它让我可以将 WTL 类放入测试工具中,而无需与 WTL 库打交道。
编辑:正如下面对 Conal 的响应中所述,预处理器输出显示我的类是从 CFakeWindow 继承的:
如上所述,当我在调试器中单步执行代码时,CAboutDialog 在本地窗口中显示为继承自 CFakeWindow。
编辑 2:根据 Conal 的建议,我逐步完成了反汇编,代码应该调用 CFakeWindow 方法,但实际调用的是 CWindow 方法。
我开始更倾向于 VC++ 2008 调试器中的错误。
user-interface - 为什么我的所有者绘制的组合框显示为空?
我正在继承 WTL 组合框,并且我正在绘制组合框的项目的所有者。该控件具有属性CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWVARIABLE
,我使用混合类 COwnerDraw 来实现 DrawItem() 和 MeasureItem()。当下拉列表关闭时,项目被正确绘制。但是,当下拉列表打开时,组合框控件为空并且不绘制项目。我究竟做错了什么?
WTL 类如下所示:
该类用于对话框,并像这样子类化:
将控件属性更改为CBS_OWNERDRAWFIXED
不会更改任何内容。
编辑:感谢 najmeddine 的帮助,我发现我必须处理 WM_PAINT 才能绘制实际的组合框,而不仅仅是下拉列表中的项目。不幸的是,现在我还必须自己绘制组合框控件。有没有办法让 GDI 绘制边框和下拉箭头,这样我只需要绘制控件的“内部”?
visual-c++ - 如何将 Windows 7 功能区添加到 WTL 应用程序
有没有人尝试在 WTL 应用程序中使用本机 Windows 7 功能区控件?
我的意思是背后的控制:
或 MFC 的示例。(我不谈论 MFC 功能包中的功能区!)
--- 斯文
message-queue - 使用 WTL 正确处理自定义消息
我编写了一个多线程 WTL 实用程序来对内部服务进行压力测试。
Comms 线程向主线程发出他们已经退出的信号,因此主线程可以删除它们对应的对象。
他们发出这样的信号:
我的问题是如何处理我定义的自定义消息。
我想使用消息映射中的条目来调用处理程序,例如:
但是,永远不会调用 OnThreadQuit。
我可以处理它的唯一方法是在 PreTranslateMessage 中显式调用处理程序:
我确定这不是正确的方法...
我很想知道正确的方法-有人可以帮忙吗!?
c++ - 默认 WM_DESTROY 没有正确清理子窗口
我有一个用于 Windows Mobile 5 的 WTL 8.0 SDI 应用程序。在下面这个人为的示例中,我创建一个视图,销毁它,然后重新创建它。但是,当它在 WM_INITDIALOG 处理程序中重新创建断言时,因为控件的 HWND 无效而失败。
我注意到我可以通过在 CMyView 中处理 WM_DESTROY 并手动销毁每个子控件来解决此问题。但是,我认为我不应该这样做。MSDN 甚至说:
此消息首先发送到正在销毁的窗口,然后在子窗口(如果有)被销毁时发送到它们。
有人知道发生了什么吗?
编辑:如果我在 CMyView 中处理WM_NCDESTROY,所有子控件句柄仍然有效!( some_control_.IsWindow()==TRUE
) 这不是它应该的样子......
谢谢,保罗
c++ - ComboBoxEx32 (CComboBoxEx) 键盘行为
我有一个 WTL 应用程序,它使用带有样式的扩展组合框控件(Win32 类ComboBoxEx32
) 。CBS_DROPDOWNLIST
它工作得很好(我可以对框中的每个项目都有图像)但键盘行为与普通组合框不同 - 按下一个键不会跳转到组合中以该字母开头的第一个项目。
例如,如果我将字符串“Arnold”、“Bob”和“Charlie”添加到组合中,然后选择组合并按“B”,则不会选择“Bob”。
有谁知道如何使这项工作?目前我能想到的唯一想法是以某种方式将“实际”组合框子类化(我可以使用CBEM_GETCOMBOCONTROL
消息来处理它)和 process WM_CHARTOITEM
。这是一个 PITA,所以我想我会问以前是否有人遇到过这个问题。
c++ - 在给定基色的情况下计算渐变填充的开始颜色和结束颜色
我有一个 WTL C++ 应用程序,我希望用户能够为某些 UI 元素选择不同的颜色,并使用GradientFill
API 调用应用渐变填充。但是,我不希望用户选择渐变的开始和结束颜色,而是希望他们能够选择“基本”颜色,并让我的应用程序自动计算合适的开始/结束颜色。我想最终得到一个类似于 Windows 用于各种主题元素的填充。基色可能是渐变的“中间”颜色,我的应用程序以某种方式计算渐变开始的颜色略浅,渐变结束的颜色略深。或者,我可以使用基础颜色作为开始颜色并计算结束颜色,反之亦然。
我确信使用一些 RGB 宏魔法会相对容易,但我真的不知道从哪里开始。任何想法都会受到欢迎。
visual-studio - 如何在 VS 2010 中安装 WTL 8.0 项目向导?
我已经下载了 WTL 8.0 包,然后发现安装 App Wizards 的脚本不支持 VS 2010。
有谁知道支持在 VS 2010 中安装的更新脚本?
谢谢!
winapi - 未调用 ATL 应用程序中 CMainDlg 的 WM_POWERBROADCAST 处理程序
我有一个 ATL 应用程序,我想在其中处理WM_POWERBROADCAST。我有一个 CMainDlg (CAxDialogImpl),我在其 MSG_MAP 中定义了处理程序。
但是,当我做一些应该调用它的事情时,不会调用处理程序,例如更改电源设置或让机器进入睡眠状态。
关于可能发生的事情以及如何解决这个问题的任何想法?出于某种原因,CMainDlg 是否没有收到电源事件的通知?
c++ - 如何仅使用 WinAPI (ATL/WTL) 在 WPF 中创建类似于 Expander 控件的东西?
我是英文新手,抱歉:) 如何仅使用 WinAPI (ATL/WTL) 在 WPF 中创建类似于 Expander 控件的东西?有经验吗?感谢您的回答!