MFC 以影象大小開啟並顯示影象,滑鼠左擊顯示畫素座標
阿新 • • 發佈:2019-02-02
一、建立MFC對話方塊,類名CDialogDlg,新增按鈕IDC_BUTTON1,OnBnClickedButton1()函式如下:
CShow *dlg;
dlg = new CShow;
dlg->Create(IDD_SHOW_DLG); //建立非模態對話方塊
dlg->ShowWindow(SW_SHOW); //顯示對話方塊
新增兩個編輯框IDC_EDIT1、IDC_EDIT2。
二、資源視圖裡新增一個DIALOG對話方塊併為其新增一個類,類名為CShow。
新增一個PICTURE控制元件IDC_SHOWPIC。
在Show.h內新增public成員:
CImage image;
重寫OnInitDialog()函式,如下:
// TODO: 在此新增額外的初始化 CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, _T("Image files(*.png; *.jpg)|*.png;*.jpg|All files(*.*)|*.*||"), NULL); dlg.m_ofn.lpstrTitle = _T("Open Image"); if( dlg.DoModal() != IDOK ) return FALSE; CString Filepath = dlg.GetPathName();//開啟並選擇影象,獲得選擇影象的路徑 image.Load(Filepath);//載入圖片 CRect rect1(0,0,image.GetWidth(),image.GetHeight()); CRect rect2,rect3; this->GetWindowRect(&rect2); ScreenToClient(&rect2); this->GetClientRect(&rect3); rect1.left=rect2.left-rect3.left; rect1.top=rect2.top-rect3.top; rect1.right=rect2.right-rect3.right+rect1.right; rect1.bottom=rect2.bottom-rect3.bottom+rect1.bottom;//獲得非客戶區的大小 //設定視窗大小(非客戶區大小加上影象大小)和位置 SetWindowPos(NULL,0,0,rect1.Width(),rect1.Height(),SWP_NOZORDER|SWP_NOMOVE); CenterWindow();//視窗居中 GetDlgItem(IDC_SHOWPIC)->MoveWindow(0,0,image.GetWidth(),image.GetHeight());//以影象大小設定picture控制元件大小
新增WM_PAINT訊息,OnPaint()函式如下:
CRect rect2;
GetDlgItem(IDC_SHOWPIC)->GetClientRect(&rect2);//獲得picture控制元件的位置資訊
CDC *pDc = GetDlgItem(IDC_SHOWPIC)->GetDC();//獲得pictrue控制元件的Dc
image.Draw(pDc->m_hDC,rect2);//把image畫到picture控制元件上
ReleaseDC(pDc);//釋放Dc
新增WM_LBUTTONDOWN訊息,OnLButtonDown(UINT nFlags, CPoint point)函式如下:
CRect rect; GetDlgItem(IDC_SHOWPIC)->GetClientRect(rect);//獲取Picture控制元件的位置資訊,存入rect中 if (rect.PtInRect(point))//判斷point是否在rect內部 { CDialogDlg *parent = (CDialogDlg*)GetParent();//獲得父視窗指標 parent->SetDlgItemInt(IDC_EDIT1,point.x); parent->SetDlgItemInt(IDC_EDIT2,point.y);//在編輯框顯示滑鼠位置資訊 }