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

📄 voipdemo.cpp

📁 Windows CE .Net 下面 VOIP编程的经典实例。对于初学Windows 平台下VOIP编程技术的程序员颇具借鉴意义!
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		{
			dwReturnvalueGetNetworkParams = GetNetworkParams( pNetworkParams, &uSizeNetworkParams );
			if ( dwReturnvalueGetNetworkParams != ERROR_SUCCESS )
			{
				DEBUGMSG( 1, ( L"VoIPDemo: Could not get network info: using default values\r\n" ) );
				g_pLocalUserInfo->put_Name(L"My Name");
				g_pLocalUserInfo->put_Addr(L"My Address");
			}
			else
			{
				wsprintf( szHost, L"%S", pNetworkParams->HostName );
				g_pLocalUserInfo->put_Name(szHost);
				g_pLocalUserInfo->put_Addr(szHost);
				DEBUGMSG( 1, ( L"VoIPDemo: local name is %s\r\n", g_pLocalUserInfo->get_Name() ) );
			}
			
			if ( pAdapterInfo )
				free( pAdapterInfo );
			
			if ( pNetworkParams )
				free( pNetworkParams );
		}		
		
		// store the name and info into the registry
		UpdateLocalUserRegistry(g_pLocalUserInfo->get_Name(), g_pLocalUserInfo->get_Addr(), NULL);
	}


} // end InitializeLocalUser()

/************************************************************************************************

  WndProc

	Process messages for the main window.

	  WM_COMMAND	- process the application menu / toolbar buttons

	  WM_NOTIFY		- process listview message notifications
		
		  LVN_ITEMCHANGING	- Update m_cSelectedBuddy to determine who is selected, etc.
		  LVN_DELETEITEM	- Release IRTCBuddy reference stored inside the listview

	  WM_INITMENUPOPUP - enable / disable the appropriate menu options depending on m_cSelectedBuddy

	  WM_MOUSEMOVE	- call DoMainMouseMove() to check if the cursor goes over one of the toolbar 
						buttons

	  WM_PAINT		- Paint the main window
	  WM_DESTROY	- post a quit message and return

		
 ************************************************************************************************/

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	int wmId, wmEvent, nB;

	switch (message) 
	{		
	case WM_PAINT:
		return DoMainPaint( hWnd, message, wParam, lParam );
		
	case WM_MOUSEMOVE:
		return DoMainMouseMove( hWnd, message, wParam, lParam );
		
	case WM_LBUTTONUP:
		{
			nB = m_nButtonPointed;
			
			// Deselect the buttons (m_nButtonPointed is invalid from now)
			DoMainMouseMove( hWnd, 0, 0, 0 );
			
			switch( m_sButtons[ nB ].r[0] )
			{
				
			case IDB_ADDBTN:
				if ( DialogBox( m_hInstance, (LPCTSTR)IDD_ADDBUDDYBOX, hWnd, ( DLGPROC )Proc_AddBuddy ) == IDOK )
					InvalidateRect( m_hWndMain, NULL, FALSE );
				return 0;
				
			case IDB_SENDBTN:
				SendMessage( m_hWndMain, WM_COMMAND, ID_TOOLS_SENDINSTANTMESSAGE, 0 );
				return 0;
				
			case IDB_CALLBTN:
				SendMessage( m_hWndMain, WM_COMMAND, ID_TOOLS_CALL, 0 );
				return 0;
				
			}
			
			// Figure out if clicked on mystatus o
			POINT ptClick = { LOWORD(lParam), HIWORD(lParam) };
			
			if (PtInRect(&m_rMyStatus, ptClick)) {
				SendMessage( m_hWndMain, WM_COMMAND, ID_FILE_MYSTATUS, 0 );
			}
			
			break;
		} // end WM_LBUTTONUP
		
	case WM_COMMAND:
		wmId    = LOWORD(wParam); 
		wmEvent = HIWORD(wParam); 
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_HELP_ABOUT:
			DialogBox( m_hInstance, (LPCTSTR)IDD_ABOUTBOX, hWnd, ( DLGPROC )Proc_About );
			break;
			
		case IDM_FILE_EXIT:
			DestroyWindow(hWnd);
			break;
			
		case ID_FILE_ADDACONTACT:
			if ( DialogBox( m_hInstance, (LPCTSTR)IDD_ADDBUDDYBOX, hWnd, ( DLGPROC )Proc_AddBuddy ) == IDOK )
				InvalidateRect( m_hWndMain, NULL, FALSE );
			break;
			
		case ID_FILE_EDITCONTACT:
			if ( DialogBox( m_hInstance, (LPCTSTR)IDD_ADDBUDDYBOX, hWnd, ( DLGPROC )Proc_EditBuddy ) == IDOK )
				InvalidateRect( m_hWndMain, NULL, FALSE );
			break;
			
		case ID_FILE_DELETECONTACT:
			if ( MessageBox( NULL, L"Are you sure you want to permanently delete the currently selected contact?", L"Warning", MB_YESNO ) == IDYES )
			{
				RemoveBuddyRTC(m_cSelectedBuddy.pBuddy, m_cSelectedBuddy.btBuddyType, TRUE, m_hInstance);
				
				// Delete the listview item, which owns m_cSelectedBuddy & last pBuddy reference
				FindAndRemoveBuddyListView(m_cSelectedBuddy.pBuddy, m_cSelectedBuddy.eStat);							
				
				InvalidateRect( m_hWndMain, NULL, FALSE );
			}
			break;
			
		case ID_FILE_MYSTATUS:
			if ( DialogBox( m_hInstance, (LPCTSTR)IDD_MYSTATUSBOX, hWnd, ( DLGPROC )Proc_MyStatus ) ==	 IDOK )
				InvalidateRect( m_hWndMain, NULL, FALSE );
			break;				
			
		case ID_FILE_EDITMYINFO:
			// don't want to be able to change my status while a session is active
			if (pSessionWndContainer && pSessionWndContainer->get_ActiveSessionWindow()) {
				break;
			}				 
		
			if ( DialogBox( m_hInstance, (LPCTSTR) IDD_MYINFOBOX, hWnd, ( DLGPROC )Proc_EditMyInfo ) == IDOK )
				InvalidateRect( m_hWndMain, NULL, FALSE);
			break;
			
		case ID_VIEW_TOOLBAR:
			m_sProp.bToolbar = !m_sProp.bToolbar;
			InvalidateRect( m_hWndMain, NULL, FALSE );
			break;
			
		case ID_VIEW_STATUSBAR:
			m_sProp.bStatusbar = !m_sProp.bStatusbar;
			InvalidateRect( m_hWndMain, NULL, TRUE );
			break;
			
		case ID_VIEW_ALWAYSONTOP:
			m_sProp.bAlwaysOnTop = !m_sProp.bAlwaysOnTop;
			SetWindowPos( m_hWndMain, ( m_sProp.bAlwaysOnTop )?HWND_TOPMOST:HWND_NOTOPMOST, 0, 0, 0, 0,
				SWP_NOMOVE|SWP_NOSIZE );
			break;
			
		case ID_TOOLS_SENDINSTANTMESSAGE:
		case ID_TOOLS_CALL:				
			// ensure that a session isn't already running				
			if (pSessionWndContainer && pSessionWndContainer->get_ActiveSessionWindow()) {
				break;
			}				 
			
			// If no buddy is selected, use the pop-up windows to make the calls
			if ( m_cSelectedBuddy.pBuddy )
			{
				// get the information for the selected buddy						
				PARTICIPANT_INFO cPart;
				PARTICIPANT_INFO** ppPart = NULL;
				
				BSTR bstrName = NULL;
				BSTR bstrAddr = NULL;
				
				m_cSelectedBuddy.pBuddy->get_Name(&bstrName);
				cPart.put_Name(bstrName, NO_ALLOC);
				
				m_cSelectedBuddy.pBuddy->get_PresentityURI(&bstrAddr);
 				cPart.put_Addr(bstrAddr, NO_ALLOC);
				
				cPart.pBuddy = m_cSelectedBuddy.pBuddy;
				cPart.btBuddyType = m_cSelectedBuddy.btBuddyType;
				
				switch ( wmId )
				{
				case ID_TOOLS_SENDINSTANTMESSAGE:
					if (!m_cSelectedBuddy.IMCapable())
						break;
					
					CSessionWndContainer::SessionWndCallback( SWCBM_IM_INITIATING_OUTGOING, &cPart, NULL );
					break;
					
				case ID_TOOLS_CALL:
					//  ensure online
					if (!m_cSelectedBuddy.CallCapable())	
						break;
#ifdef NO_PHONE_TO_PHONE
					CSessionWndContainer::SessionWndCallback( SWCBM_CALL_INITIATING_OUTGOING, &cPart, NULL );
#else
					// handle Phone-to-phone calls
					if (m_cSelectedBuddy.btBuddyType == BT_PHONE && g_pLocalUserInfo->get_LocalPhoneURI() != NULL) {
						
						if (m_cSelectedBuddy.iSelectedBuddies == 1) {
							// could be a phone to phone call or regular phone call										
							if (MessageBox(m_hWndMain, 
								L"Would you like to place this call from the phone you have designated in your preferences?", 
								L"Call Type?", MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON1) == IDYES) {
								// P2P handle it
								ppPart = new PARTICIPANT_INFO*[1];												
								*ppPart = new PARTICIPANT_INFO(cPart.get_Name(), cPart.get_Addr(), NULL, BT_PHONE);
								CSessionWndContainer::SessionWndCallback( SWCBM_P2P_CALL_INITIATING_OUTGOING, &ppPart, (VOID*) 1 );
							} else {								
								CSessionWndContainer::SessionWndCallback( SWCBM_CALL_INITIATING_OUTGOING, &cPart, NULL );
							}
						} else {
							// more than one selected buddy, must be a P2P call
							int numParticipants = 0;
							if (!FormCalleeAryListView(&ppPart, &numParticipants)) {
								// error making the list of callee's
								break;
								
							} else {
								CSessionWndContainer::SessionWndCallback( SWCBM_P2P_CALL_INITIATING_OUTGOING, &ppPart, (VOID*) numParticipants);		
							}							
						}
					} else {
						CSessionWndContainer::SessionWndCallback( SWCBM_CALL_INITIATING_OUTGOING, &cPart, NULL );
					}
#endif //NO_PHONE_TO_PHONE
					break;
				}
				
				cPart.Clear();						
			} else {
				// no buddy selected, make a call to a user-specified destination
				switch ( wmId )
				{
				case ID_TOOLS_SENDINSTANTMESSAGE:
					DialogBox( m_hInstance, (LPCTSTR)IDD_SENDMESSAGE, hWnd, ( DLGPROC )Proc_SendIM );
					break;
				case ID_TOOLS_CALL:
					DialogBox( m_hInstance, (LPCTSTR)IDD_MAKEVOICECALL, hWnd, ( DLGPROC )Proc_MakeCall );
					break;
				default:
					break;
				}
			}
			break;
			
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
			
	} // end WM_COMMAND
	
	break;
	
		case WM_CREATE:
			hwndCB = CommandBar_Create( m_hInstance, hWnd, 1 );
			CommandBar_InsertMenubar( hwndCB, m_hInstance, IDM_MENU, 0 );
			
			// Close button (X) is on the title bar -> do not put it on the command bar as well
			//			CommandBar_AddAdornments( hwndCB, 0, 0 );
			break;
			
		case WM_DESTROY:
			{
				// kill any open windows / dialogs that are not children
				if (pSessionWndContainer) {				
					DestroyWindow( pSessionWndContainer->get_ActiveSessionWindowHWnd());
				}				 
				
				CommandBar_Destroy(hwndCB);
				CleanupListViews();								
				PostQuitMessage(0);
			break;
			} // end WM_DESTROY
		case WM_INITMENUPOPUP:
			{
				HMENU hmenuPopup = ( HMENU )wParam;
				CheckMenuItem( hmenuPopup, ID_VIEW_TOOLBAR, MF_BYCOMMAND|( m_sProp.bToolbar )?MF_CHECKED:MF_UNCHECKED );
				CheckMenuItem( hmenuPopup, ID_VIEW_STATUSBAR, MF_BYCOMMAND|( m_sProp.bStatusbar )?MF_CHECKED:MF_UNCHECKED );
				CheckMenuItem( hmenuPopup, ID_VIEW_ALWAYSONTOP, MF_BYCOMMAND|( m_sProp.bAlwaysOnTop )?MF_CHECKED:MF_UNCHECKED );
				EnableMenuItem( hmenuPopup, ID_FILE_EDITMYINFO, MF_BYCOMMAND|MF_ENABLED );
				
				if ( m_cSelectedBuddy.iSelectedBuddies != 1)
				{
					EnableMenuItem( hmenuPopup, ID_FILE_EDITCONTACT, MF_BYCOMMAND|MF_GRAYED );
					EnableMenuItem( hmenuPopup, ID_FILE_DELETECONTACT, MF_BYCOMMAND|MF_GRAYED );
					if (m_cSelectedBuddy.iSelectedBuddies > 1 && m_cSelectedBuddy.btBuddyType == BT_PHONE ||
						m_cSelectedBuddy.iSelectedBuddies == 0)
					{	// for phone to phone sessions, or non-buddy calls
						EnableMenuItem( hmenuPopup, ID_TOOLS_CALL, MF_BYCOMMAND|MF_ENABLED );
					} else {
						EnableMenuItem( hmenuPopup, ID_TOOLS_CALL, MF_BYCOMMAND|MF_GRAYED );
					}

					if (m_cSelectedBuddy.iSelectedBuddies == 0) {
						EnableMenuItem( hmenuPopup, ID_TOOLS_SENDINSTANTMESSAGE, MF_BYCOMMAND|MF_ENABLED );
					} else {
						EnableMenuItem( hmenuPopup, ID_TOOLS_SENDINSTANTMESSAGE, MF_BYCOMMAND|MF_GRAYED );
					}

				} 
				else
				{
					EnableMenuItem( hmenuPopup, ID_FILE_EDITCONTACT, MF_BYCOMMAND|MF_ENABLED );
					EnableMenuItem( hmenuPopup, ID_FILE_DELETECONTACT, MF_BYCOMMAND|MF_ENABLED );
					
					if (m_cSelectedBuddy.CallCapable()) {
						EnableMenuItem( hmenuPopup, ID_TOOLS_CALL, MF_BYCOMMAND|MF_ENABLED );
					} else {
						EnableMenuItem( hmenuPopup, ID_TOOLS_CALL, MF_BYCOMMAND|MF_GRAYED );
					}
					if (m_cSelectedBuddy.IMCapable()) {
						EnableMenuItem( hmenuPopup, ID_TOOLS_SENDINSTANTMESSAGE, MF_BYCOMMAND|MF_ENABLED );
					} else {
						EnableMenuItem( hmenuPopup, ID_TOOLS_SENDINSTANTMESSAGE, MF_BYCOMMAND|MF_GRAYED );
					}
				}				
			}
			
			break;	
			
		case WM_NOTIFY:
			{
				int idCtrl = (int) wParam;
				
				if (idCtrl != IDC_OFFLINEBUDDYLIST && idCtrl != IDC_ONLINEBUDDYLIST || !lParam)
					break;
				
				LPNMLISTVIEW pnmlv = (LPNMLISTVIEW) lParam;
				
				switch(pnmlv->hdr.code) 
				{	
				case LVN_ITEMCHANGING:
					{
						IRTCBuddy* pBuddy = (IRTCBuddy*) pnmlv->lParam;
						
						// item has been selected, determine if any other items should be de-selected, set
						
						if (pnmlv->uChanged != LVIF_STATE) {
							// for now we only care if the state has changed (selected or de-selected)
							return FALSE; // accept the change
						}					
						
						if (pnmlv->uOldState & LVIS_SELECTED && !(pnmlv->uNewState & LVIS_SELECTED)
							|| pnmlv->uOldState & LVIS_FOCUSED && !(pnmlv->uNewState & LVIS_FOCUSED)) {
							m_cSelectedBuddy.iSelectedBuddies--;
							
							if (m_cSelectedBuddy.iSelectedBuddies == 0) {
								m_cSelectedBuddy.Clear();	
							}
							
							InvalidateButton(-100);
							return FALSE;
							
						} else if (!(pnmlv->uOldState & LVIS_SELECTED) && pnmlv->uNewState & LVIS_SELECTED) {
							// changing from de-selected to selected
							// if a buddy is selected on a different list, de-select that buddy first
							// pull down the information for the buddy who's status is changing														
							
							BSTR bstrName = NULL;
							BUDDYTYPE enBt = DetermineBuddyType(pBuddy, EXISTING_BUDDY);
							ESTATUS esStat = GetBuddyStatus(pBuddy, enBt);
							
							if (m_cSelectedBuddy.iSelectedBuddies > 0 && m_idActiveListView != idCtrl) {
								// check if the selected buddy is on this list, if not, de-select him
								HWND hwndList = (pnmlv->hdr.hwndFrom == m_hwndOnlineView) ? m_hwndOfflineView : m_hwndOnlineView;
								int iMax = ListView_GetSelectedCount(hwndList);
								int iItem = -1;
								int i = 0;
								
								for (i = 0; i < iMax; i++) {
									if ((iItem = ListView_GetNextItem(hwndList, iItem, LVNI_SELECTED)) == -1)
										break;									
									ListView_SetItemState(hwndList, iItem, 0, LVIS_SELECTED);
								}
								InvalidateButton(-100);
							}
							
							if (m_cSelectedBuddy.iSelectedBuddies < 1) {
								// go ahead (no-one else selected)
								m_idActiveListView = idCtrl;
								m_cSelectedBuddy.iSelectedBuddies = 1;					
								m_cSelectedBuddy.eStat = esStat;
								m_cSelectedBuddy.btBuddyType = enBt;
								m_cSelectedBuddy.pBuddy = pBuddy;
								InvalidateButton(-100);
								return FALSE;
							}														
							

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -