在设备上下文的中心位置进行TextOut操作

3
我为自己难以理解这个问题感到沮丧。我有一个带有打印功能的MFC应用程序。当我点击打印时,我想在A4纸张的中心创建一个只有一个单词的pdf文件。我正在使用CPrintDialog,并且实际上通过硬编码TextOut的坐标,在我的机器上获得了结果。
我希望此软件可以在任何类型的设备上工作。我猜测必须有一种方法来从CDC中获取逻辑坐标(TextOut所需的坐标)。我尝试使用GetDeviceCaps(与HORZSIZEHORZRESLOGPIXELSXASPECTXPHYSICALWIDTH)进行操作,但是这些值甚至没有接近我的硬编码值。使用的y坐标是负值让我更加困惑。
是否有一种通用的方法来找到设备上下文的中心?
这里是我看到的值:
const int logPixY = dcPrinter.GetDeviceCaps(LOGPIXELSY); //600
const int logPixX = dcPrinter.GetDeviceCaps(LOGPIXELSX); //600

const int horzSize = dcPrinter.GetDeviceCaps(HORZSIZE);  //216
const int vertSize = dcPrinter.GetDeviceCaps(VERTSIZE);  //279

const int horzRez = dcPrinter.GetDeviceCaps(HORZRES);    //5100
const int vertRez = dcPrinter.GetDeviceCaps(VERTRES);    //6600

const int pWidth  = dcPrinter.GetDeviceCaps(PHYSICALWIDTH); //5100
const int pHeight = dcPrinter.GetDeviceCaps(PHYSICALHEIGHT);//6600

const int aspectX = dcPrinter.GetDeviceCaps(ASPECTX);    //600
const int aspectY = dcPrinter.GetDeviceCaps(ASPECTY);    //600

而硬编码的DrawText是写在页面中心的(有点偏差):

dcPrinter.TextOut(4200, -5000, L"Center");

逻辑坐标的意义不就在于你不必使用设备坐标吗?有点困惑。如果您发布您认为最好的尝试,可能会有所帮助。 - john
@john 这就是我的观点。我不知道如何以通用的方式找到逻辑坐标。我的硬编码值在我朋友的机器上无法得出相同的结果。 - Vlad Nicola
1
这似乎还有更多的问题,因为 PHYSICALWIDTHPHYSICALHEIGHT 除以2应该是你要找的。但是你的 TextOut 中的数字似乎与之相差甚远。此外,看起来你正在使用 MM_LOENGLISH 进行映射,所以高度和宽度应该是11000和8500,不包括边距。 - lakeweb
2
所以,我最好的猜测是,在默认的MM_TEXT映射模式下使用了GetDeviceCaps,并在打印时间之前切换了模式。 - lakeweb
2
@lakeweb 你说得完全正确,我的朋友!看起来 GetDeviceCaps 不关心映射模式,但我确实在使用 MM_HIENGLISH。切换到 MM_TEXT 后,我可以使用 GetDeviceCaps(HORZRES) / 2GetDeviceCaps(VERTRES) / 2 写入页面中心。而且现在正y轴向下了,所以我的另一个问题也解决了。我之前不知道映射模式。非常感谢你的帮助! - Vlad Nicola
显示剩余2条评论
1个回答

0

如果使用GDI,通过以下方式进行居中会更容易:

SetTextAlign(hdc, TA_VCENTER|TA_VCENTER);

那么,只需使用页面的中心点(宽度/2、高度/2)作为TextOut参考点。让TextOut API计算文本的显示区域。


1
我的问题不在于文本对齐,而是关于你提到的寻找页面中心点。我似乎无法以通用的方式找到它的宽度和高度。 - Vlad Nicola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接