改变TextOut, c++中设置位置的单位
Change the unit for setting position in TextOut, C++
我目前正在用c++编写一个打印插件,并开始使用TextOut
打印我想要的文本。它工作得很好,但显然,TextOut
用作参数的位置是以像素为单位的。有办法将它们设置为厘米或毫米吗?
这很简单。坐标不是以像素为单位,而是以映射模式的坐标为单位。恰好DC的默认映射模式是MM_TEXT,它的每个坐标单位是设备上的一个像素。
使用SetMapMode()将您的映射模式更改为您喜欢使用的坐标系。您还可以使用窗口范围、视口范围和原点来自定义它。您可能需要查看SetMapMode()和mm_lmetric(或MM_HIMETRIC)映射模式的文档。
应该为打印实现特殊的处理。基本上,您需要执行基于HIMETRIC单位的转换。纸张大小以计量单位表示。
下面的代码将帮助您开始(基于mfc):
if (pDC->IsPrinting())
{
// printable area in millimeters
int nWidth = pDC->GetDeviceCaps(HORZSIZE);
int nHeight = pDC->GetDeviceCaps(VERTSIZE);
CDC ScreenDC;
ScreenDC.CreateIC(_T("DISPLAY"), NULL, NULL, NULL);
int nPixelsPerInchX = ScreenDC.GetDeviceCaps(LOGPIXELSX);
int nPixelsPerInchY = ScreenDC.GetDeviceCaps(LOGPIXELSY);
// paper size is in HIMETRIC units. we need to convert
CSize PaperSize(MulDiv(nWidth,nPixelsPerInchX*100,HIMETRIC_PER_INCH),
MulDiv(nHeight,nPixelsPerInchY*100,HIMETRIC_PER_INCH));
// now we need to calculate zoom ratio so the layer content fits on page
double fZoomX = (double)PaperSize.cx/(double)m_DocSize.cx;
double fZoomY = (double)PaperSize.cy/(double)m_DocSize.cy;
m_PrintZoom = min(fZoomX, fZoomY);
ResetViewSize(TRUE);
if (pDC->IsKindOf(RUNTIME_CLASS(CPreviewDC)))
{
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(nPixelsPerInchX, nPixelsPerInchY);
pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX), pDC->GetDeviceCaps(LOGPIXELSY));
pDC->SetViewportOrg(0,0);
pDC->SetWindowOrg(0,0);
}
}
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何将元素添加到向量的字符串位置
- 求向量的奇数位置最大值(以C++为单位)
- 我如何知道像素的位置与相机的相应位置(以厘米或毫米为单位)
- 改变TextOut, c++中设置位置的单位
- OpenGL以像素为单位定义顶点位置