📄 maindlg.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 + -