图片在1024*768下没问题,在800*600分辨率下有问题,大家帮忙解决!!谢谢! 我是在一控件中显示一jpg图片的,在1024*768下正好是控件框的大小,当在800*600下时,图片就显的小了,没填充满控件,很难看,大家教我怎么解决啊??谢谢!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这方面我恨VC啊~~~一遇到画框框我就用CB。 在一对话框中的picture control控件中显示图象bmp格式代码如下:bool CDlgViewInfo::ShowInfo(CString cTime) { char tmpPath[_MAX_PATH+1]; GetTempPath(_MAX_PATH,tmpPath);//得到临时文件的目录; strFileName.Insert(0,tmpPath);//生成临时文件名 CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite); //向临时文件写数据,数据库中数据读操作时关键是知道数据的长度,这可以从记录集的图像字段对应的长二进制成员变量m_Image的成员dwDataLength得到; var = pRs->GetCollect((_variant_t)_T("Photo")); int iLen = pRs->GetFields()->GetItem("Photo")->GetActualSize(); pData=(var.parray->pvData); LPSTR buffer = (LPSTR)GlobalLock(var.parray->pvData); outFile.Write(buffer,iLen); GlobalUnlock(var.parray->pvData); outFile.Close(); CreateStreamOnHGlobal(var.parray->pvData, TRUE, &pStm); CRect rct; GetDlgItem(IDC_STATIC_VIEW)->GetWindowRect(&rct); ScreenToClient(&rct); CDC* pDC = GetDlgItem(IDC_STATIC_VIEW)->GetDC(); IPicture *pPic; //load image from file stream if(SUCCEEDED(OleLoadPicture(pStm,iLen,TRUE,IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); double fX,fY; //get image height and width fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0); fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); //use render function display image if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) { pPic->Release(); return false; } } else { return false; } }return true;}由于显示图片的对话框是以刷卡的形式显示出来的。代码如下:if(刷卡进来){if(ShowInfo(cTime)) { CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()->m_pMainWnd; this->SetWindowPos(pMainFrm,rc.left,rc.top,0,0,SWP_SHOWWINDOW|SWP_NOSIZE); } 为何要用picture control啊?干吗不直接创建位图,然后用内存拷贝帖在对话框上或者任意CWnd的派生窗口上不就成了?我想和控件大小不匹配应该是因为Windows的CDC绘图映象模式问题,通常的模式(MM_TEXT)是直接针对监视器物理像素操作的,如转换改变分辨率后这个控件会和实际尺寸有出入.可以先转换成逻辑像素模式(比如MM_HIENGLISH),通过该位图的BITMAPINFOHEADER结构中记录的参数LONG biXPelsPerMeter; LONG biYPelsPerMeter; 和图片本身的分辨率可换算出位图实际物理尺寸,再将换算后的实际位图尺寸大小,根据对应的映像模式进行逻辑像素到设备像素的转换后计算出监视器的实际像素值大小进行绘制. 估计你的问题是显示的比例不协调吧!fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0); fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); 这里有问题,改成下面试一下factor = (double)pDC->GetDeviceCaps(HORZRES)/(double)pDC->GetDeviceCaps(HORZSIZE); fX = hmWidth/100.0 * factor; fY = hmHeight/100.0 * factor; 你在OnSize里用SetWindowPos重设一下图片框大小就行了 显示jpg的图像的大小安装图片框的大小来设置 播放器中自定义控制栏的隐藏与重现问题 CMainFrame::OnCreateClient(LPCREATESTRUCT) 利用vc 编写小程序 文件操作异常 求助 TRB是什么格式的文件??谢谢大家,另祝大家新年快乐! 如何实现地址欺骗? 劳驾各位帮俺瞅瞅,实在不知何缘故 为会么不能QI这个接口(IObjectControl)呢? 《VC6 MFC类库参考手册》推荐下载 谁做过基于SMTP协议的Email收发?HELP ME! ########关于多线程的疑惑,高手进 一个我也不知道是什么问题的问题,各位前辈请进
bool CDlgViewInfo::ShowInfo(CString cTime)
{
char tmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);//得到临时文件的目录;
strFileName.Insert(0,tmpPath);//生成临时文件名
CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);
//向临时文件写数据,数据库中数据读操作时关键是知道数据的长度,这可以从记录集的图像字段对应的长二进制成员变量m_Image的成员dwDataLength得到;
var = pRs->GetCollect((_variant_t)_T("Photo"));
int iLen = pRs->GetFields()->GetItem("Photo")->GetActualSize(); pData=(var.parray->pvData); LPSTR buffer = (LPSTR)GlobalLock(var.parray->pvData);
outFile.Write(buffer,iLen);
GlobalUnlock(var.parray->pvData);
outFile.Close();
CreateStreamOnHGlobal(var.parray->pvData, TRUE, &pStm); CRect rct;
GetDlgItem(IDC_STATIC_VIEW)->GetWindowRect(&rct);
ScreenToClient(&rct);
CDC* pDC = GetDlgItem(IDC_STATIC_VIEW)->GetDC();
IPicture *pPic;
//load image from file stream
if(SUCCEEDED(OleLoadPicture(pStm,iLen,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
//get image height and width
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
//use render function display image
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
return false;
}
}
else
{
return false;
}
}
return true;
}由于显示图片的对话框是以刷卡的形式显示出来的。代码如下:
if(刷卡进来)
{
if(ShowInfo(cTime))
{
CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()->m_pMainWnd;
this->SetWindowPos(pMainFrm,rc.left,rc.top,0,0,SWP_SHOWWINDOW|SWP_NOSIZE);
}
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); 这里有问题,改成下面试一下
factor = (double)pDC->GetDeviceCaps(HORZRES)/(double)pDC->GetDeviceCaps(HORZSIZE);
fX = hmWidth/100.0 * factor;
fY = hmHeight/100.0 * factor;