当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
C++技巧 :基于MFC控件STATIC显示图片数据
发布时间:2010/1/12 21:40:04 来源:城市学习网 编辑:海蓝

  1.       在 OnInitDialog 中加入

  GetDlgItem(IDC_MY_PIC)->ModifyStyle ( SS_TYPEMASK, SS_OWNERDRAW );

  2.       在butto 按钮中加入以下,可以显示多中类型的图片资源

  void CDlgpicDlg::OnTest()

  {

  // TODO: Add your command handler code here

  CFileDialog fileDlg(TRUE,NULL,NULL,

  OFN_ALLOWMULTISELECT,

  _T("Picture Files (*.bmp *.ico *.jpg)|*bmp;*.ico;*jpg|All 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();

  }

  }

  }

  }[NextPage]

  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); [NextPage]

  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));

  }

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved