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

📄 hnetclientdlgbar.cpp

📁 使用HOOPS库开发的一个教学演示工具。
💻 CPP
字号:
// HNetClientDlgBar.cpp : implementation file// standard includes#include "stdafx.h"#include <assert.h>#include "resource.h"#include "hc.h"#include "HNetClientDlgBar.h"#include "HNet.h"#include "HSelectionSet.h"#include "HNetMessageRegistrar.h"#include "HSharedKey.h"#include "HNetMgr.h"#include "hoopstest.h"#include "HUtilityLocaleString.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifIMPLEMENT_DYNAMIC(HNetClientDlgBar, CDialogBar)/////////////////////////////////////////////////////////////////////////////// HNetClientDlgBar dialogHNetClientDlgBar::HNetClientDlgBar(HNetClient* pHNetClient, HBaseView* pBaseView){	assert( pHNetClient );	assert( pBaseView );	m_pHNetClient		= pHNetClient;	m_pHView			= pBaseView;	m_pHNetMsgRegistrar	= 0;	//{{AFX_DATA_INIT(HNetClientDlgBar)		// NOTE: the ClassWizard will add member initialization here	//}}AFX_DATA_INIT}HNetClientDlgBar::~HNetClientDlgBar(){	ChoopstestApp* pApp = (ChoopstestApp*) AfxGetApp();	assert( pApp );	if(m_pHNetClient)	{		if(m_pHNetMsgRegistrar) 		{			m_pHNetMsgRegistrar->UnSetHandlers();			delete m_pHNetMsgRegistrar;			m_pHNetMsgRegistrar = 0;		}		// quit the session before dying		HNetMgr* pHNetMgr = pApp->GetHNetMgr();		assert( pHNetMgr );		pHNetMgr->QuitSession( m_pHNetClient );	}}BEGIN_MESSAGE_MAP(HNetClientDlgBar, CDialogBar)	//{{AFX_MSG_MAP(HNetClientDlgBar)	ON_UPDATE_COMMAND_UI(IDC_BUTTON_SESSIONCONTROL, OnUpdateButtonSessionControl)	ON_BN_CLICKED(IDC_BUTTON_SESSIONCONTROL, OnButtonSessionControl)	//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// HNetClientDlgBar message handlersBOOL HNetClientDlgBar::Create(CWnd * pParentWnd, LPCTSTR lpszTemplateName,	UINT nStyle, UINT nID){	// Let MFC Create the control	if(!CDialogBar::Create(pParentWnd, lpszTemplateName, nStyle, nID))		return FALSE;	// Since there is no WM_INITDIALOG message we have to call	// our own InitDialog function ourselves after m_hWnd is valid	if(!OnInitDialogBar())		return FALSE;	return TRUE;}BOOL HNetClientDlgBar::Create(CWnd * pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID){	if(!CDialogBar::Create(pParentWnd, MAKEINTRESOURCE(nIDTemplate), nStyle, nID))		return FALSE;	// Since there is no WM_INITDIALOG message we have to call	// our own InitDialog function ourselves after m_hWnd is valid	if(!OnInitDialogBar())		return FALSE;	return TRUE;}BOOL HNetClientDlgBar::OnInitDialogBar(){	m_bAutoDelete = FALSE;	// Support for the MFC DDX model 	// If you do not want this do not call the base class	// from derived classes	UpdateData(FALSE);	//Begin: Init the HNet stuff	m_pHView->SetEmitMessageFunction(emit_message_function, (void*) this);	m_pHNetMsgRegistrar = new HNetMessageRegistrar(m_pHView, m_pHNetClient);	m_pHNetMsgRegistrar->SetHandlers();	m_pHView->StartSharedKey();	m_pHView->GetSharedKey()->Reset();	m_pHView->GetSharedKey()->SetupStreamToolkit(m_pHView->GetModel()->GetStreamFileTK());	// unblock the message processing	m_pHNetClient->BlockMessageProcessing(false);	m_pHNetClient->SetPointCastInputFunction(pointcast_update_function, (void*)this);	m_pHNetClient->SetClientUpdateNoticeFunction(client_update_notice_function, (void*)this);	m_pHNetClient->SetControlTokenNoticeFunction(control_token_notice_function, (void *)this);	m_pHNetClient->SetConditionNoticeFunction(condition_notice_function, (void *)this);	//End: Init the HNet stuff	// set the session and client names	SetDlgItemText( IDC_STATIC_SESSIONNAME, H_TEXT(m_pHNetClient->GetSessionName()) );	SetDlgItemText( IDC_STATIC_CLIENTNAME, H_TEXT(m_pHNetClient->GetName()) );	// set appropriate text on the control button	if(m_pHNetClient->HasControlToken())		SetDlgItemText(IDC_BUTTON_SESSIONCONTROL, _T("Release Control"));	else		SetDlgItemText(IDC_BUTTON_SESSIONCONTROL, _T("Request Control"));	// refresh the client peer list	refresh_clients_list();	return TRUE;}void HNetClientDlgBar::DoDataExchange(CDataExchange* pDX){	//Derived Classes Overide this function	ASSERT(pDX);	CDialogBar::DoDataExchange(pDX);	// In derived class call the DDX_??? functions to set/retrieve values	// of your controls. See example derived class for how to do this.}void HNetClientDlgBar ::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler){	UpdateDialogControls(pTarget, bDisableIfNoHndler);}void HNetClientDlgBar::OnButtonSessionControl(){	if(m_pHNetClient->HasControlToken()) 		m_pHNetClient->ReleaseControlToken();	else		m_pHNetClient->RequestControlToken();}BOOL HNetClientDlgBar::PreTranslateMessage(MSG* pMsg) {	if(pMsg->message == WM_KEYDOWN)	{		CWnd* chat_ip = GetDlgItem(IDC_EDIT_CHATINPUT);		if( chat_ip && (chat_ip == GetFocus()) )		{			if(pMsg->hwnd == chat_ip->m_hWnd)			{				if(pMsg->wParam == VK_RETURN)				{					send_chat_message();					return TRUE;				}			}		}	}	return CDialogBar::PreTranslateMessage(pMsg);}void HNetClientDlgBar::OnUpdateButtonSessionControl(CCmdUI* pCmdUI){     pCmdUI->Enable(TRUE);}bool HNetClientDlgBar::HasControlToken(){	return m_pHNetClient->HasControlToken();}void HNetClientDlgBar::send_chat_message(){#define MAX_HNET_CLIENTS_SELECTED 500	CString cs_chat_ip;	GetDlgItemText(IDC_EDIT_CHATINPUT, cs_chat_ip);	char message_buffer[2046];	sprintf(message_buffer, "CHAT %s> %s", m_pHNetClient->GetName(), cs_chat_ip);	CListBox* peers_list = (CListBox*) GetDlgItem(IDC_LIST_CLIENTS);	assert( peers_list );	int n_sel_peers = peers_list->GetSelCount();	assert( n_sel_peers < MAX_HNET_CLIENTS_SELECTED );	if( n_sel_peers < 1 )	{		m_pHNetClient->SendBroadCast(message_buffer);		return;	}	int sel_peers_indices[MAX_HNET_CLIENTS_SELECTED];	n_sel_peers = peers_list->GetSelItems( MAX_HNET_CLIENTS_SELECTED-1, sel_peers_indices);	assert( n_sel_peers != LB_ERR );	CString peers_name_list;	for( int i = 0; i < n_sel_peers; i++ )	{		CString this_peer;		peers_list->GetText(sel_peers_indices[i], this_peer);		peers_name_list = peers_name_list + " " + this_peer;	}	m_pHNetClient->SendPointCast(H_ASCII_TEXT(peers_name_list), message_buffer);	SetDlgItemText(IDC_EDIT_CHATINPUT, _T(""));}void HNetClientDlgBar::refresh_clients_list(){	CListBox* client_list = (CListBox*) GetDlgItem(IDC_LIST_CLIENTS);	assert(client_list);	client_list->ResetContent();	m_pHNetClient->EnumerateSessionPeers(enumerate_client_helper, (void *)client_list);}void HNetClientDlgBar::emit_message_function(const char * message, unsigned int length, void * user_data){	HNetClientDlgBar* pClientDlg = (HNetClientDlgBar*)user_data;	if(!length)		pClientDlg->m_pHNetClient->Send(message);	else		pClientDlg->m_pHNetClient->Send(message, length);}void HNetClientDlgBar::client_update_notice_function(void * user_data){	HNetClientDlgBar * self = (HNetClientDlgBar*) user_data;	self->refresh_clients_list();}void HNetClientDlgBar::enumerate_client_helper(const char * name, void * user_data){	((CListBox *)user_data)->AddString(H_TEXT(name));}void HNetClientDlgBar::pointcast_update_function(const char * message, unsigned int message_length, void * user_data){	if(message_length>5)	{		if( message[0] == 'C' && 			message[1] == 'H' &&			message[2] == 'A' &&			message[3] == 'T')		{			message += 5;			message_length -= 5;			HNetClientDlgBar * self = (HNetClientDlgBar*) user_data;			if(self)			{				// is there any better way to append lines to a multiline edit control				char * t_buffer = new char[message_length+3];				memcpy(t_buffer, message, message_length);				t_buffer[message_length] = '\r';				t_buffer[message_length+1] = '\n';				t_buffer[message_length+2] = '\0';				CEdit* chat_out = (CEdit*) self->GetDlgItem(IDC_EDIT_CHATOUTPUT);				chat_out->ReplaceSel(H_TEXT(t_buffer));				delete t_buffer;			}		}	}}void HNetClientDlgBar::control_token_notice_function(bool has_control, void * user_data) { 	// this is our Network dialog 	HNetClientDlgBar* pHNetClientDlg = (HNetClientDlgBar*) user_data; 	// if we have control pop a dialog box asking for user to release control 	if(pHNetClientDlg->m_pHNetClient->HasControlToken())	{ 		AfxMessageBox(_T("A request was made for you to release control")); 	} 	else	{ 		if(has_control) 			pHNetClientDlg->SetDlgItemText(IDC_BUTTON_SESSIONCONTROL, _T("Release Control"));		else 			pHNetClientDlg->SetDlgItemText(IDC_BUTTON_SESSIONCONTROL, _T("Request Control"));//		self->EmitControlChanged(has_control); 	} } void HNetClientDlgBar::condition_notice_function(unsigned int condition, void * user_data){	HNetClientDlgBar * self = (HNetClientDlgBar*) user_data;		switch(condition) 	{	case HNET_CONDITION_SESSION_DELETED:			AfxMessageBox(_T("This session has been closed\nplease exit this client"));			break;	case HNET_CONDITION_CLIENT_KICKED:			AfxMessageBox( _T("This client has been kicked\n")				_T("This is probably from inactivity\n")				_T("by this client or it's session\n")				_T("please exit this client"));			break;	//THESE ARE HANDLED ELSE WHERE 	case HNET_CONDITION_CLIENT_UPDATE:	//	printf("HNET_CONDITION_CLIENT_UPDATE\n");		break;	case HNET_CONDITION_CONTROL_REQUESTED:	//	printf("HNET_CONDITION_CONTROL_REQUESTED\n");		break;	case HNET_CONDITION_CONTROL_REVOKED:	//	printf("HNET_CONDITION_CONTROL_REVOKED\n");		break;	case HNET_CONDITION_CONTROL_GRANTED:	//	printf("HNET_CONDITION_CONTROL_GRANTED\n");		break;	default:break;	}}

⌨️ 快捷键说明

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