📄 vidcap.c
字号:
case IDM_O_VIDEOFORMAT:
if (gCapDriverCaps.fHasDlgVideoFormat) {
// Only if the driver has a "Video Format" dialog box
oldhelpid = SetCurrentHelpContext(IDA_VIDFORMAT);
if (capDlgVideoFormat(ghWndCap)) { // If successful,
// Get the new image dimension and center capture window
capGetStatus(ghWndCap, &gCapStatus, sizeof(CAPSTATUS)) ;
vidcapLayout(hWnd);
}
SetCurrentHelpContext(oldhelpid);
}
break;
case IDM_O_VIDEOSOURCE:
if (gCapDriverCaps.fHasDlgVideoSource) {
// Only if the driver has a "Video Source" dialog box
oldhelpid = SetCurrentHelpContext(IDA_VIDSOURCE);
capDlgVideoSource(ghWndCap) ;
capGetStatus(ghWndCap, &gCapStatus, sizeof(CAPSTATUS)) ;
vidcapLayout(hWnd);
SetCurrentHelpContext(oldhelpid);
}
break ;
case IDM_O_VIDEODISPLAY:
if (gCapDriverCaps.fHasDlgVideoDisplay) {
// Only if the driver has a "Video Display" dialog box
oldhelpid = SetCurrentHelpContext(IDA_VIDDISPLAY);
capDlgVideoDisplay(ghWndCap) ;
capGetStatus(ghWndCap, &gCapStatus, sizeof(CAPSTATUS)) ;
SetCurrentHelpContext(oldhelpid);
}
break ;
case IDM_O_CHOOSECOMPRESSOR:
oldhelpid = SetCurrentHelpContext(IDA_COMPRESSION);
capDlgVideoCompression(ghWndCap);
SetCurrentHelpContext(oldhelpid);
break;
// Select a driver to activate
case IDM_O_DRIVER0:
case IDM_O_DRIVER1:
case IDM_O_DRIVER2:
case IDM_O_DRIVER3:
case IDM_O_DRIVER4:
case IDM_O_DRIVER5:
case IDM_O_DRIVER6:
case IDM_O_DRIVER7:
case IDM_O_DRIVER8:
case IDM_O_DRIVER9:
vidcapInitHardware(ghWndMain, ghWndCap, wParam - IDM_O_DRIVER0);
break;
/* --- capture --- */
case IDM_C_PALETTE:
if (DoDialog(hWnd, IDD_MakePalette, MakePaletteProc, 0)) {
// Palette is created within the dialog
bDefaultPalette = FALSE;
}
break;
case IDM_C_CAPTUREVIDEO:
// warn user if he is still using the default palette
if (bDefaultPalette) {
LPBITMAPINFOHEADER lpbi;
int sz;
// fUsingDefaultPalette will be TRUE even if the
// current capture format is non-palettised. This is a
// bizarre decision of Jay's.
sz = (int)capGetVideoFormatSize(ghWndCap);
lpbi = (LPBITMAPINFOHEADER)LocalAlloc(LPTR, sz);
if (lpbi) { // We can warn s/he
if (capGetVideoFormat(ghWndCap, lpbi, sz) &&
(lpbi->biCompression == BI_RGB) &&
(lpbi->biBitCount <= 8)) {
CAPSTATUS cs;
// if we've warned him once, we can forget it
bDefaultPalette = FALSE;
capGetStatus(ghWndCap, &cs, sizeof(cs));
if (cs.fUsingDefaultPalette) {
if (MessageBoxID(IDS_WARN_DEFAULT_PALETTE,
MB_OKCANCEL| MB_ICONEXCLAMATION)== IDCANCEL) {
break;
}
}
}
LocalFree(lpbi);
}
}
// Invoke a Dlg box to setup all the params
if (DoDialog(hWnd, IDD_CapSetUp, CapSetUpProc, 0)) {
// set the defaults we won't bother the user with
gCapParms.fMakeUserHitOKToCapture = !gCapParms.fMCIControl;
gCapParms.wPercentDropForError = 10;
// fUsingDOSMemory is obsolete, but we use it here as
// a flag which is TRUE if "CapturingToDisk"
// The number of video buffers should be enough to get through
// disk seeks and thermal recalibrations if "CapturingToDisk"
// If "CapturingToMemory", get as many buffers as we can.
gCapParms.wNumVideoRequested =
gCapParms.fUsingDOSMemory ? 32 : 1000;
// Don't abort on the left mouse anymore!
gCapParms.fAbortLeftMouse = FALSE;
gCapParms.fAbortRightMouse = TRUE;
// If the Driver is Scrncap.drv, the following values are special
// If wChunkGranularity is zero, the granularity will be set to the
// disk sector size.
gCapParms.wChunkGranularity = (gbIsScrncap ? 32 : 0);
// Scrncap requires a callback for the message pump
capSetCallbackOnYield(ghWndCap,
(gbIsScrncap ? fpYieldCallback : NULL));
// If the user has hit OK, set the new setup info
capCaptureSetSetup(ghWndCap, &gCapParms, sizeof(CAPTUREPARMS)) ;
} else {
break;
}
// if no capture file, get that
if (lstrlen(gachCaptureFile) <= 0) {
cmdSetCaptureFile(hWnd);
if (lstrlen(gachCaptureFile) <= 0) {
break;
}
}
// Capture video sequence
fResult = capCaptureSequence(ghWndCap) ;
break;
case IDM_C_CAPTUREFRAME:
// Turn off overlay / preview (gets turned off by frame capture)
vidcapSetLive(FALSE);
vidcapSetOverlay(FALSE);
// Grab a frame
fResult = capGrabFrameNoStop(ghWndCap) ;
break;
case IDM_C_CAPSEL:
{
FARPROC fproc;
// if no capture file, get that
if (lstrlen(gachCaptureFile) <= 0) {
cmdSetCaptureFile(hWnd);
if (lstrlen(gachCaptureFile) <= 0) {
break;
}
}
fproc = MakeProcInstance(CapFramesProc, ghInstApp);
DialogBox(ghInstApp, MAKEINTRESOURCE(IDD_CAPFRAMES), hWnd, (DLGPROC) fproc);
FreeProcInstance(fproc);
}
break;
#ifdef DEBUG
case IDM_C_TEST:
nTestCount = 0;
// Intentional fall through
case IDM_C_TESTAGAIN:
// set the defaults we won't bother the user with
gCapParms.fMakeUserHitOKToCapture = FALSE;
gCapParms.wPercentDropForError = 100;
gCapParms.wNumVideoRequested =
gCapParms.fUsingDOSMemory ? 32 : 1000;
// Don't abort on the left mouse anymore!
gCapParms.fAbortLeftMouse = FALSE;
gCapParms.fAbortRightMouse = TRUE;
// If wChunkGranularity is zero, the granularity will be set to the
// disk sector size.
gCapParms.wChunkGranularity = (gbIsScrncap ? 32 : 0);
// If the user has hit OK, set the new setup info
capCaptureSetSetup(ghWndCap, &gCapParms, sizeof(CAPTUREPARMS)) ;
// if no capture file, get that
if (lstrlen(gachCaptureFile) <= 0) {
cmdSetCaptureFile(hWnd);
if (lstrlen(gachCaptureFile) <= 0) {
break;
}
}
{
char buf[80];
gCapParms.wNumVideoRequested = 10;
gCapParms.wNumAudioRequested = 5;
gCapParms.fLimitEnabled = TRUE;
if (gCapParms.wTimeLimit == 0)
gCapParms.wTimeLimit = 5;
capCaptureSetSetup(ghWndCap, &gCapParms, sizeof(CAPTUREPARMS)) ;
// Capture video sequence
fResult = capCaptureSequence(ghWndCap) ;
wsprintf (buf, "TestCount = %d", nTestCount++);
statusUpdateStatus(ghWndStatus, buf);
// Hold down the right mouse button to abort
if (!GetAsyncKeyState(VK_RBUTTON) & 0x0001)
PostMessage (hWnd, WM_COMMAND, IDM_C_TESTAGAIN, 0L);
}
break;
#endif
/* --- help --- */
case IDM_H_CONTENTS:
HelpContents();
break;
case IDM_H_ABOUT:
ShellAbout(
hWnd,
"VidCap",
"Video Capture Tool",
LoadIcon(ghInstApp, gachIconName)
);
//DoDialog(hWnd, IDD_HelpAboutBox, AboutProc, 0);
break ;
}
return 0L ;
}
/* --- menu help and enable/disable handling ------------------------ */
// write or clear status line help text when the user brings up or cancels a
// menu. This depends on there being strings in the string table with
// the same ID as the corresponding menu item.
// Help text for the items along the menu bar (File, Edit etc) depends
// on IDM_FILE, IDM_EDIT being defined with values 100 apart in the same
// order as their index in the menu
void
MenuSelect(HWND hwnd, UINT cmd, UINT flags, HMENU hmenu)
{
if ((LOWORD(flags) == 0xffff) && (hmenu == NULL)) {
//menu closing - remove message
statusUpdateStatus(ghWndStatus, NULL);
} else if ( (flags & (MF_SYSMENU|MF_POPUP)) == (MF_SYSMENU|MF_POPUP)) {
// the system menu itself
statusUpdateStatus(ghWndStatus, MAKEINTRESOURCE(IDM_SYSMENU));
} else if ((flags & MF_POPUP) == 0) {
// a menu command item
statusUpdateStatus(ghWndStatus, MAKEINTRESOURCE(cmd));
} else {
//a popup menu - we need to search to find which one.
// note that the cmd item in Win16 will now have a
// menu handle, whereas in Win32 it has an index.
// NOTE: this code assumes that the menu items
// are #defined 100 apart in the same order, starting
// with IDM_FILE
#ifdef _WIN32
statusUpdateStatus(ghWndStatus, MAKEINTRESOURCE(IDM_FILE + (cmd * 100)));
#else
int i,c;
HMENU hmenuMain;
hmenuMain = GetMenu(hWnd);
c = GetMenuItemCount(hmenuMain);
for(i = 0; i < c; i++) {
if (hmenu == GetSubMenu(hmenuMain, i)) {
statusUpdateStatus(MAKEINTRESOURCE(IDM_FILE + (cmd*100)));
return(0);
}
}
statusUpdateStatus(NULL);
#endif
}
}
// a popup menu is being selected - enable or disable menu items
int
InitMenuPopup(
HWND hwnd,
HMENU hmenu,
int index
)
{
int i = MF_ENABLED;
CAPSTATUS cs;
BOOL bUsesPalettes;
capGetStatus(ghWndCap, &cs, sizeof(cs));
// try to see if the driver uses palettes
if ((cs.hPalCurrent != NULL) || (cs.fUsingDefaultPalette)) {
bUsesPalettes = TRUE;
} else {
bUsesPalettes = FALSE;
}
switch(index) {
case 0: // IDM_FILE
if (lstrlen(gachCaptureFile) <= 0) {
i = MF_GRAYED;
}
// save as enabled only if we have a capture file
EnableMenuItem(hmenu, IDM_F_SAVEVIDEOAS, i);
// edit video possible only if we have a capture file AND we've
// captured something
EnableMenuItem(hmenu, IDM_F_EDITVIDEO,
(cs.dwCurrentVideoFrame > 0) ? i : MF_GRAYED);
// allow save palette if there is one
EnableMenuItem(hmenu, IDM_F_SAVEPALETTE,
(cs.hPalCurrent != NULL) ? MF_ENABLED:MF_GRAYED);
// allow load palette if the driver uses palettes
EnableMenuItem(hmenu, IDM_F_LOADPALETTE,
bUsesPalettes ? MF_ENABLED : MF_GRAYED);
break;
case 1: // IDM_EDIT
// paste palettes if driver uses them and there is one pastable
EnableMenuItem(hmenu, IDM_E_PASTEPALETTE,
(bUsesPalettes && IsClipboardFormatAvailable(CF_PALETTE)) ? MF_ENABLED:MF_GRAYED);
break;
case 2: // IDM_OPTIONS
EnableMenuItem(hmenu, IDM_O_AUDIOFORMAT,
cs.fAudioHardware ? MF_ENABLED : MF_GRAYED);
EnableMenuItem(hmenu, IDM_O_OVERLAY,
gCapDriverCaps.fHasOverlay ? MF_ENABLED:MF_GRAYED);
EnableMenuItem(hmenu, IDM_O_VIDEOFORMAT,
gCapDriverCaps.fHasDlgVideoFormat ? MF_ENABLED:MF_GRAYED);
EnableMenuItem(hmenu, IDM_O_VIDEODISPLAY,
gCapDriverCaps.fHasDlgVideoDisplay ? MF_ENABLED:MF_GRAYED);
EnableMenuItem(hmenu, IDM_O_VIDEOSOURCE,
gCapDriverCaps.fHasDlgVideoSource ? MF_ENABLED:MF_GRAYED);
EnableMenuItem(hmenu, IDM_O_PREVIEW,
gbHaveHardware ? MF_ENABLED:MF_GRAYED);
case 3: // IDM_CAPTURE
if (!gbHaveHardware) {
i = MF_GRAYED;
}
EnableMenuItem(hmenu, IDM_C_CAPSEL, i);
EnableMenuItem(hmenu, IDM_C_CAPTUREFRAME, i);
EnableMenuItem(hmenu, IDM_C_CAPTUREVIDEO, i);
EnableMenuItem(hmenu, IDM_C_PALETTE, (gbHaveHardware &&
gCapDriverCaps.fDriverSuppliesPalettes) ? MF_ENABLED : MF_GRAYED);
break;
}
return(0);
}
//
// MainWndProc: Application Main Window Procedure
//
LONG FAR PASCAL MainWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
////////////////////////////////////////////////////////////////////////
// hWnd: Application main window handle
// Message: Next message to be processed
// wParam: WORD param for the message
// lParam: LONG param for the message
////////////////////////////////////////////////////////////////////////
switch (Message) {
static BOOL fMinimized;
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) == SC_MAXIMIZE)
fMinimized = FALSE;
else if ((wParam & 0xfff0) == SC_RESTORE)
fMinimized = FALSE;
else if ((wParam & 0xfff0) == SC_MINIMIZE)
fMinimized = TRUE;
return DefWindowProc(hWnd, Message, wParam, lParam);
break;
case WM_COMMAND:
MenuProc(hWnd,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -