📄 vidcap.c
字号:
// Do some sanity checking
if (MMSYSERR_NOERROR == waveInOpen (NULL, WAVE_MAPPER,
glpwfex, 0, 0, WAVE_FORMAT_QUERY)) {
capSetAudioFormat(ghWndCap, glpwfex, (WORD)dwSize) ;
}
GlobalFreePtr(glpwfex) ;
}
}
void
vidcapWriteSettingsProfile(void)
{
mmWriteProfileString(gachAppTitle, "CaptureFile", gachCaptureFile);
mmWriteProfileString(gachAppTitle, "MCIDevice", gachMCIDeviceName);
mmWriteProfileInt(gachAppTitle, "MicroSecPerFrame",
gCapParms.dwRequestMicroSecPerFrame, DEF_CAPTURE_RATE);
mmWriteProfileFlag(gachAppTitle, "CaptureAudio",
gCapParms.fCaptureAudio, gCapStatus.fAudioHardware);
mmWriteProfileFlag(gachAppTitle, "LimitEnabled",
gCapParms.fLimitEnabled, FALSE);
mmWriteProfileInt(gachAppTitle, "TimeLimit",
gCapParms.wTimeLimit, 30);
mmWriteProfileFlag(gachAppTitle, "MCIControl",
gCapParms.fMCIControl, FALSE);
mmWriteProfileFlag(gachAppTitle, "StepMCIDevice",
gCapParms.fStepMCIDevice, FALSE);
mmWriteProfileInt(gachAppTitle, "MCIStartTime",
gCapParms.dwMCIStartTime, 10000);
mmWriteProfileInt(gachAppTitle, "MCIStopTime",
gCapParms.dwMCIStopTime, 20000);
mmWriteProfileFlag(gachAppTitle, "StepCapture2x",
gCapParms.fStepCaptureAt2x, FALSE);
mmWriteProfileInt(gachAppTitle, "StepCaptureAverageFrames",
gCapParms.wStepCaptureAverageFrames, 3);
mmWriteProfileInt(gachAppTitle, "AVStreamMaster",
gCapParms.AVStreamMaster, AVSTREAMMASTER_AUDIO);
mmWriteProfileFlag(gachAppTitle, "CaptureToDisk",
gCapParms.fUsingDOSMemory, TRUE);
mmWriteProfileInt(gachAppTitle, "IndexSize",
gCapParms.dwIndexSize, CAP_SMALL_INDEX);
// The audio format is written whenever it is changed via dlg
}
/* --- error/status functions -------------------------------------------*/
/*
* put up a message box loading a string from the
* resource file
*/
int
MessageBoxID(UINT idString, UINT fuStyle)
{
char achMessage[256]; // max message length
LoadString(ghInstApp, idString, achMessage, sizeof(achMessage));
return MessageBox(ghWndMain, achMessage, gachAppTitle, fuStyle);
}
//
// ErrorCallbackProc: Error Callback Function
//
LRESULT FAR PASCAL ErrorCallbackProc(HWND hWnd, int nErrID, LPSTR lpErrorText)
{
////////////////////////////////////////////////////////////////////////
// hWnd: Application main window handle
// nErrID: Error code for the encountered error
// lpErrorText: Error text string for the encountered error
////////////////////////////////////////////////////////////////////////
if (!ghWndMain)
return FALSE;
if (nErrID == 0) // Starting a new major function
return TRUE; // Clear out old errors...
// save the error message for use in NoHardwareDlgProc
lstrcpy(gachLastError, lpErrorText);
// Show the error ID and text
MessageBox(hWnd, lpErrorText, gachAppTitle,
MB_OK | MB_ICONEXCLAMATION) ;
return (LRESULT) TRUE ;
}
//
// StatusCallbackProc: Status Callback Function
//
LRESULT FAR PASCAL StatusCallbackProc(HWND hWnd, int nID, LPSTR lpStatusText)
{
////////////////////////////////////////////////////////////////////////
// hWnd: Application main window handle
// nID: Status code for the current status
// lpStatusText: Status text string for the current status
////////////////////////////////////////////////////////////////////////
static int CurrentID;
if (!ghWndMain) {
return FALSE;
}
// the CAP_END message sometimes overwrites a useful
// statistics message.
if (nID == IDS_CAP_END) {
if ((CurrentID == IDS_CAP_STAT_VIDEOAUDIO) ||
(CurrentID == IDS_CAP_STAT_VIDEOONLY)) {
return(TRUE);
}
}
CurrentID = nID;
statusUpdateStatus(ghWndStatus, lpStatusText);
return (LRESULT) TRUE ;
}
//
// YieldCallbackProc: Status Callback Function
// (Only used for Scrncap.drv driver)
//
LRESULT FAR PASCAL YieldCallbackProc(HWND hWnd)
{
////////////////////////////////////////////////////////////////////////
// hWnd: Application main window handle
////////////////////////////////////////////////////////////////////////
MSG msg;
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// Return TRUE to continue capturing
return (LRESULT) TRUE;
}
/*
* load a string from the string table and return
* a pointer to it for temporary use. Each call
* overwrites the previous
*/
LPSTR
tmpString(UINT idString)
{
static char ach[350];
LoadString(ghInstApp, idString, ach, sizeof(ach));
// ensure null terminated
ach[sizeof(ach) -1] = 0;
return(ach);
}
/* --- connect to and init hardware ------------------------------------- */
void
vidcapSetLive(BOOL bLive)
{
capPreview(ghWndCap, bLive);
toolbarModifyState(ghWndToolBar, BTN_LIVE, bLive? BTNST_DOWN : BTNST_UP);
CheckMenuItem(GetMenu(ghWndMain), IDM_O_PREVIEW,
MF_BYCOMMAND | (bLive ? MF_CHECKED : MF_UNCHECKED));
gbLive = bLive;
if (bLive == TRUE) {
vidcapSetOverlay(FALSE);
}
}
void
vidcapSetOverlay(BOOL bOverlay)
{
if (!gCapDriverCaps.fHasOverlay) {
CheckMenuItem(GetMenu(ghWndMain), IDM_O_OVERLAY,
MF_BYCOMMAND | MF_UNCHECKED);
gbOverlay = FALSE;
return;
}
capOverlay(ghWndCap, bOverlay);
toolbarModifyState(ghWndToolBar, BTN_OVERLAY, bOverlay ? BTNST_DOWN : BTNST_UP);
CheckMenuItem(GetMenu(ghWndMain), IDM_O_OVERLAY,
MF_BYCOMMAND | (bOverlay ? MF_CHECKED : MF_UNCHECKED));
gbOverlay = bOverlay;
if (bOverlay == TRUE) {
vidcapSetLive(FALSE);
}
}
void
vidcapSetCaptureFile(LPSTR pFileName)
{
char achBuffer[_MAX_PATH];
if ((pFileName != NULL) && (lstrlen(pFileName) > 0)) {
// record the capture filename
if (lstrcmp(gachCaptureFile, pFileName)) {
lstrcpy(gachCaptureFile, pFileName);
}
// and set window title
wsprintf(achBuffer, "%s - %s", gachAppTitle, pFileName);
} else {
gachCaptureFile[0] = 0;
lstrcpy(achBuffer, gachAppTitle);
}
capFileSetCaptureFile(ghWndCap, gachCaptureFile);
SetWindowText(ghWndMain, achBuffer);
}
/* --- winproc and message handling --------------------------------------- */
/*
* called from WM_COMMAND processing if the
* message is from the toolbar. iButton contains the
* button ID in the lower 8 bits, and the flags in the upper 8 bits/
*/
LONG FAR PASCAL
toolbarCommand (HWND hWnd, int iButton, HWND hwndToolbar)
{
int iBtnPos, iState, iActivity, iString;
// check repeat bit
if (iButton & BTN_REPEAT) {
return(0);
}
iButton &= 0xff;
iBtnPos = toolbarIndexFromButton(hwndToolbar, iButton);
iState = toolbarStateFromButton(hwndToolbar, iButton);
iActivity = toolbarActivityFromButton(hwndToolbar, iButton);
iString = toolbarStringFromIndex(hwndToolbar, iBtnPos);
switch(iActivity) {
case BTNACT_MOUSEDOWN:
case BTNACT_KEYDOWN:
case BTNACT_MOUSEMOVEON:
statusUpdateStatus(ghWndStatus, MAKEINTRESOURCE(iString));
break;
case BTNACT_MOUSEMOVEOFF:
statusUpdateStatus(ghWndStatus, NULL);
break;
case BTNACT_MOUSEUP:
case BTNACT_KEYUP:
statusUpdateStatus(ghWndStatus, NULL);
switch(iButton) {
case BTN_SETFILE:
SendMessage(hWnd, WM_COMMAND,
GET_WM_COMMAND_MPS(IDM_F_SETCAPTUREFILE, NULL, 0));
break;
case BTN_EDITCAP:
// edit captured video
SendMessage(hWnd, WM_COMMAND,
GET_WM_COMMAND_MPS(IDM_F_EDITVIDEO, NULL, 0));
break;
case BTN_LIVE:
SendMessage(hWnd,WM_COMMAND,
GET_WM_COMMAND_MPS(IDM_O_PREVIEW, NULL, 0));
break;
case BTN_CAPFRAME:
SendMessage(hWnd, WM_COMMAND,
GET_WM_COMMAND_MPS(IDM_C_CAPTUREFRAME, NULL, 0));
break;
case BTN_CAPSEL:
// capture selected frames
SendMessage(hWnd, WM_COMMAND,
GET_WM_COMMAND_MPS(IDM_C_CAPSEL, NULL, 0));
break;
case BTN_CAPAVI:
SendMessage(hWnd,WM_COMMAND,
GET_WM_COMMAND_MPS(IDM_C_CAPTUREVIDEO, NULL, 0));
break;
case BTN_CAPPAL:
SendMessage(hWnd, WM_COMMAND,
GET_WM_COMMAND_MPS(IDM_C_PALETTE, NULL, 0));
break;
case BTN_OVERLAY:
SendMessage(hWnd, WM_COMMAND,
GET_WM_COMMAND_MPS(IDM_O_OVERLAY, NULL, 0));
break;
}
break;
}
return(0);
}
/*
* Put up a dialog to allow the user to select a capture file.
*/
LONG FAR PASCAL
cmdSetCaptureFile(HWND hWnd)
{
OPENFILENAME ofn ;
LPSTR p;
char achFileName[_MAX_PATH];
char achBuffer[_MAX_PATH] ;
UINT wError ;
HANDLE hFilter;
int oldhelpid;
// Get current capture file name and
// then try to get the new capture file name
if (wError = capFileGetCaptureFile(ghWndCap, achFileName,
sizeof(achFileName))) {
// Get just the path info
// Terminate the full path at the last backslash
lstrcpy (achBuffer, achFileName);
for (p = achBuffer + lstrlen(achBuffer); p > achBuffer; p--) {
if (*p == '\\') {
*(p+1) = '\0';
break;
}
}
_fmemset(&ofn, 0, sizeof(OPENFILENAME)) ;
ofn.lStructSize = sizeof(OPENFILENAME) ;
ofn.hwndOwner = hWnd ;
//load filters from resource stringtable
hFilter = FindResource(ghInstApp, MAKEINTRESOURCE(ID_FILTER_AVI), RT_RCDATA);
if ((hFilter = LoadResource(ghInstApp, hFilter)) == NULL) {
ofn.lpstrFilter = NULL;
} else {
ofn.lpstrFilter = LockResource(hFilter);
}
ofn.nFilterIndex = 0 ;
ofn.lpstrFile = achFileName ;
ofn.nMaxFile = sizeof(achFileName) ;
ofn.lpstrFileTitle = NULL;
ofn.lpstrTitle = tmpString(IDS_TITLE_SETCAPTUREFILE);
ofn.nMaxFileTitle = 0 ;
ofn.lpstrInitialDir = achBuffer;
ofn.Flags =
OFN_HIDEREADONLY |
OFN_NOREADONLYRETURN |
OFN_PATHMUSTEXIST ;
// set help context for dialog
oldhelpid = SetCurrentHelpContext(IDA_SETCAPFILE);
if (GetOpenFileName(&ofn)) {
OFSTRUCT os;
vidcapSetCaptureFile(achFileName);
/*
* if this is a new file, then invite the user to
* allocate some space
*/
if (OpenFile(achFileName, &os, OF_EXIST) == HFILE_ERROR) {
/*
* show the allocate file space dialog to encourage
* the user to pre-allocate space
*/
if (DoDialog(hWnd, IDD_AllocCapFileSpace, AllocCapFileProc, 0)) {
// ensure repaint after dismissing dialog before
// possibly lengthy operation
UpdateWindow(ghWndMain);
// If user has hit OK then alloc requested capture file space
if (! capFileAlloc(ghWndCap, (long) gwCapFileSize * ONEMEG)) {
MessageBoxID(IDS_ERR_CANT_PREALLOC,
MB_OK | MB_ICONEXCLAMATION) ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -