图片上显示多行文字失败解决方案
图片上显示多行文字失败
现在代码遇到的问题:
1.用drawtext显示文字失败,用textout可以正常显示
期望达到的效果:
1.在对话框中显示图片,图片设定为文字的背景
2.在图片上输出多行文字,当文字超过设定显示范围的大小时,可滚动显示。
3.显示文字可清除,且不影响图片显示
请帮我排查一下问题。
我现在的主要代码,图片显示在static text的控件中名字为IDC_STATIC_IMG。
不能显示文字代码:
显示图片的代码
------解决思路----------------------
DrawText(hDC,str,str.GetLength(),&rc,DT_CALCRECT);
----------->
DrawText(hDC,str,str.GetLength(),&rc,DT_EDITCONTROL
------解决思路----------------------
DT_WORDBREAK);
现在代码遇到的问题:
1.用drawtext显示文字失败,用textout可以正常显示
期望达到的效果:
1.在对话框中显示图片,图片设定为文字的背景
2.在图片上输出多行文字,当文字超过设定显示范围的大小时,可滚动显示。
3.显示文字可清除,且不影响图片显示
请帮我排查一下问题。
我现在的主要代码,图片显示在static text的控件中名字为IDC_STATIC_IMG。
不能显示文字代码:
BOOL CShowJpgDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
CDC *pdc;
pdc=GetDlgItem(IDC_STATIC_IMG)->GetDC();
if(pMsg->message==WM_RBUTTONDOWN)
{
ShowImage(pdc,"C:\\Users\\Administrator\\Desktop\\a.jpg",0,0);
}
if(pMsg->message==WM_LBUTTONDOWN)
{
//获取客户区域
static CString str="测试文字换行";
HDC hDC=pdc->GetSafeHdc();
CRect rc;
COLORREF color=RGB(255,0,0);
//SetBkColor(hDC,color);
GetDlgItem(IDC_STATIC_IMG)->GetClientRect(&rc);
CString clientsize;
clientsize.Format("client size %d,%d,%d,%d",rc.top,rc.left,rc.bottom,rc.right);
MessageBox(clientsize);
rc.SetRect(500,500,1000,1000);
SetBkMode(hDC,TRANSPARENT);
clientsize.Format("str len %d",str.GetLength());
MessageBox(clientsize);
DrawText(hDC,str,str.GetLength(),&rc,DT_CALCRECT);
str+=str;
//DrawText();
}
//my_font->DeleteObject();
ReleaseDC(pdc);
return CDialogEx::PreTranslateMessage(pMsg);
}
显示图片的代码
BOOL CShowJpgDlg::ShowImage(CDC* pDC,CString strPath, int x, int y)
{
IPicture *pPic=NULL;
OleLoadPicturePath(CComBSTR(strPath.GetBuffer()), (LPUNKNOWN)NULL, 0, 0, IID_IPicture,(LPVOID*)&pPic);
if (NULL==pPic)
{
return FALSE;
}
// 获取图像宽和高,注意这里的宽和高不是图像的分辨率
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
// 将图像宽度和高度单位转化为像素单位
//#define HIMETRIC_PER_INCH 2540
//int nPicWidth = MulDiv(hmWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX),2540);
//int nPicHeight = MulDiv(hmHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY),2540);
// 获取显示图片窗口的宽度和高度
RECT rtWnd;
pDC->GetWindow()->GetWindowRect(&rtWnd);
int iWndWidth=rtWnd.right-rtWnd.left;
int iWndHeight=rtWnd.bottom-rtWnd.top;
if(FAILED(pPic->Render(*pDC,x,y,iWndWidth,iWndHeight,0,hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
return false;
}
pPic->Release();
return true;
}
//************************************
// 方法说明: 浏览图片
// 返回值: void
//************************************
void CShowJpgDlg::OnBnClickedBtnBrowse()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE,"jpg","*.jpg", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif|bmp文件(*.bmp)|*.bmp|",NULL);
if(dlg.DoModal()==IDOK)
{
SetDlgItemText(IDC_TXT_PATH,dlg.GetPathName());
//设置静态控件的样式,使其可以使用位图,并使位图显示居中
((CStatic*)GetDlgItem(IDC_STATIC_IMG))-> ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//ShowJpgGif(GetDlgItem(IDC_STATIC_IMG)->GetDC(),dlg.GetPathName(),0,0);
ShowImage(GetDlgItem(IDC_STATIC_IMG)->GetDC(),dlg.GetPathName(),0,0);
}
}
------解决思路----------------------
DrawText(hDC,str,str.GetLength(),&rc,DT_CALCRECT);
----------->
DrawText(hDC,str,str.GetLength(),&rc,DT_EDITCONTROL
------解决思路----------------------
DT_WORDBREAK);