1. 程式人生 > >【MFC】一個簡單的截圖工具原始碼

【MFC】一個簡單的截圖工具原始碼

 一個簡單的截圖工具原始碼,供初學者參考學習
OnInitDialog()
{
	// 在此新增額外的初始化程式碼
	IsDownBtn=0;  
	complete=0;  
	int w=GetSystemMetrics(SM_CXSCREEN);  
	int h=GetSystemMetrics(SM_CYSCREEN);  
	SetWindowPos(&wndTopMost,0,0,w,h,SWP_SHOWWINDOW);  
	SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);  
	HINSTANCE hInst = LoadLibrary(L"User32.DLL");  
	if(hInst)  
	{  
		typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);   
		MYFUNC fun = NULL;  
		//取得SetLayeredWindowAttributes函式指標    
		fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");  
		if(fun)
			fun(this->GetSafeHwnd(),0,100,2);   
		FreeLibrary(hInst);  
	}

}
//截圖,新增一個按鈕
void CphotoDlg::OnBnClickedButton()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	try
	{
	if(complete)
	{ 
		CImage *m_Image;
		CRect r=rr;  
		ClientToScreen(&r);  
		CFileDialog d(false,L"jpg(*.jpg)|*.jpg",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,L"jpg(*.jpg)|*.jpg||",this);  
		if(d.DoModal()==IDOK)
		{  
			Sleep(100);  
			//RedrawWindow(0,0,RDW_INTERNALPAINT| RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);  
			ShowWindow(0);  
			CDC dc;  
			dc.CreateDC(L"DISPLAY",NULL,NULL,NULL);  
			ClientToScreen(&r);  
			CDC dc1;  
			dc1.CreateCompatibleDC(&dc);  
			CBitmap b;  
			b.CreateCompatibleBitmap(&dc,r.Width(),r.Height());  
			CBitmap *old=(CBitmap*)dc1.SelectObject(&b);  
			dc1.BitBlt(0,0,r.Width(),r.Height(),&dc,r.left,r.top,SRCCOPY|0x40000000);  
			ShowWindow(1);  
			dc1.SelectObject(old); 
			dc.DeleteDC(); 	

			m_Image = (CImage*)CBitmap::FromHandle((HBITMAP)b.m_hObject);
			HRESULT hResult;
			// 影象儲存
			hResult = m_Image->Save(d.GetPathName());
		 
			if (FAILED(hResult)) 
				MessageBox(L"儲存影象檔案失敗!");
			else
			    AfxMessageBox(L"儲存完成");  
		}  

	}
	}
	catch(_com_error e)
	{
		AfxMessageBox(L"儲存失敗");
	}


	
}

void CphotoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值
	
    IsDownBtn=TRUE; 
	Sleep(1500);
	complete=0;   
	ppp=point;  
	CDialog::OnLButtonDown(nFlags, point);
}
//滑鼠移動處理
void CphotoDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值
	if(IsDownBtn)
	{  
		CRect r(ppp,point);  
		//RedrawWindow(0,0,RDW_INTERNALPAINT|   RDW_INVALIDATE   |   RDW_UPDATENOW   |   RDW_ERASE);  

		CDC *dc=GetDC();  
		dc->MoveTo(r.left,r.top);  
		dc->LineTo(r.right,r.top);  
		dc->LineTo(r.right,r.bottom);  
		dc->LineTo(r.left,r.bottom);  
		dc->LineTo(r.left,r.top);  
		dc->DeleteDC();  
		rr=r;  
	}  

	CDialog::OnMouseMove(nFlags, point);
}

void CphotoDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值
	if(IsDownBtn)
	{  
		complete=1;  
		IsDownBtn=FALSE;  
		
	}

	CDialog::OnLButtonUp(nFlags, point);
}