【MFC】一個簡單的截圖工具原始碼
阿新 • • 發佈:2019-02-06
一個簡單的截圖工具原始碼,供初學者參考學習
}
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); }