如何在MFC中更改VIEW大小以适合输入图像?

时间:2013-09-16 13:34:10

标签: c++ mfc

我想更改VIEW大小以适合输入图像的大小。

首先,我使用File Open打开bmp或jpg(jpeg / gif)图像。

打开bmp图片:

void CDrawToolView::ShowBitmap(CDC* pDC,CString strPicPath)
{        
    HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,strPicPath,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
    m_bitmap.Detach();
    m_bitmap.Attach(hBitmap);

    CRect rect;
    GetClientRect(&rect);

    CDC dcImage;
    if (!dcImage.CreateCompatibleDC(pDC))
    {
        return;
    }
    BITMAP bm;
    m_bitmap.GetBitmap(&bm);
    dcImage.SelectObject(&m_bitmap);
    pDC->StretchBlt(0,0,rect.right,rect.bottom,&dcImage,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); 
}

打开jpg(jpeg / gif)图片:

void CDrawToolView::ShowPic(CDC* pDC,CString strPicPath)
{        
    if(!m_MyImage.IsNull())
        m_MyImage.Destroy();
    HRESULT hResult=m_MyImage.Load(strPicPath);
    int iWidth=m_MyImage.GetWidth();
    int iHeight=m_MyImage.GetHeight();
    m_MyImage.Draw(pDC->m_hDC,0,0,iWidth,iHeight);
}

然后,我想要更改cs.cxcs.cyMainFrm.cpp的图片大小。

我原来的VIEW设置是:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    cs.x=320;
    cs.y=15;

    cs.cx=441; //210*2
    cs.cy=701; //297*2

    return TRUE;
}

我可以使用指针将输入图像的宽度和高度从CDrawToolView传递到cs.cx中的cs.cyMainFrm.cpp,并自动更改VIEW大小吗? / p>

修改

我尝试使用OnSize发回cxcy

void CDrawToolView::OnSize(UINT nType, int cx, int cy)
{
    CView::OnSize(nType, cx, cy);
    CWnd* pMainFrame = this->GetParent();
    ::SendMessage(pMainFrame->m_hWnd,WM_SIZE,0,0);
}

如何将宽度和高度传递给它?

2 个答案:

答案 0 :(得分:1)

要在创建窗口之前将所需的窗口尺寸调整为特定的客户端尺寸,您需要致电AdjustWindowRectAdjustWindowRectEx

来自文档:

  

根据客户矩形的所需大小计算窗口矩形所需的大小。

CREATESTRUCT成员styledwExStyle可以使用所需的窗口样式和扩展窗口样式。

答案 1 :(得分:1)

注意:未经测试的代码 - 其中一些是伪代码,但它应该为您提供IDEA:

inline BOOL MoveWindow(HWND hwnd, const RECT & rect, BOOL bRepaint)
{
    return ::MoveWindow(hwnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, bRepaint);
}

void CDrawToolView::LoadPic(CString strPicPath)
{        
    if(!m_MyImage.IsNull())
        m_MyImage.Destroy();
    HRESULT hResult=m_MyImage.Load(strPicPath);
    int iWidth=m_MyImage.GetWidth();
    int iHeight=m_MyImage.GetHeight();
    CRect client(0, 0, iWidth, iHeight);
    AdjustWindowRect(&client, GetWindowStyle(GetHwnd()), TRUE/FALSE); // You will need to write the helper: GetWindowStyle, or replace this with more statements to obtain the style into a DWORD and then use that DWORD here...
    ResizeWindow(GetHwnd(), &client, TRUE);
}