WindowProc()

WindowProc()函数

Windows程序最主要的两个函数除了WinMain()函数外还有一个叫消息处理函数即
WindowProc()函数 ,它的作用是等候事件发生的消息,具体说就是:什么键按下了?
或定时器的消息是否发生了?然后再决定去执行哪个程序块。 

              WindowProc()函数
WindowProc()函数的基本形式(即原型prototype)是:

LRESULT CALLBACK WindowProc ( HWND hWnd, UINT message,
                                WPARAM wParam, LParam);


返回类型是LRESULT,是由Windows所定义的数据类型,通常相当于 long 型。
因为此函数被Windows调用是通过指针进行的(你在WinMain()中的WNDCLASSEX结构设定
的指针),你必须证实函数为CALLBACK. 这是另一个由Windows所定义的说明符,它决定
了函数的参数如何处理。4个参数的传递提供了引起函数被调用的具体消息的情况。每个
参数的意义如下:
HWND hWnd : 事件引起消息发生的那个窗口。
UINT message: 消息的ID,它是32位值,指明了消息类型。
WPARAM wParam : 32位值,包含附加信息,决定于消息的种类。例如键盘的哪个键代码。
LPARAM lParam: 32位值,同上。例如,前16位=重复数
                                      接着8位:扫描码(决定于厂家)
                                      第24位:为1时表示扩展键。
                                      第25到28位:保留区
                                      第29位为1时=alt按下,否则为0。
                                      第30位为1时=消息前按下,否则为0。
                                      第31位为1时=正在被释放,否则为0。

