登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

CapPicture.CPP  

2008-11-26 10:49:08|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/********************************************************************
*  CapPicture.c: 类的源码                                            *
*                                                                    *
*  Comments: 视频信号的采集、显示、存储和一些处理                    *
*                                                                    *
*  Functions:                                                        *
*  WinMain      - Application entry point                            *
*  MainWndProc  - 主要窗口程序                                *
*                                                                    *
*                                                                    *
********************************************************************/

/*********************  头文件  *********************/

#include // windows GUI and services
#include // 视频库
#include // common dialogs
#include "CapPicture.h" // resource header

/*********************  Prototypes  ***********************/

// 主要窗口程序
LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM );
// 选择捕捉程序驱动程序
LRESULT WINAPI SelCapDrvProc( HWND, UINT, WPARAM, LPARAM );
// 列举捕捉驱动
int EnumCapDrv();
// 在主窗口创建按钮
//int CreateWndButtons(); this doesnt work
// 右键弹出菜单句柄
VOID APIENTRY HandlePopupMenu(HWND, POINT);
// 视频程序线程(video thread procedure)
DWORD WINAPI videoThreadProc(LPVOID lParam);
/*******************  全程变量 ********************/

HANDLE ghInstance; // application instance
HWND hwndMain; // 主要窗口句柄(main window handle)
HWND hwndVideo; // 视频捕捉窗口句柄(video capture window)
HWND hwndSelCapDrvDlg; // 选择捕捉驱动对话句柄(Select the capture driver dialog)
HWND hwndSelCapDrvDlg_LBox; // 选择捕捉驱动对话列举框句柄(list box for select capture driver dialog)
HWND hwndExit; // 退出按钮(exit button)
HWND hwndMin; // 最小化按钮(minimize button)
HWND hwndHelp; // 帮助按钮(help button)
HWND hwndRecord; // 录像按钮(record button)
HANDLE hVideoThread; // 停止录取视频线程(thread to stop the hang when recording video)
HRGN hRegion1; // 窗口修正区域(region for window shaping)
CAPDRIVERCAPS CapDrvCaps; // 驱动性能(driver capabilities)
bool isRecordFileOpen = false; // 录像开始标记(flag set if record file is open)
char recordFile[260]; // 保持录像标记(file to hold recording)
bool isPicFileOpen = false; // flag set if snapshot file is open
char pictureFile[260]; // file to hold snapshot
bool isRecording = false; // 判断是否录像?(are we recording?)
bool threadEnd = false; // 判断视频线程是否终止?(should the video thread end?)
/********************************************************************
*                  *
*       CLASSES, ENUMS, & STRUCTS      *
*                   *
/********************************************************************/  
     
/********************************************************************
*  Function: int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int)    *
*                                                                    *
*  用途: 应用程序初始化                                              *
*                                                                    *
*  注释: 注册窗口类, 创建显示主要窗口, 进入消息循环                  *
*                                                                    *
*                                                                    *
********************************************************************/

int PASCAL WinMain( HINSTANCE hInstance,//HINSTANCE:实例的句柄(Handle to an instance)
    HINSTANCE hPrevInstance,
    LPSTR lpszCmdLine,
    int nCmdShow )
{
   WNDCLASS wc;//WNDCLASS结构包含了RegisterClass函数注册窗口类时的窗口类属性
   MSG msg;

   if( !hPrevInstance )//如果不是前实例
   {
      wc.lpszClassName = "GenericAppClass";
      wc.lpfnWndProc = MainWndProc;//函数名代表首地址,指定一个回调函数
      wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
      wc.hInstance = hInstance;
      wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
      wc.hCursor = LoadCursor( NULL, IDC_ARROW );
      wc.hbrBackground = CreateSolidBrush (RGB(0, 64, 128));
      wc.lpszMenuName = "GenericAppMenu";

      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;

      RegisterClass( &wc );//注册窗口类
   }

   ghInstance = hInstance;

   hwndMain = CreateWindow( "GenericAppClass",//该函数创建一个重叠式窗口、弹出式窗口或子窗口。
      "视频捕获",
      WS_POPUP,
      0,
      0,
      500,
      500,
      NULL,
      NULL,
      hInstance,
      NULL
   );

   ShowWindow( hwndMain, nCmdShow );//显示窗口
  
   //将主要的窗户设定为区域(Set the main window to the region)
   SetWindowRgn(hwndMain,hRegion1,1);//注释掉此句的话,则显示矩形窗口,但是也同时显示一个圆角矩形

   while( GetMessage( &msg, NULL, 0, 0 ) ) {
      TranslateMessage( &msg );//该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出

      DispatchMessage( &msg );//该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数
   }

   return msg.wParam;
}

