为了使图像适合窗口,您只需要计算一个适合窗口客户区域的显示矩形,同时保留图像的纵横比。以下来自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点
如需与我们联系,请填写此表格,我们将通过电子邮件与您联系。