为了使图像适合窗口,您只需要计算一个适合窗口客户区域的显示矩形,同时保留图像的纵横比。以下来自EZFUNC示例程序的代码片段展示了如何做到这一点。(此示例代码包括一些调色板处理,在处理面板更改).
变量声明:
/*全局声明矩形rWndSize;/* RECT用于设置窗口大小。* /矩形rClientSize;/* RECT为客户区。* /矩形rLeadDest;/* RECT用于绘制的目标矩形。* /矩形rLeadSource;/* RECT用于绘制源矩形。* /HPALETTE hpalPaint;/*油漆面板手柄。* /BITMAPHANDLE LeadBitmap;/*加载图像的位图句柄。* /L_INT DisplayWidth, DisplayHeight;/*显示图像的尺寸*//*消息处理函数中的局部声明PAINTSTRUCT ps;用于处理WM_PAINT消息的结构HPALETTE = NULL;/*当前系统面板的临时副本*/HDC HDC;/*与面板函数一起使用的设备上下文*/intAdjustedWidth AdjustedHeight;/*调整窗口尺寸*/
设置矩形的代码:
在消息处理函数的这段代码中,位图(LeadBitmap)已加载,但尚未显示。
/*获取当前窗口大小和客户区域*/GetWindowRect (hWnd, &rWndSize);GetClientRect (hWnd, &rClientSize);/*使用这个用户定义的函数来适应客户区显示的图像。* /(rClientSize.right,/*允许的宽度*/rClientSize.bottom,/*允许高度*/BITMAPWIDTH (&LeadBitmap),/*宽度因子,用于纵横比*/BITMAPHEIGHT (&LeadBitmap),/*高因子,用于纵横比*/空,/*结果左值,未使用*/空,/*结果顶部值,不使用*/&DisplayWidth,/*结果宽度值*/&DisplayHeight);/*结果高度值*//*调整窗口大小以删除右侧或底部的空白*/adjusttedwidth = rWndSize。right - rWndSize。- rClientSize.right;adjuststedheight = rWndSize。bottom - rWndSize。- rClientSize.bottom;MoveWindow (hWnd, rWndSize。离开了,rWndSize。top, adjustdwidth, adjuststedheight, FALSE);/*获取调整后窗口的客户端区域*/GetClientRect (hWnd, &rClientSize);/*使绘制的目标矩形与客户区相同*/rLeadDest = rClientSize;/*设置源矩形使用整个位图*/SetRect(&rLeadSource, 0,0, LeadBitmap。宽度,LeadBitmap.Height);
绘制图像的代码:
情况下WM_PAINT:/*获取设备上下文句柄*/hdc = BeginPaint (hWnd, &ps);如果(LeadBitmap.Flags.Allocated)/*我们有图像吗?* /{如果(hpalPaint)/*如果我们有一个调色板,选择它*/{hPalette = SelectPalette (hdc, hpalPaint, FALSE);/*如果不处理WM_QUERYNEWPALETTE */,则取消注释/* RealizePalette (hdc);* /}/*绘制图像*/L_PaintDC (hdc&LeadBitmap,&rLeadSource,/*源矩形*/空,/*默认源剪辑区域*/&rLeadDest,/*目标矩形*/&ps.rcPaint,/*由WM_PAINT */设置的Dest剪辑SRCCOPY);/*普通油漆*/如果(hpalPaint)/*返回旧的调色板*/SelectPalette (hdc, hPalette, FALSE);}EndPaint (hWnd, &ps);/*返回DC */返回(0);
计算显示矩形的局部函数:
最大宽度。
最大高度。
为了保持纵横比,通常是位图宽度。
为了保持纵横比,通常是位图高度。
如果不关心居中,则传递NULL。否则,它将使用X偏移量进行更新。
如果不关心居中,则传递NULL。否则,将用Y偏移量进行更新。
要更新的宽度变量的地址。
要更新的高度变量地址。
笔记:使用此函数将显示的图像贴合到特定的空间,同时保留纵横比。
无效CalcDisplay (L_INT宽度允许,L_INT高度允许,L_INT的宽度因子,L_INT的高度因子,L_INT *ResultLeft, L_INT *ResultTop,L_INT *ResultWidth, L_INT *ResultHeight){/*计算结果的局部变量*/L_INT左,顶部,宽度,高度;/*查看是否使用最大宽度会使图像太高*/如果(MulDiv(WidthAllowed, hightfactor, WidthFactor) < hightallows){/*使用最大宽度,计算高度和顶部值*/左= 0;宽度= WidthAllowed;高度= MulDiv(宽度,hightfactor, WidthFactor);Top = (hightallows - Height) / 2;}其他的{/*使用最大高度,并计算宽度和左侧值*/Top = 0;高度=允许高度;宽度= MulDiv(高度,WidthFactor, hightfactor);Left = (WidthAllowed - Width) / 2;}/*如果调用者没有传递NULL */,则更新顶部和左侧的结果如果(ResultTop != NULL)*ResultTop = Top;如果(ResultLeft != NULL)*ResultLeft =左;/*更新宽度和高度结果*/*ResultWidth =宽度;*ResultHeight =身高;返回;}
帮助收藏
光栅net|C API|c++类库|HTML5 JavaScript
文档net|C API|c++类库|HTML5 JavaScript
医疗net|C API|c++类库|HTML5 JavaScript
医疗网络查看器net
188宝金博怎么下载
支持的平台上
.NET、Java、Android和iOS/macOS程序集
C API/ c++类库
HTML5 JavaScript库
您的邮件已发送给技术支持!应该有人联系!如果你的事情很紧急,请回来聊天。
聊天时间:
周一至周五,美国东部时间上午8:30至下午6:00
感谢您的反馈!
请再次填写表格,开始新的聊天。
所有代理目前都离线。
聊天时间:
星期一至星期五
美国东部时间上午8:30 -下午6点
如需与我们联系,请填写此表格,我们将通过电子邮件与您联系。
