void CTestBmpSaveToDlg::OnButton1() { /** * 按照屏幕上显示的实际位图大小重新保存位图文件 */ CxImage CxImage_a; /** * CxImage_a 装入位图... * CxImage_a.Decode(...) */ HDC hDc = GetWindowDC(NULL); int XDPI = GetDeviceCaps(hDc, LOGPIXELSX); int YDPI = GetDeviceCaps(hDc, LOGPIXELSY); ReleaseDC(NULL, hDc); CxImage_a.SetXDPI(XDPI); CxImage_a.SetYDPI(YDPI); float fCx = 0; float fCy = 0; /** * 得到位图实际的毫米尺寸到 fCx, fCy ... * 其他地方来的信息, * 比如原图制作时是在屏幕上显示一张实际A5大小的毫米尺寸位图 */ /** * 得到位图毫米尺寸到位图对应与当前分辨率下的像素尺寸到 fWidth, fHeigth */ float fWidth = fCx / 25.4f * XDPI; float fHeigth = fCy / 25.4f * YDPI; /** * 按照当前位图的像素尺寸转换位图 */ CxImage_a.Resample(fWidth, fHeigth); PBYTE pcBmpTmp = NULL; long dwLenBmpTmp = 0; if(!CxImage_a.Encode(pcBmpTmp, dwLenBmpTmp, CXIMAGE_FORMAT_BMP)) { LsLogError("CxImage_a.Encode()错误, 无法传递位图数据"); } else { saveBinFile("x://按照屏幕显示的实际大小重新保存的位图.bmp", pcBmpTmp, dwLenBmpTmp); } }
验证:
1. 写个测试程序, 在屏幕上圈选一个区域, 把这个区域的毫米尺寸报出来.
2. 写个屏幕标尺, 用户随意在屏幕上标注两点, 报出这条线的毫米尺寸.
要显示出标尺的外形. codeproject上有这种资料,先找一下.
预期的实现:
程序运行后为托盘,测量按钮在悬浮窗内. 悬浮窗半透明, 位图背景,位图按钮.
卡尺的左右卡钳,分别为一个锥形图案.
左卡钳的锥尖指向右下.
右卡钳的锥尖指向左上.
由两个锥尖之间的距离来界定要测量的距离.
左右卡钳分别为非模态对话框,装入异型图案(锥形图案)。
当鼠标移动上到卡钳的有效异型图案内时,鼠标变成拖动的小手。并有提示信息,请用户拖动卡钳.
当测量时,在屏幕上画出要测量的直线的提示线,闪烁.
在测量后,在测量按钮附件弹出提示框,显示测量结果.
<2011_0105>
一个Demo, 在Mdi切分窗口中画标尺, 随着鼠标的移动, 标尺线也在动.
http://www.codeproject.com/KB/splitter/ruler.aspx
Implementing Rulers inside of Splitter Panes - 2
<2011_0105>
/* * 填充CDC背景色 * RGB(127,127,127) 奶白色, * 适用于电子书正常页面的底色, 看着舒服 */ pDC->FillSolidRect(x, y, cx, cy, RGB(127,127,127));