picture控件问题 我想请问如何在picture控件中载入一幅jpg格式的图片,另外如何让图片缩小到picture的显示大小.最好能给出一个代码,谢谢了. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用StretchBlt函数,能够自动缩放将你要显示的图片缩小到,你的picture控件中 StretchBlt函数能给出一个代码吗?? m_picHDesDC = pDC->m_hDC;m_picHSrcDC = CreateCompatibleDC(m_picHDesDC); m_picHBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), m_picAndVideoFilePath[i], //图片路径 IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); GetObject(m_picHBitmap, sizeof BITMAP, &m_picBmp); SelectObject(m_picHSrcDC, m_picHBitmap); rctt = getPictureRect(m_iPicAndVideoStart[i], m_iPicAndVideoWidth[i]); //自己写的函数,获取要显示图片的矩形,当然可以用GetClientRect(控件ID)获得 m_picAndVideoRect.push_back(rctt); pDC->FillSolidRect(&rctt, RGB(255, 255, 255)); if (m_picAndVideoActive[i]) { pDC->SelectObject(&m_pictureActivePen); pDC->MoveTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].top); pDC->LineTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].bottom); pDC->MoveTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].bottom); pDC->LineTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].bottom); pDC->MoveTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].bottom); pDC->LineTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].top); pDC->MoveTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].top); pDC->LineTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].top); } else { pDC->SelectObject(&m_picNotActiveBrush); pDC->FrameRect(&rctt, &m_picNotActiveBrush); } //有关图片信息 int p_hight = rctt.Height(); int bmp_width = m_picBmp.bmWidth; int bmp_hight = m_picBmp.bmHeight; double proportion = bmp_width / bmp_hight; double temp = p_hight * proportion; ::SetStretchBltMode(m_picHDesDC,STRETCH_HALFTONE); if (int(temp) <= rctt.Width()) ::StretchBlt(m_picHDesDC, rctt.left + 1, rctt.top + 1, int(temp), rctt.Height() - 2, m_picHSrcDC, 0, 0, m_picBmp.bmWidth, m_picBmp.bmHeight, +SRCCOPY); else ::StretchBlt(m_picHDesDC, rctt.left + 1, rctt.top + 1, rctt.Width(), rctt.Height() - 2, m_picHSrcDC, 0, 0, m_picBmp.bmWidth, m_picBmp.bmHeight, +SRCCOPY); ::DeleteObject(m_picHBitmap); } ::DeleteObject(m_picHSrcDC); 而把Jpg格式转化成bmp格式的函数如下:HBITMAP CMyClass::ImageLoad(LPCTSTR szFile, HBITMAP hRet) { LPPICTURE gpPicture; HANDLE hFile = ::CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); ASSERT(INVALID_HANDLE_VALUE != hFile); DWORD dwFileSize = ::GetFileSize(hFile, NULL); ASSERT(-1 != dwFileSize); LPVOID pvData = NULL; HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, dwFileSize); ASSERT(NULL != hGlobal); pvData = ::GlobalLock(hGlobal); ASSERT(NULL != pvData); DWORD dwBytesRead = 0; BOOL bRead = ::ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL); ASSERT(FALSE != bRead); ::GlobalUnlock(hGlobal); ::CloseHandle(hFile); LPSTREAM pstm = NULL; HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &pstm); ASSERT(SUCCEEDED(hr) && pstm); hr=::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture); ASSERT(SUCCEEDED(hr) && gpPicture); pstm->Release(); OLE_HANDLE picHandle; gpPicture->get_Handle(&picHandle); HDC hdc = ::CreateCompatibleDC(NULL); ASSERT(hdc); ::SelectObject(hdc, (HGDIOBJ) picHandle); hRet = (HBITMAP)::GetCurrentObject(hdc, OBJ_BITMAP); DeleteDC(hdc); return hRet; } 只要用该函数替代上文的LoadIamge即可,该函数的第一个参数是文件路径 UTF8转Unicode问题 请问xtreme toolkit pro对应论坛哪个板块 讨论一个比较老的问题 请问如何在VC6.0中的ConsoleApplication里面作图? 怎样为VB提供层次调用的接口 关于Qsort()问题!?急用! 判断文本文件是否读到了结尾? 非常奇怪的现象和问题!!!重赏呀 关于定时任务的设计 请问:如何学好VC 在线急等——非模式对话框的刷新 非阻塞和异步是不是同一回事?
将你要显示的图片缩小到,你的picture控件中
m_picHSrcDC = CreateCompatibleDC(m_picHDesDC);
m_picHBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
m_picAndVideoFilePath[i], //图片路径
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
GetObject(m_picHBitmap, sizeof BITMAP, &m_picBmp);
SelectObject(m_picHSrcDC, m_picHBitmap);
rctt = getPictureRect(m_iPicAndVideoStart[i], m_iPicAndVideoWidth[i]); //自己写的函数,获取要显示图片的矩形,当然可以用GetClientRect(控件ID)获得
m_picAndVideoRect.push_back(rctt);
pDC->FillSolidRect(&rctt, RGB(255, 255, 255));
if (m_picAndVideoActive[i])
{
pDC->SelectObject(&m_pictureActivePen);
pDC->MoveTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].top);
pDC->LineTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].bottom);
pDC->MoveTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].bottom);
pDC->LineTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].bottom);
pDC->MoveTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].bottom);
pDC->LineTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].top);
pDC->MoveTo(m_picAndVideoRect[i].right, m_picAndVideoRect[i].top);
pDC->LineTo(m_picAndVideoRect[i].left, m_picAndVideoRect[i].top);
}
else
{
pDC->SelectObject(&m_picNotActiveBrush);
pDC->FrameRect(&rctt, &m_picNotActiveBrush);
} //有关图片信息
int p_hight = rctt.Height();
int bmp_width = m_picBmp.bmWidth;
int bmp_hight = m_picBmp.bmHeight;
double proportion = bmp_width / bmp_hight;
double temp = p_hight * proportion;
::SetStretchBltMode(m_picHDesDC,STRETCH_HALFTONE);
if (int(temp) <= rctt.Width())
::StretchBlt(m_picHDesDC, rctt.left + 1, rctt.top + 1, int(temp), rctt.Height() - 2, m_picHSrcDC, 0, 0, m_picBmp.bmWidth, m_picBmp.bmHeight, +SRCCOPY);
else
::StretchBlt(m_picHDesDC, rctt.left + 1, rctt.top + 1, rctt.Width(), rctt.Height() - 2, m_picHSrcDC, 0, 0, m_picBmp.bmWidth, m_picBmp.bmHeight, +SRCCOPY);
::DeleteObject(m_picHBitmap);
}
::DeleteObject(m_picHSrcDC);
HBITMAP CMyClass::ImageLoad(LPCTSTR szFile, HBITMAP hRet)
{
LPPICTURE gpPicture;
HANDLE hFile = ::CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
ASSERT(INVALID_HANDLE_VALUE != hFile);
DWORD dwFileSize = ::GetFileSize(hFile, NULL);
ASSERT(-1 != dwFileSize);
LPVOID pvData = NULL;
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
ASSERT(NULL != hGlobal);
pvData = ::GlobalLock(hGlobal);
ASSERT(NULL != pvData);
DWORD dwBytesRead = 0;
BOOL bRead = ::ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
ASSERT(FALSE != bRead);
::GlobalUnlock(hGlobal);
::CloseHandle(hFile);
LPSTREAM pstm = NULL;
HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
ASSERT(SUCCEEDED(hr) && pstm);
hr=::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
ASSERT(SUCCEEDED(hr) && gpPicture);
pstm->Release();
OLE_HANDLE picHandle;
gpPicture->get_Handle(&picHandle);
HDC hdc = ::CreateCompatibleDC(NULL);
ASSERT(hdc);
::SelectObject(hdc, (HGDIOBJ) picHandle);
hRet = (HBITMAP)::GetCurrentObject(hdc, OBJ_BITMAP);
DeleteDC(hdc);
return hRet;
}
只要用该函数替代上文的LoadIamge即可,该函数的第一个参数是文件路径