以文本方式查看主题 - 中文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); } 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 |