684 lines
20 KiB
C
684 lines
20 KiB
C
/*-----------------------------------------------------------------------------+
|
|
| DLGS.C |
|
|
| |
|
|
| Routines to handle selection range display |
|
|
| |
|
|
| (C) Copyright Microsoft Corporation 1991. All rights reserved. |
|
|
| |
|
|
| Revision History |
|
|
| Oct-1992 MikeTri Ported to WIN32 / WIN16 common code |
|
|
| |
|
|
+-----------------------------------------------------------------------------*/
|
|
|
|
//#undef NOSCROLL // SB_* and scrolling routines
|
|
//#undef NOWINOFFSETS // GWL_*, GCL_*, associated routines
|
|
//#undef NOCOLOR // color stuff
|
|
//#include <string.h>
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <mmsystem.h>
|
|
#include "mplayer.h"
|
|
#include "stdlib.h"
|
|
|
|
extern UINT gwCurScale;
|
|
|
|
TCHAR aszHelpFile[] = TEXT("MPLAYER.HLP");
|
|
|
|
/*
|
|
* FUNCTION PROTOTYPES
|
|
*/
|
|
INT_PTR FAR PASCAL _EXPORT setselDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
INT_PTR FAR PASCAL _EXPORT optionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
INT_PTR FAR PASCAL _EXPORT mciDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
/*--------------------------------------------------------------+
|
|
| ******************* PUBLIC FUNCTIONS ************************ |
|
|
+--------------------------------------------------------------*/
|
|
/*--------------------------------------------------------------+
|
|
| setselDialog - bring up the dialog for Set Selection |
|
|
| |
|
|
+--------------------------------------------------------------*/
|
|
BOOL FAR PASCAL setselDialog(HWND hwnd)
|
|
{
|
|
//FARPROC fpfn;
|
|
|
|
frameboxInit(ghInst, ghInstPrev);
|
|
|
|
//fpfn = MakeProcInstance((FARPROC)setselDlgProc, ghInst);
|
|
|
|
DialogBox(ghInst, TEXT("SetSelection"), hwnd, setselDlgProc);
|
|
// FreeProcInstance missing anyway
|
|
|
|
return TRUE; // should we check return value?
|
|
}
|
|
|
|
static BOOL sfNumLastChosen;
|
|
static BOOL sfInUpdate = FALSE;
|
|
/*--------------------------------------------------------------+
|
|
| setselDlgProc - dialog procedure for Set Selection dialog |
|
|
| |
|
|
+--------------------------------------------------------------*/
|
|
INT_PTR PASCAL _EXPORT setselDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
int iItem;
|
|
DWORD_PTR fr, fr2, frIn, frOut, frMarkIn, frMarkOut, frCurrent;
|
|
TCHAR ach[80];
|
|
LPTSTR lpsz = (LPTSTR)ach;
|
|
static int aKeyWordIds[] = {
|
|
IDC_EDITALL, IDH_SELECT_ALL,
|
|
IDC_EDITNONE, IDH_SELECT_NONE,
|
|
IDC_EDITSOME, IDH_SELECT_FROM,
|
|
IDC_EDITFROM, IDH_SELECT_FROM,
|
|
IDC_ETTEXT, IDH_SELECT_FROM,
|
|
IDC_EDITTO, IDH_SELECT_FROM,
|
|
IDC_ESTEXT, IDH_SELECT_FROM,
|
|
IDC_EDITNUM, IDH_SELECT_FROM,
|
|
0, 0
|
|
};
|
|
|
|
frMarkIn = frIn = SendMessage(ghwndTrackbar, TBM_GETSELSTART, 0, 0);
|
|
frMarkOut = frOut = SendMessage(ghwndTrackbar, TBM_GETSELEND, 0, 0);
|
|
frCurrent = SendMessage(ghwndTrackbar, TBM_GETPOS, 0, 0);
|
|
|
|
switch(msg){
|
|
case WM_INITDIALOG:
|
|
if (gwCurScale == ID_TIME) {
|
|
LOADSTRING(IDS_TIMEMODE, ach);
|
|
SetWindowText(hwnd, lpsz);
|
|
} else if (gwCurScale == ID_FRAMES) {
|
|
LOADSTRING(IDS_FRAMEMODE, ach);
|
|
SetWindowText(hwnd, lpsz);
|
|
} else {
|
|
LOADSTRING(IDS_TRACKMODE, ach);
|
|
SetWindowText(hwnd, lpsz);
|
|
}
|
|
|
|
/* Always put something here - if no selection, use the cur frame */
|
|
if (frMarkIn == -1 || frMarkOut == -1) {
|
|
SetDlgItemInt(hwnd, IDC_EDITFROM, (UINT)frCurrent, FALSE);
|
|
SetDlgItemInt(hwnd, IDC_EDITTO, (UINT)frCurrent, FALSE);
|
|
SetDlgItemInt(hwnd, IDC_EDITNUM, 0, FALSE);
|
|
} else {
|
|
SetDlgItemInt(hwnd, IDC_EDITFROM, (UINT)frMarkIn, FALSE);
|
|
SetDlgItemInt(hwnd, IDC_EDITTO, (UINT)frMarkOut, FALSE);
|
|
SetDlgItemInt(hwnd, IDC_EDITNUM, (UINT)(frMarkOut - frMarkIn), FALSE);
|
|
}
|
|
|
|
if (frMarkIn == -1 || frMarkOut == -1) {
|
|
/* turn on the NONE radio button */
|
|
CheckRadioButton(hwnd, IDC_EDITALL, IDC_EDITNONE, IDC_EDITNONE);
|
|
} else if(frMarkIn == gdwMediaStart &&
|
|
frMarkOut == gdwMediaStart + gdwMediaLength){
|
|
/* turn on the ALL button, it is all selected */
|
|
CheckRadioButton(hwnd, IDC_EDITALL, IDC_EDITNONE, IDC_EDITALL);
|
|
} else {
|
|
/* turn on the From/To portion */
|
|
CheckRadioButton(hwnd, IDC_EDITALL, IDC_EDITNONE, IDC_EDITSOME);
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
int i;
|
|
for (i = 0; aKeyWordIds[i]; i+=2)
|
|
if (aKeyWordIds[i] == GetDlgCtrlID((HWND)wParam))
|
|
break;
|
|
if (aKeyWordIds[i] == 0)
|
|
break;
|
|
|
|
WinHelp((HWND)wParam, aszHelpFile, HELP_CONTEXTMENU, (UINT_PTR)(LPVOID)aKeyWordIds);
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_HELP:
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; aKeyWordIds[i]; i+=2)
|
|
if (aKeyWordIds[i] == ((LPHELPINFO)lParam)->iCtrlId)
|
|
break;
|
|
if (aKeyWordIds[i] == 0)
|
|
break;
|
|
|
|
WinHelp(((LPHELPINFO)lParam)->hItemHandle, aszHelpFile,
|
|
HELP_WM_HELP, (UINT_PTR)(LPVOID)aKeyWordIds);
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam)){
|
|
WORD Code;
|
|
BOOL OK;
|
|
|
|
case IDOK:
|
|
/* We hit this AFTER we press OK on the selection box */
|
|
|
|
/* Make sure box we're editing loses focus before we */
|
|
/* execute, so values will be set properly. */
|
|
SetFocus(GetDlgItem(hwnd, IDOK));
|
|
if (IsDlgButtonChecked(hwnd, IDC_EDITALL)) {
|
|
/* this is the All: case */
|
|
frIn = gdwMediaStart;
|
|
frOut = gdwMediaStart + gdwMediaLength;
|
|
} else if (IsDlgButtonChecked(hwnd, IDC_EDITNONE)){
|
|
/* this is the None: case */
|
|
frIn = frOut = (DWORD)(-1);
|
|
} else {
|
|
/* this is the From: To: case */
|
|
iItem = 0;
|
|
|
|
frIn = GetDlgItemInt(hwnd, IDC_EDITFROM, &OK, FALSE);
|
|
|
|
if (!OK)
|
|
iItem = IDC_EDITFROM; // we misbehaved
|
|
else {
|
|
|
|
frOut = GetDlgItemInt(hwnd, IDC_EDITTO, &OK, FALSE);
|
|
|
|
if (!OK)
|
|
iItem = IDC_EDITTO;
|
|
}
|
|
if ((!OK)
|
|
|| (frOut < frIn)
|
|
|| ((long)frIn < (long)gdwMediaStart)
|
|
|| (frOut > gdwMediaStart + gdwMediaLength)) {
|
|
if (!iItem && (long)frIn < (long)gdwMediaStart)
|
|
iItem = IDC_EDITFROM; // who misbehaved?
|
|
else if (!iItem)
|
|
iItem = IDC_EDITTO;
|
|
// Don't beep -- Lose focus message already beeped
|
|
// MessageBeep(MB_ICONEXCLAMATION);
|
|
/* Illegal values, display msg box */
|
|
ErrorResBox(hwnd, ghInst,
|
|
MB_ICONEXCLAMATION | MB_OK,
|
|
IDS_APPNAME, IDS_FRAMERANGE);
|
|
/* Prevent box from ending */
|
|
/* select offending value */
|
|
SetFocus(GetDlgItem(hwnd, iItem));
|
|
|
|
SendMessage(GetDlgItem(hwnd, iItem),
|
|
EM_SETSEL, 0, (LPARAM)-1);
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
SendMessage(ghwndTrackbar, TBM_SETSELSTART, (WPARAM)FALSE, frIn);
|
|
SendMessage(ghwndTrackbar, TBM_SETSELEND, (WPARAM)TRUE, frOut);
|
|
DirtyObject(TRUE);
|
|
EndDialog(hwnd, TRUE);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, FALSE);
|
|
break;
|
|
|
|
case IDC_EDITALL:
|
|
CheckRadioButton(hwnd, IDC_EDITALL,
|
|
IDC_EDITNONE, IDC_EDITALL);
|
|
break;
|
|
|
|
case IDC_EDITNONE:
|
|
CheckRadioButton(hwnd, IDC_EDITALL,
|
|
IDC_EDITNONE, IDC_EDITNONE);
|
|
break;
|
|
|
|
case IDC_EDITSOME:
|
|
CheckRadioButton(hwnd, IDC_EDITALL,
|
|
IDC_EDITNONE, IDC_EDITSOME);
|
|
|
|
/* put the focus on the FROM box */
|
|
SetFocus(GetDlgItem(hwnd, IDC_EDITFROM));
|
|
break;
|
|
|
|
case IDC_EDITNUM:
|
|
/* turn on the FROM box if it isn't */
|
|
Code = GET_WM_COMMAND_CMD(wParam, lParam);
|
|
|
|
if (!IsDlgButtonChecked(hwnd, IDC_EDITSOME))
|
|
{
|
|
SetFocus(GetDlgItem(hwnd, IDC_EDITSOME));
|
|
CheckRadioButton(hwnd, IDC_EDITALL,
|
|
IDC_EDITNONE, IDC_EDITSOME);
|
|
}
|
|
|
|
if (!sfInUpdate && Code == EN_KILLFOCUS) {
|
|
sfNumLastChosen = TRUE;
|
|
goto AdjustSomething;
|
|
}
|
|
break;
|
|
|
|
case IDC_EDITTO:
|
|
/* turn on the FROM box if it isn't */
|
|
Code = GET_WM_COMMAND_CMD(wParam, lParam);
|
|
|
|
if (!IsDlgButtonChecked(hwnd, IDC_EDITSOME))
|
|
{
|
|
SetFocus(GetDlgItem(hwnd, IDC_EDITSOME));
|
|
CheckRadioButton(hwnd, IDC_EDITALL,
|
|
IDC_EDITNONE, IDC_EDITSOME);
|
|
|
|
}
|
|
|
|
if (!sfInUpdate && Code == EN_KILLFOCUS) {
|
|
sfNumLastChosen = FALSE;
|
|
goto AdjustSomething;
|
|
}
|
|
break;
|
|
|
|
case IDC_EDITFROM:
|
|
/* turn on the FROM box if it isn't */
|
|
Code = GET_WM_COMMAND_CMD(wParam, lParam);
|
|
|
|
if (!IsDlgButtonChecked(hwnd, IDC_EDITSOME))
|
|
{
|
|
CheckRadioButton(hwnd, IDC_EDITALL,
|
|
IDC_EDITNONE, IDC_EDITSOME);
|
|
if (GetFocus() != GetDlgItem(hwnd, IDC_EDITSOME))
|
|
SetFocus(GetDlgItem(hwnd, IDC_EDITSOME));
|
|
|
|
}
|
|
|
|
if (!sfInUpdate && Code == EN_KILLFOCUS) {
|
|
sfNumLastChosen = FALSE;
|
|
goto AdjustSomething;
|
|
}
|
|
break;
|
|
|
|
AdjustSomething:
|
|
sfInUpdate = TRUE;
|
|
|
|
fr = GetDlgItemInt(hwnd, IDC_EDITFROM, &OK, FALSE);
|
|
|
|
if (!OK)
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
else {
|
|
if ((long)fr < (long)gdwMediaStart) {
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
fr = gdwMediaStart;
|
|
}
|
|
if (fr > gdwMediaStart + gdwMediaLength) {
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
fr = gdwMediaStart + gdwMediaLength;
|
|
}
|
|
|
|
// We have to do this in time format, or if fr changed
|
|
|
|
SetDlgItemInt(hwnd, IDC_EDITFROM, (UINT)fr, FALSE);
|
|
|
|
if (sfNumLastChosen) {
|
|
/* They changed the number of frames last, */
|
|
/* so keep it constant. */
|
|
AdjustTo:
|
|
fr2 = GetDlgItemInt(hwnd, IDC_EDITNUM, &OK, FALSE);
|
|
|
|
if (!OK)
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
else {
|
|
if (fr + fr2 > gdwMediaStart + gdwMediaLength) {
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
fr2 = gdwMediaStart + gdwMediaLength - fr;
|
|
}
|
|
|
|
// if (fr2 < 0)
|
|
// fr2 = 0;
|
|
|
|
// We have to do this in time format, or if fr changed
|
|
|
|
SetDlgItemInt(hwnd, IDC_EDITNUM, (UINT)fr2, FALSE);
|
|
SetDlgItemInt(hwnd, IDC_EDITTO, (UINT)(fr + fr2), FALSE);
|
|
}
|
|
} else {
|
|
/* They changed a frame number last, */
|
|
/* so vary the number of frames */
|
|
|
|
fr2 = GetDlgItemInt(hwnd, IDC_EDITTO, &OK, FALSE);
|
|
|
|
if (!OK)
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
else {
|
|
if (fr2 < fr) {
|
|
/* Set TO = FROM */
|
|
SetDlgItemInt(hwnd, IDC_EDITNUM, 0, FALSE);
|
|
goto AdjustTo;
|
|
}
|
|
|
|
if (fr2 > gdwMediaStart + gdwMediaLength) {
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
fr2 = gdwMediaStart + gdwMediaLength;
|
|
}
|
|
|
|
SetDlgItemInt(hwnd, IDC_EDITNUM, (UINT)(fr2 - fr), FALSE);
|
|
|
|
// must redraw for time mode or if fr2 changed
|
|
SetDlgItemInt(hwnd, IDC_EDITTO, (UINT)fr2, FALSE);
|
|
}
|
|
}
|
|
}
|
|
|
|
sfInUpdate = FALSE;
|
|
return TRUE;
|
|
|
|
break;
|
|
}
|
|
break;
|
|
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/*--------------------------------------------------------------+
|
|
| optionsDialog - bring up the dialog for Options |
|
|
| |
|
|
+--------------------------------------------------------------*/
|
|
BOOL FAR PASCAL optionsDialog(HWND hwnd)
|
|
{
|
|
//FARPROC fpfn;
|
|
#if 0
|
|
DWORD ThreadId;
|
|
DWORD WindowThreadId;
|
|
#endif
|
|
|
|
//fpfn = MakeProcInstance((FARPROC)optionsDlgProc, ghInst);
|
|
|
|
#if 0
|
|
Problem:
|
|
|
|
When in-place editing, bring up the Options (or other) dialog,
|
|
then bring another app into the foreground. If you now click on
|
|
our container, you just get a beep. You can get back using the
|
|
Task List.
|
|
|
|
I can't get it to work with AttachThreadInput, but I'm not even
|
|
sure that this should be the server's responsibility. It's the
|
|
container that's receiving the mouse clicks.
|
|
|
|
I haven't had any word from the OLE guys on this question.
|
|
|
|
if (gfOle2IPEditing)
|
|
{
|
|
ThreadId = GetCurrentThreadId( );
|
|
WindowThreadId = GetWindowThreadProcessId(ghwndCntr, NULL);
|
|
AttachThreadInput(WindowThreadId, ThreadId, TRUE);
|
|
}
|
|
#endif
|
|
|
|
DialogBox(ghInst, TEXT("Options"), hwnd, optionsDlgProc);
|
|
|
|
#if 0
|
|
if (gfOle2IPEditing)
|
|
AttachThreadInput(ThreadId, WindowThreadId, FALSE);
|
|
#endif
|
|
|
|
// FreeProcInstance missing anyway
|
|
return TRUE; // should we check return value?
|
|
}
|
|
|
|
/*--------------------------------------------------------------+
|
|
| optionsDlgProc - dialog procedure for Options dialog |
|
|
| |
|
|
+--------------------------------------------------------------*/
|
|
INT_PTR FAR PASCAL _EXPORT optionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
UINT w;
|
|
HDC hdc;
|
|
static int aKeyWordIds[] =
|
|
{
|
|
OPT_AUTORWD, IDH_OPT_AUTO,
|
|
OPT_AUTOREP, IDH_OPT_REPEAT,
|
|
IDC_OLEOBJECT, IDH_OPT_CAPTCONTROL,
|
|
OPT_BAR, IDH_OPT_CAPTCONTROL,
|
|
OPT_BORDER, IDH_OPT_BORDER,
|
|
OPT_PLAY, IDH_OPT_PLAYCLIENT,
|
|
OPT_DITHER, IDH_OPT_DITHER,
|
|
IDC_CAPTIONTEXT, IDH_OPT_CAPTION,
|
|
IDC_TITLETEXT, IDH_OPT_CAPTION,
|
|
0 , 0
|
|
};
|
|
|
|
switch(msg){
|
|
case WM_INITDIALOG:
|
|
/* Take advantage of the fact that the button IDS are the */
|
|
/* same as the bit fields. */
|
|
for (w = OPT_FIRST; w <= OPT_LAST; w <<= 1)
|
|
CheckDlgButton(hwnd, w, gwOptions & w);
|
|
|
|
/* Enable and Fill the Title Text */
|
|
/* limit this box to CAPTION_LEN chars of input */
|
|
SendMessage(GetDlgItem(hwnd, IDC_TITLETEXT), EM_LIMITTEXT,
|
|
(WPARAM)CAPTION_LEN, 0L);
|
|
SendMessage(hwnd, WM_COMMAND, (WPARAM)OPT_BAR, 0L);
|
|
|
|
hdc = GetDC(NULL);
|
|
if (!(GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) ||
|
|
!(gwDeviceType & DTMCI_CANWINDOW)) {
|
|
CheckDlgButton(hwnd, OPT_DITHER, FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, OPT_DITHER), FALSE);
|
|
|
|
#if 0
|
|
CheckDlgButton(hwnd, OPT_USEPALETTE, FALSE);
|
|
EnableWindow(GetDlgItem(hwnd, OPT_USEPALETTE), FALSE);
|
|
#endif
|
|
}
|
|
ReleaseDC(NULL, hdc);
|
|
return TRUE;
|
|
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
WinHelp((HWND)wParam, aszHelpFile, HELP_CONTEXTMENU, (UINT_PTR)(LPVOID)aKeyWordIds);
|
|
return TRUE;
|
|
}
|
|
case WM_HELP:
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; aKeyWordIds[i]; i+=2)
|
|
if (aKeyWordIds[i] == ((LPHELPINFO)lParam)->iCtrlId)
|
|
break;
|
|
|
|
WinHelp(((LPHELPINFO)lParam)->hItemHandle, aszHelpFile,
|
|
HELP_WM_HELP, (UINT_PTR)(LPVOID)aKeyWordIds);
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam)){
|
|
BOOL f;
|
|
|
|
case IDOK:
|
|
/* Change auto-repeat on the fly:
|
|
* If the auto-repeat option has changed
|
|
* and we're playing right now, toggle
|
|
* the appropriate global option and call
|
|
* PlayMCI(). This will update things.
|
|
* Note that if we are currently playing
|
|
* a selection, this causes the whole clip
|
|
* to be played. Is there any way round this?
|
|
*/
|
|
if ((gwStatus == MCI_MODE_PLAY)
|
|
&&(((gwOptions & OPT_AUTOREP) == OPT_AUTOREP)
|
|
!= (BOOL)IsDlgButtonChecked(hwnd, OPT_AUTOREP)))
|
|
{
|
|
gwOptions ^= OPT_AUTOREP;
|
|
PlayMCI(0,0);
|
|
}
|
|
|
|
gwOptions &= OPT_SCALE; // keep the Scale Mode
|
|
|
|
/* Take advantage of the fact that the button IDS are the */
|
|
/* same as the bit fields. */
|
|
for (w = OPT_FIRST; w <= OPT_LAST; w <<= 1)
|
|
if (IsDlgButtonChecked(hwnd, w))
|
|
gwOptions |= w;
|
|
|
|
if (IsDlgButtonChecked(hwnd, OPT_BAR))
|
|
{
|
|
GetWindowText(GetDlgItem(hwnd, IDC_TITLETEXT),
|
|
gachCaption, CHAR_COUNT(gachCaption));
|
|
|
|
if (gachCaption[0])
|
|
gwOptions |= OPT_TITLE;
|
|
else
|
|
gwOptions &= ~OPT_TITLE;
|
|
}
|
|
|
|
DirtyObject(FALSE);
|
|
EndDialog(hwnd, TRUE);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, FALSE);
|
|
break;
|
|
|
|
case OPT_BAR:
|
|
f = IsDlgButtonChecked(hwnd, OPT_BAR);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_CAPTIONTEXT), f);
|
|
EnableWindow(GetDlgItem(hwnd, IDC_TITLETEXT), f);
|
|
|
|
if(f) {
|
|
SetWindowText(GetDlgItem(hwnd, IDC_TITLETEXT), gachCaption);
|
|
} else {
|
|
GetWindowText(GetDlgItem(hwnd, IDC_TITLETEXT),
|
|
gachCaption, CHAR_COUNT(gachCaption));
|
|
SetWindowText(GetDlgItem(hwnd, IDC_TITLETEXT), TEXT(""));
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------------+
|
|
| mciDialog - bring up the dialog for MCI Send Command |
|
|
| |
|
|
+--------------------------------------------------------------*/
|
|
BOOL FAR PASCAL mciDialog(HWND hwnd)
|
|
{
|
|
//FARPROC fpfn;
|
|
|
|
//fpfn = MakeProcInstance((FARPROC)mciDlgProc, ghInst);
|
|
DialogBox(ghInst, MAKEINTATOM(DLG_MCICOMMAND), hwnd, mciDlgProc);
|
|
// FreeProcInstance missing anyway
|
|
|
|
return TRUE; // should we check return value?
|
|
}
|
|
|
|
|
|
/* StripLeadingAndTrailingWhiteSpace
|
|
*
|
|
* Removes blanks at the beginning and end of the string.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* pIn - Pointer to the beginning of the string
|
|
*
|
|
* InLen - Length of the input string. If 0, the length will be checked.
|
|
*
|
|
* pOutLen - Pointer to a buffer to receive the length of the output string.
|
|
*
|
|
* Return:
|
|
*
|
|
* Pointer to the output string.
|
|
*
|
|
* Remarks:
|
|
*
|
|
* If InLen == *pOutLen, the string has not changed.
|
|
*
|
|
* This routine is destructive: all trailing white space is converted
|
|
* to NULLs.
|
|
*
|
|
*
|
|
* Andrew Bell, 4 January 1995
|
|
*/
|
|
LPTSTR StripLeadingAndTrailingWhiteSpace(LPTSTR pIn, DWORD InLen, LPDWORD pOutLen)
|
|
{
|
|
LPTSTR pOut = pIn;
|
|
DWORD Len = InLen;
|
|
|
|
if (Len == 0)
|
|
Len = lstrlen(pIn);
|
|
|
|
/* Strip trailing blanks:
|
|
*/
|
|
while ((Len > 0) && (pOut[Len - 1] == TEXT(' ')))
|
|
{
|
|
pOut[Len - 1] = TEXT('\0');
|
|
Len--;
|
|
}
|
|
|
|
/* Strip leading blanks:
|
|
*/
|
|
while ((Len > 0) && (*pOut == TEXT(' ')))
|
|
{
|
|
pOut++;
|
|
Len--;
|
|
}
|
|
|
|
if (pOutLen)
|
|
*pOutLen = Len;
|
|
|
|
return pOut;
|
|
}
|
|
|
|
|
|
INT_PTR FAR PASCAL _EXPORT mciDlgProc(HWND hwnd, unsigned msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
TCHAR ach[MCI_STRING_LENGTH];
|
|
UINT w;
|
|
DWORD dw;
|
|
LPTSTR pStrip;
|
|
DWORD NewLen;
|
|
|
|
switch (msg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
SendDlgItemMessage(hwnd, IDC_MCICOMMAND, EM_LIMITTEXT, CHAR_COUNT(ach) -1, 0);
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDOK:
|
|
w = GetDlgItemText(hwnd, IDC_MCICOMMAND, ach, CHAR_COUNT(ach));
|
|
|
|
/* Strip off any white space at the start of the command,
|
|
* otherwise we get an MCI error. Remove it from the
|
|
* end also.
|
|
*/
|
|
pStrip = StripLeadingAndTrailingWhiteSpace(ach, w, &NewLen);
|
|
|
|
if (w > NewLen)
|
|
{
|
|
SetDlgItemText(hwnd, IDC_MCICOMMAND, pStrip);
|
|
w = GetDlgItemText(hwnd, IDC_MCICOMMAND, ach, CHAR_COUNT(ach));
|
|
}
|
|
|
|
if (w == 0)
|
|
break;
|
|
|
|
SendDlgItemMessage(hwnd, IDC_MCICOMMAND, EM_SETSEL, 0, (LPARAM)-1);
|
|
|
|
dw = SendStringMCI(ach, ach, CHAR_COUNT(ach));
|
|
|
|
if (dw != 0)
|
|
{
|
|
mciGetErrorString(dw, ach, CHAR_COUNT(ach));
|
|
// Error1(hwnd, IDS_DEVICEERROR, (LPTSTR)ach);
|
|
}
|
|
|
|
SetDlgItemText(hwnd, IDC_RESULT, ach);
|
|
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, FALSE);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|