📄 hnetclientdlgbar.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 + -