`

CDC::GetDeviceCaps() -- 物理长度与屏幕像素间的转换

 
阅读更多
作用:
读取DC的一些打印区域信息,主要是像素和英寸方面的数据.
声明:
GetDeviceCaps(int )
使用例子:
//所有像素数
int pagecx=dc.GetDeviceCaps(HORZRES);
int pagecy=dc.GetDeviceCaps(VERTRES);
//即每英寸点数
short cxInch = dc.GetDeviceCaps(LOGPIXELSX);
short cyInch = dc.GetDeviceCaps(LOGPIXELSY);
// 计算一个设备单位等于多少0.1mm
double scaleX = 254.0 / (double)GetDeviceCaps(dc.m_hAttribDC,LOGPIXELSX);
double scaleY = 254.0 / (double)GetDeviceCaps(dc.m_hAttribDC, LOGPIXELSY);

说明:
主要用到的参数见例子中的:HORZRES,VERTRES,LOGPIXELSX,LOGPIXELSY.总的来说是为了方便控制打印或重画时的控制,如为了定制打印时,一般依据的是物理的长度,而不是像素,而DC一般是用像素的映射模式,所以需要一下转换,上面这个函数就为这种转换设计的.


GDI中有一个函数是GetDeviceCaps(),可以获取一些关于设备的一些属性,如HORZSIZE/HORZRES/LOGPIXELSX等。
    以上三者的关系通常满足:HORZSIZE = 25.4 * HORZRES/LOGPIXELSX
    HORZSIZE为屏幕水平尺寸(定为度量尺寸,以mm计),HORZRES为水平的像素总数(定为像素大小,平时所说的屏幕分辨率,但在这不这么称呼。这里,分辨率定为“每英寸的像素数”),LOGPIXELSX为逻辑像素(假设的每英寸的像素数,并不是刚才所说的实际的“分辨率”)。因此HORZSIZE也称为逻辑宽度。
    当我们选择“显示”属性里的大字体时,LOGPIXELSX(通常分为96dpi与120dpi)变大了,这样假设原来的字体为10磅,则原来的字体横向所占像素(实际所占的像素数)为10*(1/72)*LOGPIXELSX,现在LOGPIXELSX变大了,则字体所占像素也大了,因此看起来字体大了。如果HORZRES不变的话,则HORZSIZE应该变小。然后这是和Windows有关的,在16位OS中,HORZSIZE值是固定的。
    在XP系统上验证了一下,发现HORZSIZE值与LOGPIXELSX的值也是不变的,如果改变HORZRES的话,则HORZSIZE会发生相应变化,但LOGPIXELSX不变,一直是96。
    验证数值是:当HORZRES/VERTRES分别为800/600、1280/1024、1360/768时,LOGPIXELSX/LOGPIXELSY一直为96,但HORZSIZE/VERTSIZE分别为320/240、375/300、400/320。于是个人断定:LOGPIXELSX/LOGPIXELSY与所选的字体(如TrueType)有关,windows默认的字体LOGPIXELSX/LOGPIXELSY值是定的,选大字体或小字体取它们的值都是一样的,而一些字体是不同的。而HORZSIZE/VERTSIZE与系统版本有关,在有的系统中,这两个值是适合此分辨率的标准显示器的尺寸(定值,长宽比与分辨率的比一样),不是通过公式计算的,也不等于公式计算的值;而有的系统版本这两个值为公式所得的值。
    下边是petzold那本书上的两句(没摘英文的):“
然而,在Windows NT中,用老的方法定义HORZSIZE和VERTSIZE值。这种方法与Windows的16位版本一致。HORZRES和VERTRES值仍然表示水平和垂直图素的数值,LOGPIXELSX和LOGPIXELSY仍然与在「控制台」的「显示器」程序中选择的字体有关。在Windows 98中,LOGPIXELSX和LOGPIXELSY的典型值是96和120 dpi,这取决于您选择的是小字体还是大字体。
在Windows NT中的区别是HORZSIZE和VERTSIZE值固定表示标准显示器大小。对于普通的显示卡,取得的HORZSIZE和VERTSIZE值分别是320和240毫米。这些值是相同的,与选择的图素大小无关。因此,这些值与用HORZRES、VERTRES、LOGPIXELSX和LOGPIXELSY索引从GetDeviceCaps中得到的值不同。然而,可以用前面的公式计算在Windows 98下的HORZSIZE和VERTSIZE值。



HFONT CreateFont(
                 int nHeight,           //字体的高度
                 int nWidth,            //字体的宽度
                 int nEscapement,       //字体显示的角度
                 int nOrientation,      //字体的角度
                 int nWeight,           //字体的磅数
                 BYTE bItalic,          //斜体字体
                 BYTE bUnderline,       //带下划线的字体
                 BYTE cStrikeOut,       //带删除线的字体
                 BYTE nCharSet,         //所需的字符集
                 BYTE nOutPrecision,    //输出的精度
                 BYTE nClipPrecision,   //裁减的精度
                 BYTE nQuality,         //逻辑字体与输出设备的实际
                                        //字体之间的精度
                 BYTE nPitchAndFamily,  //字体间距和字体集
                 LPCTSTR lpszFacename   //字体名称
               );

    示例:

/************************************************************************/
HFONT hFont;
HDC hDC;
hFont=CreateFont(10,10,0,0,FW_THIN,true,false,false,
CHINESEBIG5_CHARSET,OUT_CHARACTER_PRECIS,
CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,
FF_MODERN,"宋体");
SelectObject(hDC,hFont);
/************************************************************************/
分享到:
评论

相关推荐

    GetDeviceCaps

    - `HORZRES`和`VERTRES`:获取设备的物理水平和垂直分辨率,即屏幕的像素宽度和高度。 - `BITSPERPEL`:获取设备的颜色深度,即每个像素有多少位用于表示颜色。 - `PLANES`:获取设备支持的色平面数,大多数现代设备...

    【原创应用】屏幕截屏精灵2009

    【原创应用】:CDC *pDC;//屏幕DC pDC = CDC::FromHandle(GetDC(NULL));//获取当前整个屏幕DC int BitPERPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式 int Width = pDC->GetDeviceCaps(HORZRES); int ...

    学MFC的初级源码--Accel.doc

    3. **单位转换**:在处理不同分辨率的显示器时,使用CDC::GetDeviceCaps获取的像素值可以将逻辑单位(如英寸)转换为物理像素,确保在不同分辨率下显示的一致性。 4. **窗口类(CMainWindow)**:CMainWindow是...

    VC++中 CDC类细类

    在VC++编程中,CDC(Device Context)类是MFC(Microsoft Foundation Classes)库中用于图形绘制和文本处理的核心类。设备上下文是Windows系统中一个抽象的概念,它提供了与特定设备无关的图形操作接口,使得开发者...

    CListCtrl 标题栏颜色字体修改

    lf.lfHeight = -MulDiv(12, GetDeviceCaps(pDC->m_hDC, LOGPIXELSY), 72); // 创建12号字体 _tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("Arial")); // 使用Arial字体 font.CreateFontIndirect(&lf); CDC* pDC =...

    vc 读取excel 用dc画出来

    对于每个单元格,你需要计算其在屏幕上的坐标,并根据内容调整字体样式。比如,获取单元格的文本、字体、大小、颜色、下划线和斜体信息: ```cpp BSTR cellText = range->Value->ToString().c_str(); Excel::...

    MFC打印和打印预览

    在创建与屏幕DC兼容的内存DC后,即使将其映射模式设置为与屏幕DC相同(如MM_LOMETRIC),对于同一逻辑坐标系的转换结果仍可能不同。这是因为每个DC都有自己的视口(Viewport)和窗口(Window),它们分别对应实际...

    易语言像素转厘米的方法

    在计算机图形学中,像素是屏幕上的最小显示单位,而厘米是现实世界中的长度单位。在编程中,尤其是在处理图像和打印输出时,有时需要将像素值转换为厘米或者其他物理尺寸。易语言作为一款中国本土的编程语言,提供了...

    VB的截屏代码需要的下吧

    1. **获取屏幕尺寸**:使用`GetDeviceCaps`函数获取屏幕的宽度和高度。 2. **创建兼容设备上下文**:使用`CreateCompatibleDC`函数创建一个与屏幕兼容的设备上下文。 3. **创建兼容位图**:使用`...

    CDC类中常用的一些成员函数

    【CDC类】是MFC(Microsoft Foundation Classes)库中用于图形设备接口(Graphics Device Interface,GDI)操作的重要类,它封装了Windows API中的设备上下文(Device Context, DC)概念,提供了对屏幕和打印机等...

    利用API获取系统信息

    API 概念与作用 API(Application Programming Interface,应用程序编程接口)是一组定义了软件组件之间如何通信的规则。在本案例中,我们关注的是用于获取操作系统信息的API。 ### 2. 使用 WinAPI 获取系统信息 ...

    易语言像素转厘米的方法源码

    本资源提供了一种方法,将像素单位转换为厘米单位,这对于创建与物理打印尺寸一致的界面或文档至关重要。 首先,我们需要理解像素和厘米之间的关系。像素(Pixel)是屏幕上的最小显示单位,而厘米(Centimeter)是...

    放大镜源码 VB程序编写

    - **屏幕分辨率获取**:利用`GetDeviceCaps`函数获取屏幕的水平和垂直分辨率,分别存储在hr和vr变量中。 - **放大区域计算**:根据用户设定的放大倍率,计算出需要放大的区域范围。 - **位图拉伸复制**:使用`...

    电脑屏幕大小查看器(VC++带源码)

    在这个例子中,开发者可能会讲解如何利用这个函数获取屏幕的水平和垂直像素尺寸,然后根据像素密度转换为实际的物理尺寸。 在Windows系统中,屏幕尺寸通常以水平分辨率和垂直分辨率(例如1920x1080像素)表示,但...

    devcaps1.rar_GetDeviceCaps

    例如,通过调用`GetDeviceCaps(hdc, HORZRES)`和`GetDeviceCaps(hdc, VERTRES)`,可以分别获取设备的水平和垂直像素数,从而了解屏幕的物理尺寸。而`GetDeviceCaps(hdc, BITSPIXEL)`和`GetDeviceCaps(hdc, PLANES)`...

    得到图像像素坐标

    在计算机视觉和图像处理领域,获取图像中的像素坐标是一项基础且重要的任务。在VC++(Visual C++)编程环境中,我们可以利用MFC(Microsoft Foundation Classes)库提供的功能来实现这一功能。下面将详细讲解如何...

    屏幕分辨率自适应.zip

    屏幕分辨率是指屏幕上像素的数量,通常以宽度和高度的像素数表示,如1920x1080。高分辨率意味着更多的细节和清晰度,但同时也可能对应用程序的布局和显示提出挑战,因为元素的相对大小可能会随着分辨率的变化而变化...

    devcaps.rar_GetDeviceCaps

    《GetDeviceCaps函数在Windows图形设备接口中的应用与解析》 在Windows编程领域,图形设备接口(Graphics Device Interface,简称GDI)是操作系统提供的一种核心服务,用于与各种硬件设备进行交互,包括打印机、...

    精彩编程与编程技巧-利用VB捕捉并保存屏幕图象...

    ### 知识点一:VB中的屏幕截图技术 在Visual Basic (VB) 中实现屏幕截图功能,主要依赖于Windows API函数。本知识点将详细介绍如何利用VB结合这些API函数来捕捉并保存屏幕图像。 #### 1. 原理介绍 屏幕截图涉及到...

    delphi 版本的 屏幕尺子

    2. **坐标系统转换**:屏幕坐标系统与物理尺寸之间存在转换关系。开发者需要知道每英寸包含的像素点(DPI,每英寸点数),根据用户的屏幕DPI设置,将像素值转换为厘米或毫米。Windows API中的`GetDeviceCaps()`函数...

Global site tag (gtag.js) - Google Analytics