1. 程式人生 > >MFC 以影象大小開啟並顯示影象,滑鼠左擊顯示畫素座標

MFC 以影象大小開啟並顯示影象,滑鼠左擊顯示畫素座標

一、建立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);//在編輯框顯示滑鼠位置資訊
	}