vc中在picture中插入一幅图片,怎样让picture控件自动适应图片大小??
void CmfcimageDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
RefreshDisplay();//更新结果窗口显示
}
}void CmfcimageDlg::RefreshDisplay()
{
if( m_imgLoaded.IsValid())
{
CRect r;
CWnd *p = (CWnd*) GetDlgItem(IDC_STATIC_KEYIMAGE);
CDC *pDC = p->GetDC();
p->GetWindowRect(&r);
//p->MoveWindow(r.left,r.top,m_imgLoaded.GetWidth(),m_imgLoaded.GetHeight(),true);
//我怎么这里插入一些代码,来实现这样功能
m_imgLoaded.Stretch(pDC->m_hDC, 0, 0,m_imgLoaded.GetWidth(),m_imgLoaded.GetHeight());
//GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
p->ReleaseDC(pDC);
} if( m_imgFound.IsValid() )
{
CRect r;
CWnd *p = (CWnd*) GetDlgItem(IDC_STATIC_FOUNDIMAGE);
CDC *pDC = p->GetDC();
p->GetWindowRect(&r);
//我怎么这里插入一些代码,来实现这样功能
m_imgFound.Stretch(pDC->m_hDC, 0, 0, m_imgFound.GetWidth(),m_imgFound.GetHeight());
p->ReleaseDC(pDC);
}
}
void CmfcimageDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
RefreshDisplay();//更新结果窗口显示
}
}void CmfcimageDlg::RefreshDisplay()
{
if( m_imgLoaded.IsValid())
{
CRect r;
CWnd *p = (CWnd*) GetDlgItem(IDC_STATIC_KEYIMAGE);
CDC *pDC = p->GetDC();
p->GetWindowRect(&r);
//p->MoveWindow(r.left,r.top,m_imgLoaded.GetWidth(),m_imgLoaded.GetHeight(),true);
//我怎么这里插入一些代码,来实现这样功能
m_imgLoaded.Stretch(pDC->m_hDC, 0, 0,m_imgLoaded.GetWidth(),m_imgLoaded.GetHeight());
//GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
p->ReleaseDC(pDC);
} if( m_imgFound.IsValid() )
{
CRect r;
CWnd *p = (CWnd*) GetDlgItem(IDC_STATIC_FOUNDIMAGE);
CDC *pDC = p->GetDC();
p->GetWindowRect(&r);
//我怎么这里插入一些代码,来实现这样功能
m_imgFound.Stretch(pDC->m_hDC, 0, 0, m_imgFound.GetWidth(),m_imgFound.GetHeight());
p->ReleaseDC(pDC);
}
}
解决方案 »
- 痛并快乐着,终于骗了个星星
- 如何使用boost库??
- 怎样在一个对话框中加载另一个对话框的工作区
- 关于Rich Edit控件两个小问题(回车换行和存储)
- 请教:VC中指针和句柄的区别?
- 菜鸟问题:如何发消息给一个只知道进程名的程序?
- 我在邮箱遭到攻击后束手无册!!!
- TC2.0里面有没有_bios_serialcom(_COM_STATUS,PORT_DRINTER,0) 这个函数?
- :怎么用BeginPath绘制不规则图形?
- 两块网卡,不同网段,一块用于视频监控系统中,会影响另一块网卡吗?
- 为什么打印预览时,点放大和缩小按钮时候预览的图片没有变化 而只有图片的背景变大变小?
- 多线程下的socket通信时服务端出错,错误码是10054(远程主机强迫关闭了一个现有的连接。)
如果超过就改变picture的尺寸
GetDlgItem(IDC_CARZCPHOTO)->GetClientRect( &rect); long hmWidth;
long hmHeight;
m_pPicture->get_Width(&hmWidth);
m_pPicture->get_Height(&hmHeight);
int nWidth = int(MulDiv(hmWidth, pDC->GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH) );
int nHeight = int(MulDiv(hmHeight, pDC->GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH) );
if( FAILED(m_pPicture->Render( *pDC,rect.left, rect.top, rect.right ,rect.bottom, 0, hmHeight, hmWidth, -hmHeight, NULL) ) ) AfxMessageBox("图像绘制失败!");
不过不会是这样简单把。这样的问题不该没人回答的。。
我帮你看看
{
ASSERT(pDC);
ASSERT(!rect.IsRectNull());
CBitmap bitmap;
if(bitmap.LoadBitmap(pszResourceName))//加载图片成功
{
BITMAP BitMapHead;
bitmap.GetBitmap(&BitMapHead); //获取图片信息 CDC memDC;
memDC.CreateCompatibleDC(pDC); //创建兼容内存DC
CBitmap *pBitmap = memDC.SelectObject(&bitmap); //将位图选入设备 //绘图
pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),
&memDC,
0,0,BitMapHead.bmWidth,BitMapHead.bmHeight,
SRCCOPY); //恢复和释放内存设备
memDC.SelectObject(pBitmap);
memDC.DeleteDC(); //释放位图
bitmap.DeleteObject();
}
}加入 LOGO 图片 ID命名为IDB_BITMAP_LOGO
OnPaint()中加入
C/C++ code
CDC *pDrawDC = GetDC();
CRect rect;
GetClientRect(&rect);
Draw_Picture(pDrawDC,rect, MAKEINTRESOURCE(IDB_BITMAP_LOGO) );
int x,
int y,
int nWidth,
int nHeight,
CDC* pSrcDC,
intxSrc,
int ySrc,
int nSrcWidth,
int nSrcHeight,
DWORD dwRop
)返回值:如果位图已经绘制,则返回非零值,否则为0。参数: x 目标矩形左上角的X逻辑坐标。
y 目标矩形左上角的Y逻辑坐标。
nWidth 目标矩形的宽度(逻辑单位)。
nHeight 目标矩形的高度(逻辑单位)。
pSrcDC 指定源设备上下文。
xSrc 源矩形左上角的X逻辑坐标。
ySrc 源矩形左上角的Y逻辑坐标。
nSrcWidth 源矩形的宽度(逻辑单位)。
nSrcHeight 源矩形的高度(逻辑单位)。
dwRop 指定光栅操作。光栅操作模式说明了GDI是如何组合输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。可以为下列值之一: · BLACKNESS 将所有输出变为黑色。
· DSTINBERT 反转目标位图颜色。
· MERGECOPY 使用AND运算符组合模板与源位图的颜色。
· MERGEPAINT 使用OR运算符组合源位图的反色与目标矩形的颜色。
· NOTSRCCOPY 将源位图的反色拷贝到目标矩形中。
· NOTSRCERASE 反转使用OR运算符组合源位图与目标矩形后得到的颜色。
· PATCOPY 将模板颜色拷贝到目标矩形中。
· PATINVERT 使用XOR运算符组合目标矩形与模板颜色。
· PATPAINT 使用OR运算符组合模板与源位图的反色。再使用OR运算符将该操作结果与目标矩形组合。
· SRCAND 使用AND运算符组合源位图和目标位图的像素。
· SRCCOPY 将源位图拷贝到目标位图。
· SRCERASE 反转目标矩形的颜色,再使用AND运算符将该结果与源位图组合。
· SRCINVERT 使用XOR运算符组合源位图和目标位图的像素。
· SRCPAINT 使用OR运算符组合源位图和目标位图的像素。
· WHITENESS 使所有输出变成白色。
说明:
将源矩形中的位图拷贝到目标矩形中,如果有必要,可以扩展或压缩该位图使其与目标矩形尺寸吻合。函数使用目标设备上下文(由SetStretchBltMode设置)的扩展模式来决定如何扩展或压缩位图。StretchBlt函数将pSrcDC源设备中的位图移动到目标矩形,该矩形用成员函数正在调用的设备上下文来表示。xSrc,ySrc,nSrcWidth和nSrcHeight 参数定义了源矩形的左上角和尺寸。x,yc,nWidth和nHeight参数定义了目标矩形的左上角和尺寸。dwRop指定的光栅操作模式说明了源位图与目标设备上已经存在的位图是如何组合的。如果nSrcWidth和nWidth或nSrcHeight和nHeight的符号不同,StretchBlt将为位图创建一个镜像。如果nSrcWidth和nWidth符号不同,函数沿X轴创建镜像。如果nSrcHeight和nHeight符号不同,函数沿Y轴创建镜像。StretchBlt函数在内存中对源位图进行扩展或压缩,然后将结果拷贝到目标矩形中。如果模板要与结果组合,则在扩展后的位图拷贝到目标矩形后才组合。如果用到画刷,应使用目标设备上下文中选定的画刷。目标坐标根据目标设备上下文来转换,源坐标根据源设备上下文来转换。如果目标位图、源位图和模板位图的格式不一致,StretchBlt使模板与源位图匹配模板位图格式,转换中会使用到目标设备上下文中的前景色和背景色。如果要将黑白位图转换为彩色位图,它将背景色设置为白位(1),前景色设置为黑位(0)。如果要将彩色位图转换为黑白位图,函数设置与背景色匹配的像素为白(1),其它像素为黑(0),用到了带颜色的设备上下文中的前景色和背景色。不是所有的设备都支持StretchBlt函数。调用带RASTERCAPS索引的GetDeviceCaps 函数来决定是否支持StretchBlt。并检验为返回给RC_STRETCHBLT标记的值。
BITMAP BitMapHead;
bitmap.GetBitmap(&BitMapHead); //获取图片信息
其他格式的图片类似。
自动适应无非是控件适用图片或者图片适用控件,两者相互赋值,然后调用:
MoveWindow(...)或者StretchBlt(...)就行了