1. 程式人生 > >利用MFC擷取對話方塊影象或者擷取全屏影象

利用MFC擷取對話方塊影象或者擷取全屏影象

可能用到的庫:

#include <afxwin.h>
#include <windows.h>
在下面的程式裡,我構造一個CDialog對話方塊,點選它的OK按鈕之後,程式進行擷取儲存工作。全屏影象儲存到test2.bmp檔案裡。而對話方塊影象儲存在test.bmp中(註釋掉的部分)。
程式碼:
void CScreenShotDlg::OnBnClickedOk()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	//CClientDC dc(this);//只截對話方塊,用這句
	HWND hwnd = ::GetDesktopWindow();//截整個螢幕,用從這往下4句
	HDC hdc = ::GetDC(hwnd);
	CDC dc;
	dc.Attach(hdc);
	CRect rc;
	//GetClientRect(&rc);//只截對話方塊,用這句
	rc.SetRect(0,0, GetSystemMetrics(   SM_CXSCREEN   ), GetSystemMetrics(   SM_CYSCREEN   ));//截整個螢幕,用這句
	int iBitPerPixel = dc.GetDeviceCaps(BITSPIXEL);
	int iWidth = rc.Width();
	int iHeight = rc.Height();
	CDC memDC;
	memDC.CreateCompatibleDC(&dc);

	CBitmap memBitmap, *oldBitmap;

	memBitmap.CreateCompatibleBitmap(&dc, iWidth, iHeight);
	oldBitmap = memDC.SelectObject(&memBitmap);

	memDC.BitBlt(0,0,iWidth, iHeight, &dc, 0,0,SRCCOPY);

	BITMAP bmp;
	memBitmap.GetBitmap(&bmp);

	FILE *fp = fopen("test2.bmp", "wb");
	BITMAPINFOHEADER bih;
	memset(&bih, 0, sizeof(bih));
	bih.biBitCount = bmp.bmBitsPixel;
	bih.biCompression = BI_RGB;//表示不壓縮
	bih.biHeight = bmp.bmHeight;
	bih.biPlanes = 1;//位平面數,必須為1
	bih.biSize = sizeof(BITMAPINFOHEADER);
	bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;
	bih.biWidth = bmp.bmWidth;
	BITMAPFILEHEADER bfh;
	memset(&bfh, 0, sizeof(bfh));
	bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

	bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;
	bfh.bfType = (WORD)0x4d42;//必須表示"BM"

	fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);
	fwrite(&bih, 1, sizeof(bih), fp);

	byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];
	GetDIBits(memDC.m_hDC, (HBITMAP)memBitmap.m_hObject, 0, iHeight, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);
	fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);
	delete [] p;

	fclose(fp);

	memDC.SelectObject(oldBitmap);
}

效果:

全屏擷取:


只擷取對話方塊:


相關推薦

利用MFC擷取對話方塊影象或者擷取影象

可能用到的庫: #include <afxwin.h> #include <windows.h> 在下面的程式裡,我構造一個CDialog對話方塊,點選它的OK按鈕之後,程式進行擷取儲存工作。全屏影象儲存到test2.bmp檔案裡。而對話方塊影象儲

MFC擷取對話方塊指定位置的點陣圖

    //儲存點陣圖     CDC *pDC =  getDC();     CDC memDC;                    // 建立並繫結繪畫DC和Bitmap     CBitmap bitmap;     memDC.CreateCompatible

直接在MFC對話方塊利用OpenGL繪製圖形

    而我的這篇文章是沒有使用WM_TIMER訊息在MFC對話方塊中使用OpenGL,從而揭示了一個困擾我很久的問題,而這個問題其實本身與MFC自身相關的,上傳的程式可以在如下的連結下載:http://download.csdn.net/detail/hurricane

MFC對話方塊呼叫主對話方塊的變數和函式

1、在子對話方塊中定義主對話方塊的物件指標: CSensorSysDlg *parent = (CSensorSysDlg*)GetParent();//CSensorSysDlg是主對話方塊對應的類 2、呼叫 //呼叫變數 parent->i;//i是主對話方塊內int型別的

MFC修改對話方塊的標題以及圖示

