如何仅使用 gdi 调用在 win32 中绘制选定的文本?
我尝试使用两个 TextOut 调用和 TA_UPDATECP 标志绘制选定的文本,但是当我移动选定区域时,字符会移动一点。
有人知道正确的方法吗?
I tried to draw a selected text using two TextOut call and TA_UPDATECP flag but when I move the selected area, the characters are moving a bit.
Does someone know the correct way to do that ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我相信抗锯齿和 ClearType 可以在小数像素位置绘制文本。 如果您绘制一串文本,然后尝试重新绘制中间的一部分,则可能无法从与中间字符完全相同的位置开始绘制文本。 技巧似乎是重新绘制整个字符串,但对所选文本使用剪切区域。
本教程中关于编写 Win32 文本编辑器的第 4 章 详细介绍了如何绘制选定的文本。
I believe that antialiasing and ClearType can draw text at fractional pixel positions. If you draw a string of text, and then try to redraw a portion of the middle, there might not be a way for you to draw text starting at exactly the same position as those characters in the middle. The trick seems to be to redraw the entire string, but with a clipping region for the selected text.
Chapter 4 in this tutorial on writing a Win32 text editor goes into quite some detail on how to draw selected text.
根据 MSDN 文档,当您使用 SetTextAlign()、TextOut()< /a> 忽略其位置参数以支持设备上下文的当前位置。 在没有看到您的代码的情况下,我怀疑您的绘图算法调用 TextOut() ,当前位置根据选择略有不同。
作为调试策略,您可以调用 GetCurrentPositionEx() 就在调用 TextOut() 之前获取当前位置并确保它符合您对文本绘制位置的期望。
According to the MSDN documentation, when you have set the TA_UPDATECP flag using SetTextAlign(), TextOut() ignores its position parameters in favor of the device context's current position. Without seeing your code, I suspect that your drawing algorithm calls TextOut() with a current position that differs slightly based on the selection.
As a debugging strategy, you can call GetCurrentPositionEx() just before you call TextOut() to obtain the current position and make sure it matches your expectation for where the text should be drawn.