www.pudn.com > 数字硬盘录像机软件代码.rar > CAPTOMEM.CPP


void CMainFrame::OnViewCaptomem()  
{ 
	// TODO: Add your command handler code here 
	GetClientRect(&DisplayRect); 
	BITMAPINFO BMIInfo; 
	BMIInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
	BMIInfo.bmiHeader.biWidth = DisplayRect.Width(); 
	BMIInfo.bmiHeader.biHeight = DisplayRect.Height(); 
	BMIInfo.bmiHeader.biPlanes = 1; 
	BMIInfo.bmiHeader.biBitCount = 24; 
	BMIInfo.bmiHeader.biCompression = BI_RGB; 
	BMIInfo.bmiHeader.biSizeImage = 0; 
	BMIInfo.bmiHeader.biXPelsPerMeter = 0; 
	BMIInfo.bmiHeader.biYPelsPerMeter = 0; 
	BMIInfo.bmiHeader.biClrUsed = 0; 
	BMIInfo.bmiHeader.biClrImportant = 0; 
 
	HGLOBAL hDIB; 
	DWORD dwSize = (long)DisplayRect.Width() *  
				   (long)DisplayRect.Height()*3L; 
	hDIB = GlobalAlloc(GHND, dwSize); 
	if( hDIB ){ 
		char* lpvBits = (char *)GlobalLock(hDIB); 
		CDC* pScrnDC = GetDC(); 
		HANDLE vxdHandle = LoadDevice(); 
		DWORD dwPage; 
		DWORD PhysMemAddr; 
		DWORD MemHandle; 
		DWORD LineAddr; 
		StaticMemAlloc(&dwPage, &PhysMemAddr, &MemHandle, &LineAddr); 
		char *lpSourceBuf = (char *)LineAddr; 
		int nSum = 23; 
		CG200CaptureToMem(hcg200, PhysMemAddr, dwPage*4*1024, 2 ,FRAME, nSum); 
 
		for(int k = 0; ; ++k){	 
			CG200ReadFromMem( hcg200, lpSourceBuf, dwPage*4*1024, k, lpvBits); 
			 
			pScrnDC->SetStretchBltMode(COLORONCOLOR); 
			SetDIBitsToDevice( (HDC)*pScrnDC, 
								DisplayRect.left, DisplayRect.top, 
								DisplayRect.Width(), DisplayRect.Height(), 
								DisplayRect.left, DisplayRect.top, 
								0, DisplayRect.Height(), lpvBits, 
								&BMIInfo, DIB_RGB_COLORS); 
			if(k > 21) 
		    	k = -1;  
 
			MSG	lpMsg; 
		    PeekMessage(&lpMsg,NULL,0,0,PM_REMOVE); 
			if( (GetKeyState(VK_ESCAPE) &0x80) == 0x80 || 
				(GetKeyState(VK_LBUTTON)&0x80) == 0x80 || 
				(GetKeyState(VK_RBUTTON)&0x80) == 0x80 ) 
				break;  
		} 
 
	//	bRet = PhysMemFree(vxdHandle, MemAlloc.Handle); 
		ReleaseDC(pScrnDC); 
		GlobalUnlock(hDIB); 
		GlobalFree(hDIB); 
		CloseDevice(vxdHandle); 
	} 
}