Winapi 未填充带有DT_EXPANDTABS选项卡的绘图文本

Winapi 未填充带有DT_EXPANDTABS选项卡的绘图文本,winapi,drawtext,Winapi,Drawtext,在我的自定义控件中,我避免使用WM_ERASEBKGND来消除闪烁。在WM_PAINThandler中,我首先计算出准确的背景区域并独立填充。然后我用DrawText绘制文本字段,但当使用DT_EXPANDTABS时,似乎跳过了制表符(即0x09),而没有绘制,最后我在单词之间得到了视觉垃圾 我是否必须手动处理选项卡,或者是否存在强制填充选项卡背景的标志或设置?我看不到让DrawText填充背景的设置或方法。我想我应该使用双缓冲——将文本绘制到一个填充了背景颜色的位图,然后将其快速地发送到目标。

在我的自定义控件中,我避免使用WM_ERASEBKGND来消除闪烁。在
WM_PAINT
handler中,我首先计算出准确的背景区域并独立填充。然后我用
DrawText
绘制文本字段,但当使用
DT_EXPANDTABS
时,似乎跳过了制表符(即
0x09
),而没有绘制,最后我在单词之间得到了视觉垃圾


我是否必须手动处理选项卡,或者是否存在强制填充选项卡背景的标志或设置?

我看不到让DrawText填充背景的设置或方法。我想我应该使用双缓冲——将文本绘制到一个填充了背景颜色的位图,然后将其快速地发送到目标。您可以使用
DT\u CALCRECT
来确定文本的大小,然后自己填充背景,然后再在顶部绘制文本。但是,这对于最后一行较短的多行文本没有帮助。按照@JerryCoffin的建议使用双缓冲可能是最好的解决方案。我的目标是在WM_油漆中实现极端性能。我已经经常使用ScrollWindow而不是重画,并且我考虑了更新区域。使用双缓冲没有技术问题,但这是一个巨大的性能下降。现代计算机相当快,我想你会发现双缓冲的性能很好,它避免了闪烁问题。“相当快”是艺术的一个很好的术语,但不是分析/优化。我知道如何做双缓冲,只是好奇是否可以通过在DrawText中设置一些标志来避免它。奇怪的是DrawText对空格和制表符的处理方式不同。空格不也是单词之间的间隙吗?无论如何,我决定编写自定义选项卡代码。这也将增加选项卡位置的灵活性。