/********************************************************************
* Function: LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM) *
*                                                                    *
* 目的:应用程序的信息                                               *
*                                                                    *
* 注释: 下面的消息将被处理                                           *
*                                                                    *
*           WM_PAINT                                                 *
*           WM_CREATE                                                *
*           WM_DESTROY                                               *
*                                                                    *
*                                                                    *
********************************************************************/

LRESULT CALLBACK MainWndProc( HWND hwndMain, UINT msg, WPARAM wParam,
   LPARAM lParam )//这就表示此函数是一个回调函数。在MFC中,得到Message消息以后系统会进行回调,当然,我们需要编写一个回调函数来响应。为了区别于其它函数,在回调函数前加上LRESULT CALLBACK
{
   HDC hDC = GetDC(hwndMain);//该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图
   RECT rc;    // 客户区域(client area)            
   POINT pt;   // 鼠标点击位置(location of mouse click)   

   switch( msg ) {

/**************************************************************
*     WM_LBUTTONDBLCLK:                                        *
**************************************************************/

   case WM_LBUTTONDBLCLK: //微软WINDOWS窗口消息.表示左键双击事件,该消息可由Win32底层函数PeekMessage和GetMessage取得
        SetFocus(hwndMain);//此功能设置键盘焦点到指定的窗口。随后的所有键盘输入是针对此窗口。窗口,如果有的话,以前的键盘焦点失去它。
        break;
/**************************************************************
*     WM_LBUTTONDOWN:                                          *
**************************************************************/

      case WM_RBUTTONDOWN: //右键按下
            // Get the bounding rectangle of the client area.
 
            GetClientRect(hwndMain, (LPRECT) &rc); //该函数获取窗口客户区的坐标。
 
            // Get the client coordinates for the mouse click. 
 
            pt.x = LOWORD(lParam); //This macro retrieves the low-order word from the specified 32-bit value.
         //在intel的CPU上,字节存取是反过来的,低八位也就是前八位
         //


            pt.y = HIWORD(lParam); //This macro retrieves the high-order word from the specified 32-bit value
 
            // If the mouse click took place inside the client
            // area, execute the application-defined function
            // that displays the shortcut menu.
 
            if (PtInRect((LPRECT) &rc, pt)) //判断点是否在矩形中
                HandlePopupMenu(hwndMain, pt);
            break;
           
/**************************************************************
*     WM_PAINT:                                                *
**************************************************************/

      case WM_PAINT://当视窗显示区域的一部分显示内容或者全部变为「无效」,以致于必须「更新画面」时,将由这个讯息通知程式
        //给该区域一个红色边框(Give the region a red border)
         FrameRgn(hDC,hRegion1,CreateSolidBrush(RGB(0,0,0)),2,2); //The FrameRgn function draws a border around the specified region by using the specified brush
        
         // 将对话框置于前端(bring our dialog to the foreground)
   BringWindowToTop(hwndSelCapDrvDlg);//This function brings the specified window to the top of the z-order. If the window is a top-level window, it is activated. If the window is a child window, the top-level parent window associated with the child window is activated
         return( DefWindowProc( hwndMain, msg, wParam, lParam ));//该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。该函数确保每一个消息得到处理。调用DefWindowProc函数时使用窗口过程接收的相同参数

/**************************************************************
*     WM_COMMAND:                                              *
**************************************************************/
   case WM_COMMAND://消息被发送,当用户从菜单中选择一项,当一个控制消息发出给它的父窗口,或是一个加速按键被释放,一个窗口通过 WindowProc 接收消息
     CAPSTATUS CapStatus;
     
     switch( wParam ) {
   
    case SOURCE:
         if(CapDrvCaps.fHasDlgVideoSource)
           capDlgVideoSource(hwndVideo);
         break;
      case FORMAT://why doesnt this work
         //if(CapDrvCaps.fHasDlgVideoFormat)
         //{  
           capDlgVideoFormat(hwndMain);
           // 是否有新的图片尺寸(Are there new image dimensions)
           capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
           SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
              CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
         //}
         break;
      case DISPLAY://why doesnt this work//显示
       //if (CapDrvCaps.fHasDlgVideoDisplay)
        capDlgVideoDisplay(hwndVideo);
       break;
            case EXIT://退出
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
               break;
            case MINIMIZE://最小化
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);
               break;
            case HELP://帮助
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
               break;
            case RECORDVIDEO://录制视频
            if(HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndRecord)
            {
      if (!isRecordFileOpen)
      {
        OPENFILENAME ofn; // open file name structure
        
        // initialize OPENFILENAME
        ZeroMemory(&ofn, sizeof(OPENFILENAME));
     ofn.lStructSize = sizeof(OPENFILENAME);
     ofn.hwndOwner = hwndMain;
     ofn.lpstrFile = recordFile;
     ofn.nMaxFile = sizeof(recordFile);
     ofn.lpstrFilter = "Video

  评论这张
 
阅读(553)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018