⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dde_ui.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -