MFC picture控件中顯示圖片
PictureBox 控件的主要作用是為用戶顯示圖片。實際顯示圖片由 Picture 屬性決定。Picture屬性包括被顯示的圖片的文件名(及可選的路徑名)。
注意 窗體對象也具有 Picture 屬性,通過設置該屬性可直接在窗體背景上顯示圖片。
要在運行時顯示或替換圖片,可利用函數 LoadPicture 來設置 Picture 屬性。提供圖片文件名和可選路徑名,由 LoadPicture 函數處理加載和顯示圖片的細節。
picMain.Picture = LoadPicture("VANGOGH.BMP")
PictureBox 控件具有 AutoSize 屬性,當該屬性設置為 True 時,PictureBox 能自動調整大小與顯示的圖片匹配。如果要用 AutoSize 屬性設置為 True 的 PictureBox ,設計窗體時就需要特別小心。圖片將不考慮窗體上的其它控件而調整大小,這可能導致意想不到的后果,如覆蓋其它控件。設計時應通過加載每一幅圖片來檢查是否有這種現象發生。
vc picture控件的分類進行拉總結,
(一) 非動態顯示圖片(即圖片先通過資源管理器載入,有一個固定ID)
(二) 動態載入圖片(即只需要在程序中指定圖片的路徑即可載入)
為方便說明,我們已經建好一個基於對話框的工程,名為Ttest.
對話框類為CTestDlg
(一) vc picture控件非動態載入圖片.
方法1.先從最簡單的開始,用picture 控件來實現.
步驟:
先在資源里Import一張圖片,ID為IDB_BITMAP2
然后在對話框上添加一個picture控件,右鍵點擊打開屬性,
將type下拉框選擇BITMAP,緊跟着下面就出現一個Image下拉框,
拉開就會看到所有已經載入好的圖片,
選擇你要的圖片.運行程序即可看到.
方法2vc picture控件.通過背景圖
同樣如上,先載入一張圖片,ID為IDB_BITMAP2
TestDlg.h中
CBrush m_brBk;//在public中定義
TestDlg.cpp中
在初始化函數OnInitDialog()中加入:
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP2);
m_brBk.CreatePatternBrush(&bmp);
bmp.DeleteObject();
return TRUE; // return TRUE unless you set the focus to a control
}
在打開類向導,找到WM_CTLCOLOR消息,重載得對應函數OnCtlColor(),添加如下:
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd == this)
{
return m_brBk;
}
return hbr;
}
From:http://blog.china.com/u/100306/372913/201003/5956650.html
基於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));
}