GDI中關于分辨率﹑像素尺寸﹑字體大小的疑惑?????

wangyangcheng 2003-12-24 03:36:50
0. 詞匯理解
HORZRES:水平像素個數
VERTRES:垂直像素個數
HORZSIZE:邏輯水平尺寸
VERTSIZE:邏輯垂直尺寸
LOGPIXELSX:水平上每英寸的像素個數﹐即分辨率。
LOGPIXELSY:垂直上每英寸的像素個數﹐即分辨率。

以上理解對否?



1. Monitor的物理尺寸是固定的(比如15英寸或17英寸), 在Control Panel中只能設定HORZRES與VERTRES﹐即是間接的設置LOGPIXELS嗎?



2. 屏幕的邏輯寬度與邏輯高度是通過如下公式﹕

水平大小(mm) = 25.4 * ( HORZRES / LOGPIXELSX )
垂直大小(mm) = 25.4 * ( VERTRES / LOGPIXELSY )

那么屏幕的物理大小(比如15英寸屏幕大小)究竟如何得到呢?




3.字體大小到底與HORZRES/VERTRES和LOGPIXELSX/LOGPIXELSY究竟是有何關系?
它只是通過假設不同的LOGPIXELS來決定嗎?


4.既然這個HORZSIZE與VERTSIZE不是實際大小﹐那得到又有何意義?



ps:剛看<<Windows Programming>>﹐請多多指教﹗
...全文
917 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluebohe 2004-01-28
  • 打赏
  • 举报
回复
mark
wangyangcheng 2004-01-03
  • 打赏
  • 举报
回复
誰能幫我分析一下下面四行語句的含義及執行的效果﹐

SetMapMode( hdc, MM_ISOTROPIC );
SetWindowExtEx( hdc, 32767, 32767, NULL );
SetViewportExtEx( hdc, cxClient, -cyClient, NULL ); //這里為什么是-cyClient
//而不是cyClient?
SetViewportOrgEx( hdc, 0, cyClient, NULL ); //既然上面是-cyClient而這里為何
//又是cyClient?
wangyangcheng 2003-12-29
  • 打赏
  • 举报
回复
以下是<<Windows Programming>>(5/e) p167頁中的一段話﹕

首先﹐來看看Windows98是如何做的﹕假設您使用"控制面板"的"顯示"程序選擇了96dpi的系統字體。GetDeviceCaps對于LOGPIXELSX和LOGPIXELSY索引都將返回值96. Windows為視口范圍使用這些值并以表5-7的方式設置視口和窗口的范圍。

這樣﹐對MM_LOENGLISH來說﹐96除以100的比值是0.01英寸中的像素數。對MM_LOMETRIC來說﹐96除以254的比值是0.1mm中的像素數。


//////////////////////////////////////////////////////////////////////////////
在此我想問:
此96dpi只是系統的一個假設值呀?并非是我設定的( HORZRES * VERTRES / 實際屏幕面積 )的值呀?
若我從640*480變成800*600﹐而沒能更改字體的話﹐那LOGPIXELS則不准了﹗

那實際的分辨率到底如何得到呢?

莫非LOGPIXELS的值本來就是從系統設置的字體大小值中得到的?

wangyangcheng 2003-12-25
  • 打赏
  • 举报
回复
Thanks a lot!
voohoo2000 2003-12-24
  • 打赏
  • 举报
回复
7. 可否設置LOGPIXELS嗎?

LOGPIXELS 和 HORZRES & VERTRES 是相关的
只有HORZSIZE & VERTSIZE才是无力的,同一个设备是不变的

设置不同的LOGPIXELS可以得到不同的HORZRES和VERTRES.

Display 一般通过修改HORZRES和VERTRES来改LOGPIXELS
Printer 一般通过修改LOGPIXELS来改HORZRES和VERTRES


GSK168 2003-12-24
  • 打赏
  • 举报
回复
是的就是这样!
chehw 2003-12-24
  • 打赏
  • 举报
回复
7、通常不需要设置LOGPIXELS,
绘图时一般使用SetWindowExtEx、SetViewportExtEx来设置逻辑单位和设备单位的对应关系。
详细资料可参考MSDN-GDI部分,重点看一下坐标变换。
wangyangcheng 2003-12-24
  • 打赏
  • 举报
回复
7. 可否設置LOGPIXELS嗎?
如何設置?
(我的意思是只設置logpixels而不去動HORZRES * VERTRES)
wangyangcheng 2003-12-24
  • 打赏
  • 举报
回复
謝謝樓上的大人﹗

我想字休和HORZRES * VERTRES以及LOGPIXELS本來是沒有關系的﹐它只與人眼有關系﹐為了"好看"﹐只好通過"人"來告訴字體:此時Monitor的LOGPIXELS是多少?然后與之適應。


不知我這樣理解對否?
chehw 2003-12-24
  • 打赏
  • 举报
回复
0. 詞匯理解
HORZRES:屏幕宽度(多少个像素点),如600,800,1024
VERTRES:屏幕高度(多少个像素点),如480,600,768
HORZSIZE:物理屏幕的宽度(多少毫米)
VERTSIZE:物理屏幕的宽度(多少毫米)
LOGPIXELSX:在当前分辨率下及映射模式下,水平方向多少像素点=1英寸。如72,96
LOGPIXELSY:在当前分辨率下及映射模式下,水平方向多少像素点=1英寸。如72,96
1、不是
2、屏幕大小15英寸=对角线长度。
3、字体高度与CreateFont(iHeight,iWidth,...)中的iHeight和iWidth有关。
4、5、不明白你指的是什么意思。
6、如欲创建在任何分辨率下都等高的字体,可以用iHeight=MulDiv(iPoint, GetDeviceCaps(hdc, LOGPIXELSY),72)来计算所需的高度。

注:你所列出的HORZRES等,需用GetDeviceCaps(hdc,...)取得结果。
wangyangcheng 2003-12-24
  • 打赏
  • 举报
回复
//相關貼

请问,应该用哪个API函数来获取操作系统当前所使用的字体(大字体-120dpi, 小字体-96dpi)大小,用GetDeviceCaps(hdc,LOGPIXELSX)取到的只是

http://search.csdn.net/expert/topic/50/5001/2002/7/4/848629.htm
wangyangcheng 2003-12-24
  • 打赏
  • 举报
回复
5. 在HORZRES * VERTRES分別為640 * 480 或 1024 * 768時每個像素的大小究竟是多少?如何得到?


6. 在HORZRES * VERTRES從640 * 480 到 1024 * 768時字何為變小﹐計算的方法是什么?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