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);
}
}

解决方案 »

  1.   

    GetWindowRect之后调用ScreenToClient。
      

  2.   

    先判断图片的宽或高超过picture的宽或高,
    如果超过就改变picture的尺寸
      

  3.   

    这个程序可以正常显示图片,我现在想根据图片大小,来设置picture,来现在图片,该怎么写呢
      

  4.   

    这是我程序中的片段: CDC *pDC = GetDlgItem(IDC_CARZCPHOTO)->GetDC(); RECT   rect;   
    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("图像绘制失败!");   
      

  5.   

    有个函数可以实现CDC::StretchBlt .在msdn上好好看看这个函数的用法。就可以实现你上边说的功能了
      

  6.   

    ...你只要你的图片显示需要适应你窗口的大小么?如果真是这样,CDC::StretchBlt 可以。
    不过不会是这样简单把。这样的问题不该没人回答的。。
      

  7.   

    把你的代码发到我邮箱里,[email protected]
    我帮你看看
      

  8.   

    //zgl7903提供的方法:void Draw_Picture(CDC *pDC, CRect rect, LPCTSTR pszResourceName)
    {
      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) ); 
      

  9.   

    http://topic.csdn.net/u/20080619/19/a0c55999-4709-42ee-8627-1c140f0a138c.html?76671125//原帖在这里
      

  10.   

    GetWindowRect之后调用ScreenToClient。
      

  11.   

    我想如果你懂这个函数的真正意思,这样的问题应该不难.CDC::StretchBltBOOL StretchBlt(
         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标记的值。
      

  12.   

    cximage类图象方面功能强大,,楼主好好研究必有收获!
      

  13.   

    控件的大小可以由GetClientRect得到,图片(位图)的大小(长、宽)等可以从BITMAP结构中得到,
    BITMAP  BitMapHead; 
    bitmap.GetBitmap(&BitMapHead); //获取图片信息 
    其他格式的图片类似。
    自动适应无非是控件适用图片或者图片适用控件,两者相互赋值,然后调用:
    MoveWindow(...)或者StretchBlt(...)就行了