一、對話方塊標題欄內容為靜態 直接在對話方塊屬性“General”的“Caption”中修改。 二、對話方塊標題欄內容為動態生成的 在對應對話方塊的初始化函式OnInitDialog()中新增以下程式碼: CString title; title.Format("%d",Id

VC/MFC對話方塊中建立檢視並在檢視區新增ListCtrl控制元件

自定義的view類用於顯示在對話方塊上 class CGroupMenuView : public CScrollView { protected:  CGroupMenuView(); ……………… ………… };   class CWorkView :

MFC對話方塊新增圖片背景

在windows開發當中做介面的主要技術之一就是使用MFC,通常我們看到的QQ,360,暴風影音這些漂亮的介面都可以用MFC來實現。今天我們來說一下如何用MFC美化對話方塊,預設情況下,對話方塊的背景如下: 那麼,我們如何將它的背景變成如下介面呢,而且還要保留對話方塊的移動功能,漂亮背

MFC對話方塊資源的複製

在工程中匯入已建好的對話方塊,方法有三: 法一: 1、首先要生成一個*.ogx的檔案。    方法:開啟包含有所要加的對話方塊資源的工程(別的工程)。          在檢視資源(ClassView)中滑鼠右鍵點選所需的對話方塊的類(也可以是所需的類)      

MFC(3):對話方塊建立基礎知識

  模態對話方塊:建立後不能對其他視窗進行操作 非模態對話方塊:建立後仍可以對其他視窗進行操作 新建專案-->MFC應用程式-->基於對話方塊、MFC標準-->完成 預設生成的類有:應用程式類、對話方塊類 誤操作關閉對話方塊的解決辦法:解決方案管理器-->點

mfc基於對話方塊的簡單四則運算計算器

1.①建立mfc對話方塊視窗,對話方塊中所有控制元件都delete。    ②繪製介面,按鍵都button,顯示區域edit control,計算器名字用static text。    ③所有控制元件ID改成語義化ID(可不改),如數字1 IDC_BUTTON_NU

MFC-10】VS2010/MFC基於對話方塊程式的登入視窗實現

一、開發環境 1、VS2010; 2、C++ / MFC; 二、登入視窗設計示例 1、新建基於對話方塊的MFC專案,命名為“UserLogin”; 2、資源檢視中插入一個Dialog,修改ID為:IDD_LOGIN_DIALOG,標題修改為登入對話方塊,並新增控制元

MFC對話方塊最小化到托盤,托盤點選還原主對話方塊

1.將主對話方塊資源屬性Minimize Box設定為true,這個屬性顯示對話方塊的最小化按鈕。 2.最小化到托盤。 (1)首先要了解,你工作列右下角的托盤都是圖示,所以最小化到托盤建議新增一個Icon資源。 (2)到托盤的函式需要自己重構。 先巨集定義 #define

MFC對話方塊中怎樣加入背景音樂

第一步:新增標頭檔案與庫檔案 #include "vfw.h"#pragma comment (lib,"vfw32.lib")第二步:在對話方塊類加上變數HWND hMCI;第三步:在對話方塊初始話的地方如此hMCI = MCIWndCreate(NULL, NULL,WS

MFC對話方塊新增背景圖片(非picture control控制元件)

本文在這裡希望把這個東西的設計說的詳細一些。 在建立一個MFC的對話方塊專案後,可以在資源檢視中新增點陣圖,如不理解可以在百度中搜索mfc新增點陣圖,相信應該很多,這裡就不解釋了。 假設我們載入的點陣圖ID為IDB_BITMAP1 在我們對話方塊的類中的標頭檔案新增如下變

六,關閉視窗X的控制,MFC 禁止對話方塊關閉按鈕和Alt+F4

使得選單項無效,以便它不能被選擇,但不變灰使得選單項有效,以便它能夠被選擇,並可從變灰的狀態中恢復出來 獲取視窗選單:       CMenu *pSysMenu = GetSystemMenu(FALSE);      ASSERT(pSysMenu != NULL);使關

MFC---之對話方塊滾動條的使用

  (1)    SetScrollRange BOOL SetScrollRange(   __in  HWND hWnd,   __in  int nBar,   __in  int nMinPos,   __in  int nMaxPos,   __in  BOOL

MFC對話方塊獲得tab control子對話方塊控制元件的值

1.建立兩個對話方塊程式,用來當做Tab Control控制元件的兩個頁。別忘了把Style改為Child,Border改為None。然後就可以在上面加其他控制元件了。 接著分別為這兩個對話方塊建立兩個類,比如CPage1和CPage2。 然後在對話方塊類標頭檔案中,加入這

MFC設定對話方塊背景和邊框顏色

 對於對話方塊,只需要過載預設的訊息處理函式就行了: // 過載預設的訊息處理函式,主要處理WM_MOVE WM_PAINT WM_NCPAINT WM_NCACTIVATE WM_NOTIFY這// 幾個訊息就可以了 LRESULT CMyDialog::DefWi

MFC對話方塊中使用OpenGL繪圖

接寫來我將分享一點我的實現: 1、首先當然要設定好OpenGL的程式設計環境; 2、新建一個基於對話方塊的工程,我選擇VS studio平臺; 3、選著Project->add->class,新增一個新類,取名為MyOpenGL,選著基類為CWnd 4利用VS的類嚮導給MyOpenGL新增OnC

mfc 關閉對話方塊的各種訊息與方法

//http://my.csdn.net/crystal521 以下是對話方塊關閉時傳送的不同訊息:    1)點選OK按鈕:OnOk-WM_DESTROY   2) 點選Cancel按鈕:OnCancel-WM_DESTROY   3) 點選×按鈕:WM_CLOSE-