⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maindlg.h

📁 Window Mobile Capture with DirectDraw
💻 H
字号:
// MainDlg.h : interface of the CMainDlg class
//
/////////////////////////////////////////////////////////////////////////////

#pragma once
#include "Camera.h"
#include "color.h"
#include "Log.h"

class CMainDlg : public CDialogImpl<CMainDlg>, public CMediaSampleCallback
{
	CEdit		m_edCamera;
	CCamera		m_camera;
	CLog		m_log;

public:
	enum { IDD = IDD_MAINDLG };

	BEGIN_MSG_MAP(CMainDlg)
		MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
		MESSAGE_HANDLER(WM_PAINT, OnPaint)
		COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
		COMMAND_ID_HANDLER(IDOK, OnOK)
		COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
		COMMAND_HANDLER(BTN_STOP, BN_CLICKED, OnBnClickedStop)
		COMMAND_HANDLER(BTN_SHOT, BN_CLICKED, OnBnClickedShot)
	END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
//	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

	LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		static long seq = 0;
		::DefWindowProc(m_hWnd, WM_PAINT,wParam,0);
		LogMessage(L"seq", seq++);
		return 0;
	}

	LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		// center the dialog on the screen
		CenterWindow();

		// set icons
		HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
			IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
		SetIcon(hIcon, TRUE);
		HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
			IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
		SetIcon(hIconSmall, FALSE);

		m_edCamera = GetDlgItem(EDT_CAM);
		SetForegroundWindow(m_hWnd);

		m_log.OpenFile(L"\\My Documents\\log.txt");

		m_camera.SetForwardCallback(this);
		LogMessage(L"Camera", m_camera.GetCameraName());

		m_camera.Render();
		m_camera.RenderAsFile(L"\\My Documents\\test.asf");
		return TRUE;
	}

	void LogMessage(LPCWSTR szMember, LPCWSTR szMessage)
	{
		CString strMsg;
		strMsg.Format(L"[%s]: %s\r\n",szMember, szMessage);
		LogMessage(strMsg);
	}

	void LogMessage(LPCWSTR szMember, long lMessage)
	{
		CString strMsg;
		strMsg.Format(L"[%s]: %d\r\n", szMember, lMessage);
		LogMessage(strMsg);
	}

	void LogMessage(LPCWSTR szMessage)
	{
#if 0
		CString strMsg;
		m_edCamera.GetWindowText(strMsg);
		strMsg = strMsg + szMessage;
		m_edCamera.SetWindowText(strMsg);
#else
		m_log.LogMessage(szMessage);
#endif
	}

	LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		CSimpleDialog<IDD_ABOUTBOX, FALSE> dlg;
		dlg.DoModal();
		return 0;
	}

	LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		// TODO: Add validation code 
		HRESULT hr = S_OK;

		m_camera.SetOwner((OAHWND)m_hWnd);

		HWND hwnd = FindWindow(NULL, L"VCAM");
		LogMessage(L"HWND Caption", (long)hwnd);

		hr = m_camera.Run(m_hWnd);

		long left, top, width, height;
		m_camera.GetSourcePosition(&left, &top, &width, &height);
		LogMessage(L"width", width); 
		LogMessage(L"height", height); 
		return 0;
	}

	HRESULT OnMediaSampleShoot( BitmapSample &sample )
	{
#if 0
		BitmapSample rgb_sample;
		sample.Convert2RGB24(rgb_sample);
		rgb_sample.SaveBitmap(L".\\My Documents\\still.bmp");
#endif
		return S_OK;
	}

	HRESULT OnDoRenderSample( BitmapSample &sample )
	{
		BitmapSample rgb_sample;
		sample.Convert2RGB24(rgb_sample);

		PBITMAPINFO pBitmap = NULL;
		rgb_sample.GetBitmapInfo(&pBitmap);		
		int ret = ShowBitmap(GetWindowDC(), pBitmap, rgb_sample.pBuffer, 50, 0);
		delete (BYTE*)pBitmap;
		//rgb_sample.SaveBitmap();
		return S_OK;
	}

	LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		EndDialog(wID);
		return 0;
	}

	LRESULT OnBnClickedStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		m_camera.Stop();
		return 0;
	}

	LRESULT OnBnClickedShot(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		static int idx = 1;
		CString strFileName;
		strFileName.Format(L"\\My Documents\\test%d.jpg", idx++);
		HRESULT hr = m_camera.ShotStillImage(strFileName);
		ATLASSERT(SUCCEEDED(hr));
		SaveWindowPicToFile(m_hWnd);
		return 0;
	}

	int ShowBitmap(HDC hDC, PBITMAPINFO pBitmap, BYTE *imgData, int x, int y)
	{
		ATLASSERT(hDC);
		ATLASSERT(pBitmap);

		int ret = 0;
		if (pBitmap)
		{
			long width = pBitmap->bmiHeader.biWidth;
			long height = pBitmap->bmiHeader.biHeight;
			ret = SetDIBitsToDevice(hDC, x, y, width, height, 0, 0,	0, height, imgData, pBitmap, 0);
		}
		return ret;
	}

public:
	void SaveWindowPicToFile(HWND hWnd)
	{
		ATLASSERT(::IsWindow(hWnd));
		if (hWnd == NULL)
			return;

		CRect rcDesktop(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN));

		CRect rcCaptured;
		::GetWindowRect(hWnd,&rcCaptured);

		CRect rcCaptureRegion;
		rcCaptureRegion.IntersectRect(rcDesktop,rcCaptured);

		HDC hCapturedDC = ::GetWindowDC(hWnd);
		HDC hMemDC = ::CreateCompatibleDC(hCapturedDC);
		HBITMAP hCapturedBitmap = ::CreateCompatibleBitmap(hCapturedDC,rcCaptureRegion.Width(),rcCaptureRegion.Height());
		::SelectObject(hMemDC,hCapturedBitmap);

		::BitBlt(hMemDC,0,0,rcCaptureRegion.Width(),rcCaptureRegion.Height(),hCapturedDC,
			rcCaptureRegion.left-rcCaptured.left,rcCaptureRegion.top-rcCaptured.top,SRCCOPY);

		// save hCapturedBitmap		
		::BitBlt(hCapturedDC,0,0,50,50,hMemDC,
			50,60,SRCCOPY);
	}
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -