1.*jpgAll Files (*.*)*.*"),
AfxGetMainWnd());
CString pathName;
if(fileDlg.DoModal ()IDOK)
{
POSITION mPos=fileDlg.GetStartPosition();
while(mPos!=NULL)
{
pathName=fileDlg.GetNextPathName(mPos);
if(m_pict.LoadPicture(pathName.GetBuffer(pathName.GetLength())))
{
// 防止有透明图片,消除已有的图片信息
CPaintDC dc(this); // device context for painting
CRect rc;
GetDlgItem(IDC_MY_PIC)-GetWindowRect(&rc);
dc.FillSolidRect(rc, RGB(0, 0, 0));
Invalidate();
}
}
}
}
3.给父窗口增加ON_WM_DRAWITEM消息映射函数 在OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)消息映射函数里面绘制控件
void CDlgpicDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
if(nIDCtl IDC_MY_PIC)
{
if ( m_pict.m_pic)
{
RECT rect;
TRACE("hell test-");
HWND hwnd = ::GetDlgItem(this-GetSafeHwnd(), IDC_MY_PIC);
HDC hDC = ::GetDC(::GetDlgItem(this-GetSafeHwnd(),IDC_MY_PIC));
//Get the DC for the CPicture Box
::GetClientRect(::GetDlgItem(this-GetSafeHwnd(), IDC_MY_PIC), &rect);
//Get dimensions of it
m_pict.DrawPicture(hDC, 0, 0, rect.right - rect.left ,rect.bottom - rect.top );
::ReleaseDC(::GetDlgItem(this-GetSafeHwnd(),IDC_MY_PIC), hDC);
}
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
总结: 如果在static中需要显示图片,在ONPAINT 中绘画 没有效果,需要这么画:
1)给static控件增加SS_OWNERDRAW属性 GetDlgItem(IDC_MY_PIC)-ModifyStyle ( SS_TYPEMASK, SS_OWNERDRAW );
2)给父窗口增加ON_WM_DRAWITEM消息映射函数
3)在OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)消息映射函数里面绘制控件
例如:下面给对话框里的IDC_STATIC_DRAW控件画个蓝色的背景
void CMyDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(nIDCtl IDC_STATIC_DRAW)
{
CDC *pDC = CDC::FromHandle(lpDrawItemStruct-hDC);
pDC-FillSolidRect(10, 10, lpDrawItemStruct-rcItem.right - 20, lpDrawItemStruct-rcItem.bottom - 20, RGB(0, 0, 255));
return;
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
另外,还可以这么画
从CStatic继承一个新类,然后增加WM_PAINT消息处理,在OnPaint里面画
例如:
class CMyStatic : public CStatic
{
...
afx_msg void OnPaint();
};
void CMyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rc;
GetClientRect(rc);
dc.FillSolidRect(rc, RGB(0, 0, 255));
}
OnInitDialog()中添加自绘属性
GetDlgItem(IDC_SMALLCARNUM)->ModifyStyle ( SS_TYPEMASK,SS_OWNERDRAW );
GetDlgItem(IDC_SPECIALNUM)->ModifyStyle ( SS_TYPEMASK,SS_OWNERDRAW );
OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)中添加绘制代码:
if(nIDCtl== IDC_SMALLCARNUM){
CImage mImage;
HDC hDC;
hDC = lpDrawItemStruct->hDC;
int result = mImage.Load(mSmallpath);
if(FAILED(result))
return;
::SetStretchBltMode (hDC, HALFTONE);
::SetBrushOrgEx(hDC, 0, 0, NULL);
mImage.StretchBlt(hDC,0,0,150,60,SRCCOPY);
//return; 我的代码中不返回图像也不会消失
}else if(nIDCtl == IDC_SPECIALNUM){
CImage mImage;
HDC hDC;
hDC = lpDrawItemStruct->hDC;
int result = mImage.Load(mWholepath);
if(FAILED(result))
return;
::SetStretchBltMode (hDC, HALFTONE);
::SetBrushOrgEx(hDC, 0, 0, NULL);
mImage.StretchBlt(hDC,0,0,300,288,SRCCOPY);
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);