📄 mciwnd.c
字号:
break;
}
}
static LRESULT MCIWND_Command(MCIWndInfo *mwi, WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case CTL_PLAYSTOP: MCIWND_ToggleState(mwi); break;
case CTL_MENU:
case CTL_TRACKBAR:
default:
FIXME("support for command %04x not implement yet\n", LOWORD(wParam));
}
return 0L;
}
static void MCIWND_notify_media(MCIWndInfo *mwi)
{
if (mwi->dwStyle & (MCIWNDF_NOTIFYMEDIAA | MCIWNDF_NOTIFYMEDIAW))
{
if (!mwi->lpName)
{
static const WCHAR empty_str[1];
SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYMEDIA, (WPARAM)mwi->hWnd, (LPARAM)empty_str);
}
else
{
if (mwi->dwStyle & MCIWNDF_NOTIFYANSI)
{
char *ansi_name;
int len;
len = WideCharToMultiByte(CP_ACP, 0, mwi->lpName, -1, NULL, 0, NULL, NULL);
ansi_name = HeapAlloc(GetProcessHeap(), 0, len);
WideCharToMultiByte(CP_ACP, 0, mwi->lpName, -1, ansi_name, len, NULL, NULL);
SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYMEDIA, (WPARAM)mwi->hWnd, (LPARAM)ansi_name);
HeapFree(GetProcessHeap(), 0, ansi_name);
}
else
SendMessageW(mwi->hwndOwner, MCIWNDM_NOTIFYMEDIA, (WPARAM)mwi->hWnd, (LPARAM)mwi->lpName);
}
}
}
static MCIERROR mci_generic_command(MCIWndInfo *mwi, UINT cmd)
{
MCI_GENERIC_PARMS mci_generic;
mci_generic.dwCallback = 0;
mwi->lasterror = mciSendCommandW(mwi->mci, cmd, 0, (DWORD_PTR)&mci_generic);
if (mwi->lasterror)
return mwi->lasterror;
MCIWND_notify_mode(mwi);
MCIWND_UpdateState(mwi);
return 0;
}
static LRESULT mci_get_devcaps(MCIWndInfo *mwi, UINT cap)
{
MCI_GETDEVCAPS_PARMS mci_devcaps;
mci_devcaps.dwItem = cap;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_GETDEVCAPS,
MCI_GETDEVCAPS_ITEM,
(DWORD_PTR)&mci_devcaps);
if (mwi->lasterror)
return 0;
return mci_devcaps.dwReturn;
}
static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
MCIWndInfo *mwi;
TRACE("%p %04x %08x %08lx\n", hWnd, wMsg, wParam, lParam);
mwi = (MCIWndInfo*)GetWindowLongW(hWnd, 0);
if (!mwi && wMsg != WM_CREATE)
return DefWindowProcW(hWnd, wMsg, wParam, lParam);
switch (wMsg)
{
case WM_CREATE:
MCIWND_Create(hWnd, (CREATESTRUCTW *)lParam);
break;
case WM_DESTROY:
if (mwi->uTimer)
KillTimer(hWnd, mwi->uTimer);
if (mwi->mci)
SendMessageW(hWnd, MCI_CLOSE, 0, 0);
HeapFree(GetProcessHeap(), 0, mwi);
DestroyWindow(GetDlgItem(hWnd, CTL_MENU));
DestroyWindow(GetDlgItem(hWnd, CTL_PLAYSTOP));
DestroyWindow(GetDlgItem(hWnd, CTL_TRACKBAR));
break;
case WM_PAINT:
{
MCI_DGV_UPDATE_PARMS mci_update;
PAINTSTRUCT ps;
mci_update.hDC = (wParam) ? (HDC)wParam : BeginPaint(hWnd, &ps);
mciSendCommandW(mwi->mci, MCI_UPDATE,
MCI_DGV_UPDATE_HDC | MCI_DGV_UPDATE_PAINT,
(DWORD_PTR)&mci_update);
if (!wParam) EndPaint(hWnd, &ps);
return 1;
}
case WM_COMMAND:
return MCIWND_Command(mwi, wParam, lParam);
case WM_NCACTIVATE:
if (mwi->uTimer)
{
KillTimer(hWnd, mwi->uTimer);
mwi->uTimer = SetTimer(hWnd, 1, wParam ? mwi->active_timer : mwi->inactive_timer, NULL);
}
break;
case WM_TIMER:
MCIWND_UpdateState(mwi);
return 0;
case WM_SIZE:
SetWindowPos(GetDlgItem(hWnd, CTL_PLAYSTOP), 0, 0, HIWORD(lParam) - 32, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
SetWindowPos(GetDlgItem(hWnd, CTL_MENU), 0, 32, HIWORD(lParam) - 32, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
SetWindowPos(GetDlgItem(hWnd, CTL_TRACKBAR), 0, 64, HIWORD(lParam) - 32, LOWORD(lParam) - 64, 32, SWP_NOACTIVATE);
if (!(mwi->dwStyle & MCIWNDF_NOAUTOSIZEMOVIE))
{
RECT rc;
rc.left = rc.top = 0;
rc.right = LOWORD(lParam);
rc.bottom = HIWORD(lParam);
if (!(mwi->dwStyle & MCIWNDF_NOPLAYBAR))
rc.bottom -= 32; /* subtract the height of the playbar */
SendMessageW(hWnd, MCIWNDM_PUT_DEST, 0, (LPARAM)&rc);
}
MCIWND_notify_size(mwi);
break;
case MM_MCINOTIFY:
MCIWND_notify_mode(mwi);
MCIWND_UpdateState(mwi);
return 0;
case MCIWNDM_OPENA:
{
UNICODE_STRING nameW;
TRACE("MCIWNDM_OPENA %s\n", debugstr_a((LPSTR)lParam));
RtlCreateUnicodeStringFromAsciiz(&nameW, (LPCSTR)lParam);
lParam = (LPARAM)nameW.Buffer;
}
/* fall through */
case MCIWNDM_OPENW:
{
RECT rc;
HCURSOR hCursor;
MCI_OPEN_PARMSW mci_open;
MCI_GETDEVCAPS_PARMS mci_devcaps;
WCHAR aliasW[64];
WCHAR drv_name[MAX_PATH];
static const WCHAR formatW[] = {'%','d',0};
static const WCHAR mci32W[] = {'m','c','i','3','2',0};
static const WCHAR system_iniW[] = {'s','y','s','t','e','m','.','i','n','i',0};
TRACE("MCIWNDM_OPENW %s\n", debugstr_w((LPWSTR)lParam));
if (wParam == MCIWNDOPENF_NEW)
{
SendMessageW(hWnd, MCIWNDM_NEWW, 0, lParam);
goto end_of_mci_open;
}
if (mwi->uTimer)
{
KillTimer(hWnd, mwi->uTimer);
mwi->uTimer = 0;
}
hCursor = LoadCursorW(0, (LPWSTR)IDC_WAIT);
hCursor = SetCursor(hCursor);
mci_open.lpstrElementName = (LPWSTR)lParam;
wsprintfW(aliasW, formatW, (int)hWnd + 1);
mci_open.lpstrAlias = aliasW;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_OPEN,
MCI_OPEN_ELEMENT | MCI_OPEN_ALIAS | MCI_WAIT,
(DWORD_PTR)&mci_open);
SetCursor(hCursor);
if (mwi->lasterror && !(mwi->dwStyle & MCIWNDF_NOERRORDLG))
{
/* FIXME: get the caption from resources */
static const WCHAR caption[] = {'M','C','I',' ','E','r','r','o','r',0};
WCHAR error_str[MAXERRORLENGTH];
mciGetErrorStringW(mwi->lasterror, error_str, MAXERRORLENGTH);
MessageBoxW(hWnd, error_str, caption, MB_ICONEXCLAMATION | MB_OK);
MCIWND_notify_error(mwi);
goto end_of_mci_open;
}
mwi->mci = mci_open.wDeviceID;
mwi->alias = (int)hWnd + 1;
mwi->lpName = HeapAlloc(GetProcessHeap(), 0, (strlenW((LPWSTR)lParam) + 1) * sizeof(WCHAR));
strcpyW(mwi->lpName, (LPWSTR)lParam);
MCIWND_UpdateState(mwi);
mci_devcaps.dwItem = MCI_GETDEVCAPS_DEVICE_TYPE;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_GETDEVCAPS,
MCI_GETDEVCAPS_ITEM,
(DWORD_PTR)&mci_devcaps);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
goto end_of_mci_open;
}
mwi->dev_type = mci_devcaps.dwReturn;
drv_name[0] = 0;
SendMessageW(hWnd, MCIWNDM_GETDEVICEW, 256, (LPARAM)drv_name);
if (drv_name[0] && GetPrivateProfileStringW(mci32W, drv_name, NULL,
drv_name, MAX_PATH, system_iniW))
mwi->hdrv = OpenDriver(drv_name, NULL, 0);
if (mwi->dev_type == MCI_DEVTYPE_DIGITAL_VIDEO)
{
MCI_DGV_WINDOW_PARMSW mci_window;
mci_window.hWnd = hWnd;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_WINDOW,
MCI_DGV_WINDOW_HWND,
(DWORD_PTR)&mci_window);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
goto end_of_mci_open;
}
}
if (SendMessageW(hWnd, MCIWNDM_GET_DEST, 0, (LPARAM)&rc) == 0)
{
mwi->size.cx = rc.right - rc.left;
mwi->size.cy = rc.bottom - rc.top;
rc.right = MulDiv(mwi->size.cx, mwi->zoom, 100);
rc.bottom = MulDiv(mwi->size.cy, mwi->zoom, 100);
SendMessageW(hWnd, MCIWNDM_PUT_DEST, 0, (LPARAM)&rc);
}
else
{
GetClientRect(hWnd, &rc);
rc.bottom = rc.top;
}
if (!(mwi->dwStyle & MCIWNDF_NOPLAYBAR))
rc.bottom += 32; /* add the height of the playbar */
AdjustWindowRect(&rc, GetWindowLongW(hWnd, GWL_STYLE), FALSE);
SetWindowPos(hWnd, 0, 0, 0, rc.right - rc.left,
rc.bottom - rc.top, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
SendDlgItemMessageW(hWnd, CTL_TRACKBAR, TBM_SETRANGEMIN, 0L, 0L);
SendDlgItemMessageW(hWnd, CTL_TRACKBAR, TBM_SETRANGEMAX, 1,
SendMessageW(hWnd, MCIWNDM_GETLENGTH, 0, 0));
mwi->uTimer = SetTimer(hWnd, 1, mwi->active_timer, NULL);
MCIWND_notify_media(mwi);
end_of_mci_open:
if (wMsg == MCIWNDM_OPENA)
HeapFree(GetProcessHeap(), 0, (void *)lParam);
return mwi->lasterror;
}
case MCIWNDM_GETDEVICEID:
TRACE("MCIWNDM_GETDEVICEID\n");
return mwi->mci;
case MCIWNDM_GETALIAS:
TRACE("MCIWNDM_GETALIAS\n");
return mwi->alias;
case MCIWNDM_GET_SOURCE:
{
MCI_DGV_RECT_PARMS mci_rect;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_WHERE,
MCI_DGV_WHERE_SOURCE,
(DWORD_PTR)&mci_rect);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return mwi->lasterror;
}
*(RECT *)lParam = mci_rect.rc;
TRACE("MCIWNDM_GET_SOURCE: %s\n", wine_dbgstr_rect(&mci_rect.rc));
return 0;
}
case MCIWNDM_GET_DEST:
{
MCI_DGV_RECT_PARMS mci_rect;
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_WHERE,
MCI_DGV_WHERE_DESTINATION,
(DWORD_PTR)&mci_rect);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return mwi->lasterror;
}
*(RECT *)lParam = mci_rect.rc;
TRACE("MCIWNDM_GET_DEST: %s\n", wine_dbgstr_rect(&mci_rect.rc));
return 0;
}
case MCIWNDM_PUT_SOURCE:
{
MCI_DGV_PUT_PARMS mci_put;
mci_put.rc = *(RECT *)lParam;
TRACE("MCIWNDM_PUT_SOURCE: %s\n", wine_dbgstr_rect(&mci_put.rc));
mwi->lasterror = mciSendCommandW(mwi->mci, MCI_PUT,
MCI_DGV_PUT_SOURCE,
(DWORD_PTR)&mci_put);
if (mwi->lasterror)
{
MCIWND_notify_error(mwi);
return mwi->lasterror;
}
return 0;
}
case MCIWNDM_PUT_DEST:
{
MCI_DGV_PUT_PARMS mci_put;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -