📄 dde_ui.cpp
字号:
unsigned int uiLow, uiHi;
UnpackDDElParam(WM_DDE_ADVISE, lParam, &uiLow, &uiHi);
FreeDDElParam(WM_DDE_ADVISE, lParam);
hDDEAdvise = (GLOBALHANDLE)uiLow;
aItem = (ATOM)uiHi;
lpDDEAdvise = (DDEADVISE *)GlobalLock(hDDEAdvise);
hwndClient = (HWND)wParam;
if ((lpDDEAdvise) && (lpDDEAdvise->cfFormat == CF_TEXT)) {
GlobalGetAtomName(aItem, command, sizeof(command));
cmd = command;
CollectToSeparator(&cmd, ' ', s);
if ((CommandSearch(zCommands, 11, s, &index)) && (index == kFileName)) {
if (!FindAdvise(hwndClient, typeFromIndex[index])) {
deferUpd = lpDDEAdvise->fDeferUpd;
ackReq = lpDDEAdvise->fAckReq;
advise = new FreeAmpAdvise((HWND)hwndClient, index, (char)deferUpd, (char)ackReq);
GlobalUnlock(hDDEAdvise);
GlobalFree(hDDEAdvise);
ddeAck.bAppReturnCode = 0;
ddeAck.reserved = 0;
ddeAck.fBusy = FALSE;
if (advise) {
if (adviseList)
adviseList->Add(advise);
else
adviseList = advise;
ddeAck.fAck = TRUE;
} else
ddeAck.fAck = FALSE;
wStatus = *(WORD *)&ddeAck;
if (!PostMessage(hwndClient, WM_DDE_ACK, (WPARAM)hwnd, PackDDElParam(WM_DDE_ACK, wStatus, aItem))) {
GlobalFree(hDDEAdvise);
GlobalDeleteAtom(aItem);
}
successful = TRUE;
}
}
}
if (!successful) {
ddeAck.bAppReturnCode = 0;
ddeAck.reserved = 0;
ddeAck.fBusy = FALSE;
ddeAck.fAck = FALSE;
wStatus = *(WORD *)&ddeAck;
GlobalUnlock(hDDEAdvise);
if (!PostMessage(hwndClient, WM_DDE_ACK, (WPARAM)hwnd, MAKELONG(wStatus, aItem))) {
GlobalFree(hDDEAdvise);
GlobalDeleteAtom(aItem);
}
}
return 0;
}
BOOL DDE_UI::HandleUnadvise(HWND hwnd, WORD wParam, DWORD lParam)
{
HWND hwndClient;
ATOM aItem;
DDEACK ddeAck;
FreeAmpAdvise *p, *q, *adv;
short cfFormat;
short wStatus;
int index;
char command[256];
hwndClient = (HWND)wParam;
cfFormat = (short)LOWORD(lParam);
aItem = HIWORD(lParam);
ddeAck.bAppReturnCode = 0;
ddeAck.reserved = 0;
ddeAck.fBusy = FALSE;
ddeAck.fAck = TRUE;
if ((cfFormat == CF_TEXT) || (cfFormat == 0)) {
if (aItem == NULL) {
p = adviseList; // Remove all advises
while (p) {
q = p;
p = p->GetNext();
delete q;
}
adviseList = NULL;
} else {
GlobalGetAtomName(aItem, command, sizeof(command));
if ((CommandSearch(zCommands, 11, command, &index)) && (index == kFileName)) {
if (NULL != (adv = FindAdvise(hwndClient, typeFromIndex[index]))) {
RemoveAdvise(adv);
delete adv;
} else
ddeAck.fAck = FALSE;
}
}
} else
ddeAck.fAck = FALSE;
wStatus = *(WORD *)&ddeAck;
if (!PostMessage(hwndClient, WM_DDE_ACK, (WPARAM)hwnd, PackDDElParam(WM_DDE_ACK, wStatus, aItem))) {
if (aItem != (ATOM)NULL)
GlobalDeleteAtom(aItem);
}
return 0;
}
BOOL DDE_UI::PostDataMessage(HWND hwndServer, HWND hwndClient, char *question, char *answer,
BOOL fDeferUpd, BOOL fAckReq, BOOL fResponse)
{
ATOM aItem;
DDEACK ddeAck;
DDEDATA FAR *lpDDEData;
GLOBALHANDLE hDDEData;
DWORD dwTime;
MSG msg;
WORD wStatus;
aItem = GlobalAddAtom(question);
if (fDeferUpd)
hDDEData = NULL;
else {
hDDEData = GlobalAlloc(GHND | GMEM_DDESHARE, sizeof(DDEDATA) + strlen(answer));
if (hDDEData) {
lpDDEData = (DDEDATA FAR *)GlobalLock(hDDEData);
lpDDEData->fResponse = fResponse;
lpDDEData->fRelease = TRUE;
lpDDEData->fAckReq = fAckReq;
lpDDEData->cfFormat = CF_TEXT;
lstrcpy((LPSTR)lpDDEData->Value, answer);
GlobalUnlock(hDDEData);
}
}
if (!PostMessage(hwndClient, WM_DDE_DATA, (WPARAM)hwndServer, PackDDElParam(WM_DDE_DATA, (UINT)hDDEData, aItem))) {
if (hDDEData) {
GlobalFree(hDDEData);
hDDEData = NULL;
}
GlobalDeleteAtom(aItem);
return FALSE;
}
if (fAckReq) {
ddeAck.fAck = FALSE;
dwTime = GetCurrentTime();
while (GetCurrentTime() - dwTime < DDE_TIMEOUT) {
if (PeekMessage(&msg, hwndServer, WM_DDE_ACK, WM_DDE_ACK, PM_REMOVE)) {
wStatus = LOWORD(msg.lParam);
ddeAck = *(DDEACK *)&wStatus;
aItem = HIWORD(msg.lParam);
GlobalDeleteAtom(aItem);
break;
}
}
if (ddeAck.fAck == FALSE) {
if (hDDEData)
GlobalFree(hDDEData);
return FALSE;
}
}
return TRUE;
}
long CALLBACK DDE_UI::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
DDE_UI *ui = NULL;
HWND hwndClient;
ATOM aApp, aTop, aItem;
DDEACK ddeAck;
GLOBALHANDLE hDDEPoke, hCommands;
short cfFormat, wStatus;
char question[256];
char command[256];
static char appName[] = "freedde";
static char topic[] = "dde_ui";
long result = FALSE;
switch (msg) {
case WM_CREATE:
break;
case WM_DDE_INITIATE:
aApp = GlobalAddAtom(appName);
aTop = GlobalAddAtom(topic);
if (((LOWORD(lParam) == NULL) || (LOWORD(lParam) == aApp)) &&
((HIWORD(lParam) == NULL) || (HIWORD(lParam) == aTop))) {
if (hwnd) {
SendMessage((HWND)wParam, WM_DDE_ACK, (WPARAM)hwnd, MAKELONG(aApp, aTop));
return(FALSE);
}
}
GlobalDeleteAtom(aApp);
GlobalDeleteAtom(aTop);
return(TRUE);
case WM_DDE_REQUEST:
hwndClient = (HWND)wParam;
cfFormat = LOWORD(lParam);
aItem = HIWORD(lParam);
if (cfFormat == CF_TEXT) {
GlobalGetAtomName(aItem, command, sizeof(command));
strcpy(question, command);
ui = (DDE_UI *)lParam;
ui->InterpretCommand(command);
if (strlen(command) <= 0)
strcpy(command, "ok");
GlobalDeleteAtom(aItem);
PostDataMessage(hwnd, hwndClient, question, command, FALSE, FALSE, TRUE);
} else {
ddeAck.bAppReturnCode = 0;
ddeAck.reserved = 0;
ddeAck.fBusy = FALSE;
ddeAck.fAck = FALSE;
wStatus = *(short *)&ddeAck;
if (!PostMessage(hwndClient, WM_DDE_ACK, (WPARAM)hwnd, MAKELONG(wStatus, aItem)))
GlobalDeleteAtom(aItem);
}
return(FALSE);
case WM_DDE_ADVISE:
ui = (DDE_UI *)lParam;
ui->HandleAdvise(hwnd, wParam, lParam);
result = TRUE;
break;
case WM_DDE_UNADVISE:
ui = (DDE_UI *)lParam;
ui->HandleUnadvise(hwnd, wParam, lParam);
result = TRUE;
break;
case WM_DDE_EXECUTE:
hwndClient = (HWND)wParam;
hCommands = (GLOBALHANDLE)HIWORD(lParam);
ddeAck.bAppReturnCode = 0;
ddeAck.reserved = 0;
ddeAck.fBusy = FALSE;
ddeAck.fAck = FALSE;
wStatus = *(WORD *)&ddeAck;
if (!PostMessage(hwndClient, WM_DDE_ACK, (WPARAM)hwnd, MAKELONG(wStatus, hCommands)))
GlobalFree(hCommands);
return(FALSE);
case WM_DDE_POKE:
hwndClient = (HWND)wParam;
hDDEPoke = (GLOBALHANDLE)LOWORD(lParam);
aItem = HIWORD(lParam);
ddeAck.bAppReturnCode = 0;
ddeAck.reserved = 0;
ddeAck.fBusy = FALSE;
ddeAck.fAck = FALSE;
wStatus = *(WORD *)&ddeAck;
if (!PostMessage(hwndClient, WM_DDE_ACK, (WPARAM)hwnd, MAKELONG(wStatus, aItem))) {
GlobalFree(hDDEPoke);
GlobalDeleteAtom(aItem);
}
return(FALSE);
case WM_DDE_TERMINATE:
if (hwnd)
PostMessage((HWND)wParam, WM_DDE_TERMINATE, (WPARAM)hwnd, 0L);
return(TRUE);
case WM_DESTROY :
PostQuitMessage(0) ;
return 0 ;
default:
result = DefWindowProc(hwnd, msg, wParam, lParam);
}
return (result);
}
Error DDE_UI::AcceptEvent(Event* event)
{
Error result = kError_UnknownErr;
if (event) {
switch (event->Type()) {
case INFO_Playing:
state = UIState_Playing;
break;
case INFO_Paused:
state = UIState_Paused;
break;
case INFO_Stopped:
state = UIState_Stopped;
break;
case INFO_MPEGInfo:
{
MpegInfoEvent *info = (MpegInfoEvent *)event;
char szTemp[256];
secondsPerFrame = info->GetSecondsPerFrame();
sprintf(szTemp, "%d kbps", info->GetBitRate()/1000);
// SendMessage(m_hwndStatus, SB_SETTEXT, 0, (LPARAM)szTemp);
sprintf(szTemp, "%.1f kHz", ((float)info->GetSampleRate())/1000);
// SendMessage(m_hwndStatus, SB_SETTEXT, 1, (LPARAM) szTemp);
break;
}
case INFO_MediaInfo:
{
MediaInfoEvent *info = (MediaInfoEvent*)event;
UpdateAdvises(winHwnd, kAdviseFileName, info->m_filename);
break;
}
case INFO_MediaTimeInfo:
{
MediaTimeInfoEvent *info = (MediaTimeInfoEvent*)event;
char timeString[256] = "00:00:00";
static int32 lastSeconds = 0, lastMinutes = 0, lastHours = 0;
if(lastSeconds != info->m_seconds || lastMinutes != info->m_minutes || lastHours != info->m_hours) {
lastSeconds = info->m_seconds;
lastMinutes = info->m_minutes;
lastHours = info->m_hours;
sprintf(timeString,"%02d:%02d:%02d",info->m_hours, info->m_minutes, info->m_seconds);
// SetWindowText(m_hwndCurrent, timeString);
}
break;
}
case INFO_PlaylistDonePlay:
break;
case CMD_Cleanup:
target->AcceptEvent(new Event(INFO_ReadyToDieUI));
break;
default:
break;
}
result = kError_NoErr;
}
return result;
}
/**********************************************************************************/
FreeAmpAdvise::FreeAmpAdvise(HWND client, short type, char deferUpd, char ackReq)
{
next = NULL;
type = 0;
hwndClient = client;
fDeferUpd = deferUpd;
fAckReq = ackReq;
}
void FreeAmpAdvise::Add(FreeAmpAdvise *theAdvise)
{
if (theAdvise) {
theAdvise->SetNext(next);
next = theAdvise;
}
}
short FreeAmpAdvise::GetType(void)
{
return(type);
}
FreeAmpAdvise *FreeAmpAdvise::GetNext(void)
{
return(next);
}
void FreeAmpAdvise::SetNext(FreeAmpAdvise *newNext)
{
next = newNext;
}
HWND FreeAmpAdvise::GetClient(BOOL *defer, BOOL *ack)
{
if (defer)
*defer = fDeferUpd;
if (ack)
*ack = fAckReq;
return(hwndClient);
}
short FreeAmpAdvise::CheckTypeAndClient(HWND theClient, long theType)
{
return((theClient == hwndClient) && (theType == type));
}
FreeAmpAdvise::~FreeAmpAdvise(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -