对HORZSIZE和VERTSIZE的疑惑

iloveyy1112 2007-01-08 06:26:01
学VC时看到GetDeviceCaps函数(获取设备能力),可根据其第二个参数的不同索引值而到到设备的一些信息.由于看书时看得比较疑惑,所以在这问问各位其中的某些问题:
1.HORZSIZE和VERTSIZE分别是以mm为单位的物理屏幕的高度和宽度,反映的是在当前分辨率下的屏幕显示的大小,其大小由VERTRES和HORZRES,LOGPIXELSX和LOGPIXELSY确定对吧?
2.LOGPIXELSX和LOGPIXELSY被称为逻辑象素,其值就是我们在WINDOWS中指定的假定的显示分辨率,单位就是每英寸的点数!比如说使用这两个索引返回值为96,则说明每英寸是96个点,若是120就是每英寸是120个点对吧?
...全文
468 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwrczb 2008-07-19
  • 打赏
  • 举报
回复
哦,意思就是说,如果要达到实际分辨率需要的物理大小。而不是显示器的大小。这确实让人费解啊!明白了。
「已注销」 2007-01-10
  • 打赏
  • 举报
回复
支持偶观点的回一个,再来一个结贴了!我自己弄明白了!
「已注销」 2007-01-10
  • 打赏
  • 举报
回复
crumpy()你没明白物理屏幕指的是什么,不是显示器的物理尺寸,而是在某个分辨率下实际区域的物理大小!
「已注销」 2007-01-10
  • 打赏
  • 举报
回复
其实你也可以去找个尺子看看,在不同屏幕分辨率下你量出来的大小是不是和你屏幕大小相同~反正我用程序测的结果在不同分辨率下是不同的喽!
crumpy 2007-01-09
  • 打赏
  • 举报
回复
那可以做个实验, 在屏幕上显示一定尺寸的东西, 然后你用尺子量量, 看是不是准确的和你计算结果一样的, 然后把这个东西用打印机打印到纸上, 再用尺子量量, 看是不是准确的.
「已注销」 2007-01-09
  • 打赏
  • 举报
回复
我的意思是,不是你显示器的大小,而是你的实际分辨率要在指定的每英寸多少象素下是多少mm长和宽
crumpy 2007-01-09
  • 打赏
  • 举报
回复
既然是物理屏幕的尺寸, 怎么会随分辨率变化而变化呢?

能说说在1280*800下, HORZSIZE = ? VERTSIZE = ?吗?
在800*600下, HORZSIZE = ? VERTSIZE = ?吗?
「已注销」 2007-01-08
  • 打赏
  • 举报
回复
但是我用程序在1280*800和800*600分辨率下发现这两个值不同,而且和计算公式:
VERTSIZE=25.4*(VERTRES/LOGPIXELSY)
HORZSIZE=25.4*(HORZSIZE/LOGPIXELSX)
算出来数值很近,所以我说这应该不是个固定值!
crumpy 2007-01-08
  • 打赏
  • 举报
回复
据说这些值:HORZSIZE和VERTSIZE不会很准确, 只是规定好的, 因为显示驱动测不出来
最近做了一个类似Windows画图板的小程序,拿来和大家分享一下。功能和界面全部模仿于Windows自带的画图板,界面如截图。功能主要有: 手绘线、简单图形、文字输入、图块拖放、重复撤销、画面缩放、打开保存图片文件,另外为了直接从数据库或者XML中存取图片,另外还提供了从Base64编码存取图片的接口,其他还实现了和画图板同样效果的工具箱及颜料盒。 1、 绘图: 绘制功能主要在OnLButtonDown、OnMouseMove、OnLButtonUp中实现,根据当前选择的工具和工具的样式进行绘制。程序中每种工具的绘制都是通过一个图元对象实现,比如钢笔、画刷因为本质上都是手绘线所以都通过CDrawPen来实现、直线和矩形等都通过CDrawShape来实现,所有的图元对象都放在文件DrawObject.h中,具体的实现请参见代码。 另外为了避免屏幕的闪烁,程序中做了两个处理:一、把视图自己的重绘背景代码屏蔽掉,即响应视图的WM_ERASEBKGND消息,直接返回TRUE,并在Ondraw中程序自己绘制背景就可以了;二,在Ondraw中绘制的时候,先绘制到内存DC中,然后再贴回视图的DC。这样就基本上就可以避免屏幕的闪烁了。 2、 撤销重做: 由于整个程序较为简单,就没有采用把动作记录下来的方式,只是采取了一个较简单的方法,在每当一个图元绘制动作结束时就把画布的内容存到bmp中以备撤销,这些历史画面存放在一个bmp数组中,并定义了一个Stack类来管理该数组(此实现方式参考了在线杂志21期《类似画笔的绘图控件-卫琳》,在此表示感谢!),然后在屏幕上绘制的时候就是把当前位图贴到屏幕上,并把还没存取位图的图元绘上就行了。 3、 缩放: 一般视图缩放的实现是通过DC的两个函数来实现:SetViewportExt和SetWindowExt,但是这两个函数只在MM_ISOTROPIC和MM_ANISOTROPIC这两种映射模式下有效果,而常用的带滚动条的视图类CScrollView却不支持这两种模式(参见CScrollView::SetScrollSizes)的实现。所以只好把MFC的CScrollView的代码拿过来改了一下以支持MM_ISOTROPIC映射模式,如下所示,具体参见程序文件“ADMMScrollView.h”: ::SetMapMode(hdc,MM_ISOTROPIC); int XLogMm = ::GetDeviceCaps(hdc, HORZSIZE); int YLogMm = ::GetDeviceCaps(hdc, VERTSIZE); int XLogPix = ::GetDeviceCaps(hdc, HORZRES); int YLogPix = ::GetDeviceCaps(hdc, VERTRES); ::SetWindowExtEx(hdc,XLogMm*100,YLogMm*100,NULL); ::SetViewportExtEx(hdc,(int)(XLogPix*fZoomScale), (int)(YLogPix*fZoomScale),NULL); 4、 工具箱: 首先为了实现工具箱的按钮分两列显示的效果,需要设置一下按钮的TBBS_WRAPPED,参见程序中的CToolPaletteBar类;然后,选择不同工具时展现出工具的样式,比如选择“直线”时列出可用的直线宽度样式,该功能通过在ToolBar上放一个CListCtrl实现,当前的工具样式通过图标的方式展现,效果和画图板的类似。 5、 颜料盒: 从CDialogBar类继承了一个类,然后在WM_PAINT响应函数里面绘制一个个小颜色矩形,并重写其OnLButtonDown、OnRButtonDown、OnLButtonDblClk来和用户交互,实现出来的效果还不错,看上去和画图板的颜料盒一样。 6、 鼠标光标样式: 首先在资源文件中增加需要的光标资源,然后在视图的OnSetCursor消息函数中调用SetCursor函数来设置光标样式就可以了,注意要判断HitTest参数是否为HTCLIENT,不然的话鼠标移到了滚动条上的时候光标还是画笔的样式就让人觉得怪怪的了。
不使用水晶报表,实现列表式的打印。 刚学C# 1个月时写的,如果污染了视听,请见谅。 struct PageProperty { public int PageLeft; public int PageTop; public int PageBottom; public int PageWidth; public int PageHeight; public int RowSpace; public int ColSpace; public int AllVisibleColSpace; public int AllColWidth; public int AllVisibleColWidth; public int AllRowHeight; public int TitleH; public int SubTitleH; public int FooterH; public int[] ColWidth; public int VisibleColWidth; public int PageTextHeight; public int PageTextWidth; } struct TRect { public int Left; public int Top; public int Right; public int Bottom; } class PanelImage : Panel { protected Panel panelShadow = null; public PictureBox ImgData = null; public PanelImage() { this.BackColor = Color.Gray; this.DoubleBuffered = true; ImgData = new PictureBox(); ImgData.Parent = this; ImgData.BackColor = Color.White; panelShadow = new Panel(); panelShadow.Parent = this; panelShadow.BackColor = Color.Black; ResizeControl(); } void ResizeControl() { panelShadow.Left = 8; panelShadow.Top = 8; panelShadow.Width = this.Width - 12; panelShadow.Height = this.Height - 12; ImgData.Left = 4; ImgData.Top = 4; ImgData.Width = this.Width - 12; ImgData.Height = this.Height - 12; } protected override void OnResize(EventArgs eventargs) { ResizeControl(); base.OnResize(eventargs); } protected override void Dispose(bool disposing) { panelShadow.Dispose(); ImgData.Dispose(); base.Dispose(disposing); } } public partial class PrintGrid { [DllImport("gdi32.dll", EntryPoint = "GetDeviceCaps", CallingConvention = CallingConvention.StdCall)] public static extern int GetDeviceCaps(int Handle, int nIndex); private float _leftMargin = 0; private float _topMargin = 0; private float _rightMargin = 0; private float _bottomMargin = 0; const short HORZSIZE = 4; const short VERTSIZE = 6; const short HORZRES = 8; const short VERTRES = 10; const short PHYSICALOFFSETX = 112; const short PHYSICALOFFSETY = 113; int ixLogPixPerInch; int iyLogPixPerInch; int xLogPixPerInch; int yLogPixPerInch; int FPageIndex; int FPageCount; string FLeftPageFooter; string FRightPageFooter; string FTitle; Font FFont; Font FTitleFont; Font FTextFont; Font FFooterFont; Font FSubTitleFont; int FSubTitleOff; int FLeftPageFooterOff; int FPrintCount; string FSubTitle; bool FHLine; bool FVLine; int FPageTop; int FPageLeft; int FPageRight; int FPageBottom; int FToPage; int FFromPage; bool FPrintPageCount; string FRightSubTitle; bool FExistPrinter; bool FCenterShow; Color FHeaderColor; bool FUseHeaderColor; private int iDX; //水平缩放比例 private int iDY; //垂直缩放比例 private int ColCount; //总列数 private int RowCount; //总行数 private int[] ColWidth; //记录每一列的宽度 private int AllColWidth; //所有列的宽度 private int AllVisibleColWidth; //所有可视列的宽度 private int RowSpace; //行间距 private int ColSpace; //所有可视列间距 private int AllVisibleColSpace; //所有行的间距 private int AllColSpace; //所有列的间距 private int AllRowSpace; //所有行的间距 private int RowsOfPage; //每页打的行数 private int PageWidth; //页的宽度 private int PageHeight; //页的高度 private int PageTextHeight; //页正文高度 private int PageTextWidth; //页正文宽度 private int TextTop; //正文上边距 private int TextLeft; //正文左边距 private int TitleH; //标题高度 private int SubTitleH; //子标题高度 private int FooterH; //页脚高度 private int FooterTop; //页脚顶部 private int TextH; //正文高度 private int VisibleColWidth; private int DX; private int DY; private string StrTest; private ListView ListViewData = null; //数据 private PrintDocument PD = null;

16,473

社区成员

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

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

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