问题标签 [comctl32]
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.
vba - 在 64 位 VBA 中使用 TaskDialogIndirect
问题描述
我尝试让代码在 64 位 VBA 下工作,这在 32 位 VBA 下工作正常。
它是关于通用控件任务对话框的。
我使用 Microsoft Access,但其他 VBA 主机中的问题应该是相同的。
一部分在(32 位和 64 位)VBA 中都可以正常工作,而另一部分则不能。
TaskDialog
API 在(32 位和 64 位)VBA 中运行良好
您可以启动TestTaskDlg
测试程序。
TaskDialogIndirect
API 仅在 32 位 VBA 中运行良好
您可以启动TestTaskDlgIndirect
测试程序。
在 64 位 VBA 中,它返回E_INVALIDARG (0x80070057 | -2147024809)
,以某种方式指向无效参数...
如果我使用Len()
代替LenB()
并注释这三行代码,它会显示一个正确的(空)对话框,因此调用TaskDialogIndirect
应该是正确的。
有人知道为什么它不能在 64 位 VBA 中工作吗?
在我看来,我已经将类型从正确转换Long
为LongPtr
。
我希望这是在运行时存储在结构中的值/指针的问题。
也许一些高/低字节的东西?
任何帮助表示赞赏。:-)
更新
一些新的见解:
似乎在TASKDIALOGCONFIG
内部使用了 1 字节的包装。
在 32 位 VBA(对结构使用 4 字节填充)中,这无关紧要,因为结构的所有成员都是类型
Long
,因此是 4 字节,所以根本没有发生填充。
同样在这个星座中, using 没有区别,Len(tdlgConfig)
它只计算数据类型的总和,而LenB(tdlgConfig)
,它确实计算了结构的实际大小。
两者都在这里产生 96 个字节。但是在 64 位 VBA(对结构使用 8 字节填充)中,结构的某些成员是类型
Long
(4 字节),有些是LongLong
(8 字节)(声明LongPtr
为 32 位兼容性)。这导致 VBA 应用填充,这就是Len(tdlgConfig)
返回160
和LenB(tdlgConfig)
176 的原因。因此,因为我的测试没有提供任何文本(注释提到的 3 行代码)仅在我使用
Len(tdlgConfig)
(而不是LenB(tdlgConfig)
)时才显示一个对话框,因此得出了相同的结论,即 64 位 API 只需要 160 字节的结构。
因此,为了提供一个 160 字节的结构,我将其用于测试:
现在两者都Len(tdlgConfig)
返回LenB(tdlgConfig)
160。
调用没有文本的空对话框仍然运行良好。
我现在可以设置dwCommonButtons
and nDefaultButton
(两种类型Long
),到目前为止它工作正常。
例如:
所以我可以预期结构的大小很好,现在我必须找出如何设置LongLong
( LongPtr
) 类型......
winapi - 将文本设置为大量数据后释放编辑控件堆?
在拉入大量数据后,我正在任务管理器中查看我的流程,CEditView
然后再设置回少量数据。我注意到提交大小仍然很大。然后我用VMMMap也看到了,所以我在VS2017诊断工具中做了“内存使用”。我看到它最终来自::SetWindowText()
电话。所以这显然在堆上分配了一个大缓冲区,但是当我将它设置回一个小量时,分配仍然很大。问题是,有没有一种方法可以让编辑控件释放它不需要的内存来减少少量文本以减少提交的内存?说,我可以在设置新文本之前释放它,它会根据需要分配吗?
谢谢!!
c++ - 关于 SysLink 控件的 WM_NOTIFY 消息的问题
在这个关于如何处理 SysLink 控件的 WM_NOTIFY 消息的Microsoft 示例g_hLink
中,他们有以下代码,即 SysLink 控件的句柄:
我不明白为什么(((LPNMHDR)lParam)->hwndFrom == g_hLink)
else 子句不需要条件?
或者这只是示例中的错误?
c - 更改 SysLink 控件中的链接颜色
我需要更改 SysLink 控件中链接的颜色。有一篇关于更改 SysLink 控件颜色的文章,但它只涉及更改整个控件的颜色,这使得链接的颜色与普通文本的颜色相同。
我需要更改链接颜色的原因是因为 SysLink 控件的背景颜色接近默认链接颜色,这使得链接不可读。
一张图胜过1000字:
- 这是默认的 SysLink 外观
- 我可以做到这一点
- in 可以做到这一点(同2但全黑)
- 但我无法做到这一点。
- 我可以实现这一点(与 2 相同,但链接保持默认颜色)。
我的印象是,您只能更改控件 (2,3) 中所有文本(包括链接)的颜色,或者更改文本的颜色并保留链接的默认颜色(5),但不能明确更改链接的颜色 (4)。
是否有一些 Windows 专家可以解释这个问题?
winapi - WIN32:有没有办法让按钮图标(BM_SETIMAGE)出现在文字的右侧
有没有办法拥有一个带有文本和图形的按钮,图形位于文本的右侧,而无需所有者绘制按钮?
我只想发送BM_SETIMAGE
任何其他需要的内容,因此图形位于文本的右侧。
另外,我注意到图像与文本的距离太近了,看起来不太好。有没有办法调整边距而不必在文本中使用空格?
winapi - WIN32:所有者绘制按钮中的重复标准按钮控件(禁用图标/热键下划线)?
因此,想要将图标放在按钮文本的右侧而不是左侧的简单壮举导致不得不使用所有者绘制按钮(但这里有人说如果使用视觉主题,自定义绘制实际上是可用的)。好的,很好,但现在我发现当 Windows 标准按钮不处于所有者绘制模式时,您无法真正复制 Windows 标准按钮的功能。
对于正常启用的按钮,我可以通过检查视觉样式是否可用然后使用DrawThemeBackground()
/DrawThemeText()
或DrawFrameControl()
/来获得正确的外观DrawText()
。但是,即使未按下 alt 键也会显示热键下划线字符,默认按钮在按下 alt 之前不会显示。
对于禁用的按钮,我无法复制放置在按钮上的图标的禁用外观。我试过DrawState()
了,DrawIconEx()
但这看起来像旧的 Windows 3.1 类型的灰色图形,而不是视觉风格变暗的图形。我看到有DrawThemeIcon()
一个图像列表,我想我可以尝试一下(我必须测试非视觉样式模式以查看DrawState()
不使用视觉样式时是否匹配)。
另外,当您将鼠标悬停在按钮上时,状态不会改变,我知道如果使用所有者绘制,这不会发生,也许它仍然适用于自定义绘制?
所以两个主要问题是:
1 - 按钮/所有者绘制是否有内置的东西,仅在按下 alt 时才处理带下划线的热键?
更新问题 1:我发现DT_HIDEPREFIX
并DrawText()
使用自定义绘图有CDIS_SHOWKEYBOARDCUES
标志。但是,对于所有者抽奖,我不确定某处是否有标志?
2 - 如何为禁用的按钮绘制图标以匹配默认按钮的功能?
蒂亚!!