当用户按下一个键时。那是什么键,由这最后两个变量来说明。
消息的符号常数以WM_开头,例如WM_PAINT,相应于要求窗口的用户区部分重绘。又如
WM_LBUTTONDOWN表示鼠标左键被按下。可参考MSDN Library.
除了上述函数原型之外,还有Windows消息解码用的switch语句,其中又有case语句,
绘制窗口消息的响应及其结束,关闭应用程序等处理过程。这样才构成完整的WindowProc()
函数。
总之,在使用Windows API来编制Windows程序时必须了解上述的术语内容。可以通过这部分
的内容来深入了解Windows编程的本来面目。
实际上,在用MFC来编程和用Windows Forms来编程时情况就简单得多了。这两种情况没有上述那么多麻烦的术语。
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的Windows应用程序示例,可以使用UVC相机进行拍照和录像: ```c++ #include <Windows.h> #include <dshow.h> #pragma comment(lib, "strmiids.lib") // UVC相机操作类 class UvcCamera { public: UvcCamera() : m_pGraph(nullptr), m_pCapture(nullptr), m_pControl(nullptr), m_pStill(nullptr), m_pBuilder(nullptr), m_pSampleGrabber(nullptr), m_pCallback(nullptr), m_hWnd(nullptr), m_bPreviewing(false) {} ~UvcCamera() { if (m_bPreviewing) { StopPreview(); } if (m_pCallback) { m_pCallback->Release(); m_pCallback = nullptr; } if (m_pSampleGrabber) { m_pSampleGrabber->Release(); m_pSampleGrabber = nullptr; } if (m_pBuilder) { m_pBuilder->Release(); m_pBuilder = nullptr; } if (m_pStill) { m_pStill->Release(); m_pStill = nullptr; } if (m_pControl) { m_pControl->Release(); m_pControl = nullptr; } if (m_pCapture) { m_pCapture->Release(); m_pCapture = nullptr; } if (m_pGraph) { m_pGraph->Release(); m_pGraph = nullptr; } } // 初始化UVC相机 bool Init(HWND hWnd) { HRESULT hr = CoCreateInstance(CLSID_FilterGraph, nullptr, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&m_pGraph); if (FAILED(hr)) { return false; } hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, nullptr, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&m_pBuilder); if (FAILED(hr)) { return false; } hr = m_pBuilder->SetFiltergraph(m_pGraph); if (FAILED(hr)) { return false; } hr = CoCreateInstance(CLSID_SampleGrabber, nullptr, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&m_pSampleGrabber); if (FAILED(hr)) { return false; } hr = m_pGraph->AddFilter(m_pSampleGrabber, L"Sample Grabber"); if (FAILED(hr)) { return false; } hr = m_pBuilder->FindInterface(&PIN_CATEGORY_STILL, &MEDIATYPE_Video, m_pCapture, IID_IAMStreamConfig, (void**)&m_pStill); if (FAILED(hr)) { return false; } hr = m_pBuilder->FindInterface(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, m_pCapture, IID_IAMVideoControl, (void**)&m_pControl); if (FAILED(hr)) { return false; } hr = m_pGraph->QueryInterface(IID_IMediaControl, (void**)&m_pMediaControl); if (FAILED(hr)) { return false; } hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void**)&m_pMediaEvent); if (FAILED(hr)) { return false; } hr = m_pSampleGrabber->QueryInterface(IID_ISampleGrabber, (void**)&m_pGrabber); if (FAILED(hr)) { return false; } hr = m_pGrabber->SetCallback(this, 1); if (FAILED(hr)) { return false; } m_hWnd = hWnd; m_bPreviewing = false; return true; } // 开始预览 bool StartPreview() { HRESULT hr = CoCreateInstance(CLSID_VideoCapture, nullptr, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&m_pCapture); if (FAILED(hr)) { return false; } hr = m_pGraph->AddFilter(m_pCapture, L"UVC Camera"); if (FAILED(hr)) { return false; } hr = m_pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, m_pCapture, m_pSampleGrabber, nullptr); if (FAILED(hr)) { return false; } hr = m_pMediaControl->Run(); if (FAILED(hr)) { return false; } m_bPreviewing = true; return true; } // 停止预览 bool StopPreview() { HRESULT hr = m_pMediaControl->Stop(); if (FAILED(hr)) { return false; } hr = m_pGraph->RemoveFilter(m_pCapture); if (FAILED(hr)) { return false; } hr = m_pGraph->RemoveFilter(m_pSampleGrabber); if (FAILED(hr)) { return false; } m_pCapture->Release(); m_pCapture = nullptr; m_bPreviewing = false; return true; } // 拍照 bool CaptureImage(const wchar_t* szFileName) { AM_MEDIA_TYPE mt; ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE)); HRESULT hr = m_pStill->GetFormat(&mt); if (FAILED(hr)) { return false; } hr = m_pStill->SetFormat(&mt); if (FAILED(hr)) { return false; } hr = m_pMediaControl->Stop(); if (FAILED(hr)) { return false; } hr = m_pBuilder->RenderStream(&PIN_CATEGORY_STILL, &MEDIATYPE_Video, m_pCapture, m_pSampleGrabber, nullptr); if (FAILED(hr)) { return false; } hr = m_pMediaControl->Run(); if (FAILED(hr)) { return false; } long evCode; hr = m_pMediaEvent->WaitForCompletion(INFINITE, &evCode); hr = m_pGrabber->GetCurrentBuffer(&mt.cbFormat, (BYTE*)mt.pbFormat); if (FAILED(hr)) { return false; } BITMAPINFOHEADER& bmih = *(BITMAPINFOHEADER*)mt.pbFormat; BYTE* pData = nullptr; hr = m_pGrabber->GetCurrentBuffer(&mt.cbBuffer, (BYTE**)&pData); if (FAILED(hr)) { return false; } BITMAPFILEHEADER bmfh; ZeroMemory(&bmfh, sizeof(BITMAPFILEHEADER)); bmfh.bfType = 'MB'; bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + mt.cbBuffer; bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); HANDLE hFile = CreateFile(szFileName, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile == INVALID_HANDLE_VALUE) { return false; } DWORD dwBytesWritten; WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwBytesWritten, nullptr); WriteFile(hFile, &bmih, sizeof(BITMAPINFOHEADER), &dwBytesWritten, nullptr); WriteFile(hFile, pData, mt.cbBuffer, &dwBytesWritten, nullptr); CloseHandle(hFile); return true; } private: IGraphBuilder* m_pGraph; // 图形构建器 ICaptureGraphBuilder2* m_pBuilder; // 捕获图形构建器 IBaseFilter* m_pCapture; // 捕获过滤器 IAMStreamConfig* m_pStill; // 静态图像流配置器 IAMVideoControl* m_pControl; // 视频控制器 IMediaControl* m_pMediaControl; // 媒体控制器 IMediaEvent* m_pMediaEvent; // 媒体事件 ISampleGrabber* m_pSampleGrabber; // 采样抓取器 ISampleGrabberCB* m_pCallback; // 采样抓取回调函数 HWND m_hWnd; // 窗口句柄 bool m_bPreviewing; // 是否正在预览 }; // 采样抓取回调函数 class SampleGrabberCallback : public ISampleGrabberCB { public: SampleGrabberCallback() : m_pWnd(nullptr), m_pUvcCamera(nullptr) {} void SetWindowHandle(HWND hWnd) { m_pWnd = hWnd; } void SetUvcCamera(UvcCamera* pUvcCamera) { m_pUvcCamera = pUvcCamera; } STDMETHODIMP QueryInterface(REFIID riid, void** ppv) { if (riid == IID_ISampleGrabberCB) { *ppv = (void*)this; return S_OK; } return E_NOINTERFACE; } STDMETHODIMP_(ULONG) AddRef() { return 2; } STDMETHODIMP_(ULONG) Release() { return 1; } STDMETHODIMP SampleCB(double dSampleTime, IMediaSample* pSample) { return S_OK; } STDMETHODIMP BufferCB(double dSampleTime, BYTE* pBuffer, long lBufferSize) { if (m_pWnd) { HDC hDC = GetDC(m_pWnd); BITMAPINFOHEADER bmih; ZeroMemory(&bmih, sizeof(BITMAPINFOHEADER)); bmih.biSize = sizeof(BITMAPINFOHEADER); bmih.biWidth = 640; bmih.biHeight = 480; bmih.biPlanes = 1; bmih.biBitCount = 24; bmih.biCompression = BI_RGB; SetStretchBltMode(hDC, COLORONCOLOR); StretchDIBits(hDC, 0, 0, 640, 480, 0, 0, 640, 480, pBuffer, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, SRCCOPY); ReleaseDC(m_pWnd, hDC); } return S_OK; } private: HWND m_pWnd; // 窗口句柄 UvcCamera* m_pUvcCamera; // UVC相机操作类 }; // 应用程序窗口过程 LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static UvcCamera uvcCamera; static SampleGrabberCallback callback; switch (uMsg) { case WM_CREATE: if (!uvcCamera.Init(hWnd)) { MessageBox(hWnd, L"Failed to initialize UVC camera!", L"Error", MB_ICONERROR); return -1; } callback.SetWindowHandle(hWnd); callback.SetUvcCamera(&uvcCamera); uvcCamera.SetSampleGrabberCallback(&callback); if (!uvcCamera.StartPreview()) { MessageBox(hWnd, L"Failed to start preview!", L"Error", MB_ICONERROR); return -1; } break; case WM_PAINT: break; case WM_DESTROY: uvcCamera.StopPreview(); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } // WinMain函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; ZeroMemory(&wc, sizeof(wc)); wc.cbSize = sizeof(wc); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(nullptr, IDC_ARROW); wc.lpszClassName = L"UvcCamera"; if (!RegisterClassEx(&wc)) { MessageBox(nullptr, L"Failed to register window class!", L"Error", MB_ICONERROR); return -1; } HWND hWnd = CreateWindowEx(0, L"UvcCamera", L"Uvc Camera", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { MessageBox(nullptr, L"Failed to create window!", L"Error", MB_ICONERROR); return -1; } ShowWindow(hWnd, nCmdShow); MSG msg; while (GetMessage(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ``` 以上代码中,UvcCamera类是一个封装了UVC相机操作的类,主要实现了相机的初始化、预览、停止预览、拍照等功能。SampleGrabberCallback类是一个采样抓取回调函数,实现了当采样抓取完成时的回调函数,用来将采样数据显示到窗口中。WindowProc函数是应用程序窗口过程,主要用来处理窗口消息,包括初始化UVC相机、启动预览、停止预览、拍照等操作。WinMain函数是应用程序入口函数,主要是创建窗口并运行消息循环。 需要注意的是,在使用此示例代码之前,你需要安装DirectShow SDK并链接strmiids.lib库。示例代码中使用的是位图格式保存拍摄的照片,你可以根据需要修改保存格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值