以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  如何采用MFC控件STATIC显示图片数据?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=87806)


--  作者:葛靖青001
--  发布时间:11/19/2010 10:47:00 AM

--  如何采用MFC控件STATIC显示图片数据?
【转自互联网】

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

  }

  }

  }

  }

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

  }


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms