// // チャットダイアログクラス // #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include using namespace std; #include "typedef.h" #include "macro.h" #include "VirtuaNESres.h" #include "DebugOut.h" #include "App.h" #include "Pathlib.h" #include "Config.h" #include "NetPlay.h" #include "Wnd.h" #include "ChatDlg.h" // メッセージ DLG_MESSAGE_BEGIN(CChatDlg) DLG_ON_MESSAGE( WM_INITDIALOG, OnInitDialog ) DLG_ON_MESSAGE( WM_DESTROY, OnDestroy ) DLG_ON_MESSAGE( WM_CLOSE, OnClose ) DLG_ON_MESSAGE( WM_ACTIVATE, OnActivate ) DLG_ON_MESSAGE( WM_SETCURSOR, OnSetCursor ) DLG_ON_MESSAGE( WM_SIZE, OnSize ) DLG_ON_MESSAGE( WM_CTLCOLORSTATIC, OnControlColorStatic ) DLG_ON_MESSAGE( WM_COPYDATA, OnCopyData ) // コマンド DLG_COMMAND_BEGIN() DLG_ON_COMMAND_NOTIFY( IDC_NCT_MESSAGE, EN_SETFOCUS, OnMessageFocus ) DLG_ON_COMMAND( IDOK, OnOK ) DLG_ON_COMMAND( IDCANCEL, OnCancel ) DLG_ON_COMMAND( IDC_NCT_SEND, OnSend ) DLG_COMMAND_END() // Notify メッセージ DLG_NOTIFY_BEGIN() DLG_NOTIFY_END() DLG_MESSAGE_END() BOOL CChatDlg::Create( HWND hWndParent ) { // 親はデスクトップにする m_hWnd = ::CreateDialogParam( CApp::GetPlugin(), MAKEINTRESOURCE(IDD_NETPLAY_CHAT), NULL, g_DlgProc, (LPARAM)this ); if( !m_hWnd ) return FALSE; // モードレスダイアログリストに加える CWndList::Add( this ); return TRUE; } void CChatDlg::Destroy() { if( m_hWnd ) { // モードレスダイアログリストから削除 CWndList::Del( this ); ::GetWindowRect( m_hWnd, &Config.netplay.rcChatPos ); ::DestroyWindow( m_hWnd ); m_hWnd = NULL; } } void CChatDlg::SetEditText() { CHAR szText[256+1]; ::GetWindowText( ::GetDlgItem(m_hWnd, IDC_NCT_EDIT), szText, sizeof(szText)-1 ); ::SetWindowText( ::GetDlgItem(m_hWnd, IDC_NCT_EDIT), "" ); if( ::strlen(szText) ) { // clear message window if( ::StrCmpI( szText, "/clear" ) == 0 ) { ::SendDlgItemMessage( m_hWnd, IDC_NCT_MESSAGE, EM_SETSEL, 0, -1 ); ::SendDlgItemMessage( m_hWnd, IDC_NCT_MESSAGE, EM_REPLACESEL, FALSE, (WPARAM)"" ); return; } string str; if( NetPlay.IsConnect() ) { str = "("; str = str + Config.netplay.szNick; str = str + ") "; } str = str + szText; str = str + "\r\n"; // 相手に送信 if( NetPlay.IsConnect() ) { NetPlay.ChatSend( (LPSTR)str.c_str() ); } // 自分自身のメッセージを表示 INT n = GetWindowTextLength( GetDlgItem( m_hWnd, IDC_NCT_MESSAGE ) ); ::SendDlgItemMessage( m_hWnd, IDC_NCT_MESSAGE, EM_SETSEL, (WPARAM)n, (LPARAM)n ); ::SendDlgItemMessage( m_hWnd, IDC_NCT_MESSAGE, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)str.c_str() ); } } DLGMSG CChatDlg::OnCopyData( DLGMSGPARAM ) { COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam; CHAR* lpStr = (CHAR*)pcds->lpData; INT n = GetWindowTextLength( GetDlgItem( hWnd, IDC_NCT_MESSAGE ) ); ::SendDlgItemMessage( hWnd, IDC_NCT_MESSAGE, EM_SETSEL, (WPARAM)n, (LPARAM)n ); ::SendDlgItemMessage( hWnd, IDC_NCT_MESSAGE, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)lpStr ); if( ::GetFocus() != m_hWnd && ::strlen( lpStr ) > 0 ) { ::MessageBeep( MB_OK ); // ::PlaySound( "MailBeep", NULL, SND_ALIAS|SND_ASYNC ); } // メッセージが来たらポップアップさせるため ::SendMessage( CApp::GetHWnd(), WM_VNS_CHATPOPUP, 0, 0 ); return TRUE; } DLGMSG CChatDlg::OnInitDialog( DLGMSGPARAM ) { // DEBUGOUT( "CChatDlg::OnInitDialog\n" ); NetPlay.SetChatWnd( m_hWnd ); // 位置情報を保存 ::GetClientRect( m_hWnd, &m_rcClient ); ::GetWindowRect( ::GetDlgItem(m_hWnd, IDC_NCT_MESSAGE), &m_rcMessage ); ::GetWindowRect( ::GetDlgItem(m_hWnd, IDC_NCT_EDIT), &m_rcEdit ); ::GetWindowRect( ::GetDlgItem(m_hWnd, IDC_NCT_SEND), &m_rcButton ); // クライアント座標への変換 ::ScreenToClient( m_hWnd, (POINT*)&m_rcMessage.left ); ::ScreenToClient( m_hWnd, (POINT*)&m_rcMessage.right ); ::ScreenToClient( m_hWnd, (POINT*)&m_rcEdit.left ); ::ScreenToClient( m_hWnd, (POINT*)&m_rcEdit.right ); ::ScreenToClient( m_hWnd, (POINT*)&m_rcButton.left ); ::ScreenToClient( m_hWnd, (POINT*)&m_rcButton.right ); // ウインドウ位置/サイズの設定 // RECT rc = Config.launcher.rcWindowPos; // if( (rc.right-rc.left) && (rc.bottom-rc.top) ) { // ::SetWindowPos( m_hWnd, NULL, rc.left, rc.top, RCWIDTH(rc), RCHEIGHT(rc), SWP_NOZORDER ); // } // ウインドウ位置/サイズの設定 RECT rc = Config.netplay.rcChatPos; if( (rc.right-rc.left) && (rc.bottom-rc.top) ) { ::SetWindowPos( m_hWnd, NULL, rc.left, rc.top, RCWIDTH(rc), RCHEIGHT(rc), SWP_NOZORDER ); } // 表示 ::ShowWindow( m_hWnd, SW_SHOW ); return TRUE; } DLGMSG CChatDlg::OnDestroy( DLGMSGPARAM ) { return TRUE; } DLGMSG CChatDlg::OnClose( DLGMSGPARAM ) { ::ShowWindow( m_hWnd, SW_HIDE ); // 非表示にするだけ return TRUE; } DLGMSG CChatDlg::OnActivate( DLGMSGPARAM ) { if( LOWORD(wParam) == WA_INACTIVE ) { // DEBUGOUT( "CChatDlg::OnActivate:Inactive\n" ); ::PostMessage( CApp::GetHWnd(), WM_VNS_SHORTCUTENABLE, (WPARAM)TRUE, 0 ); Config.InputKeyboardDisable( FALSE ); } else { // DEBUGOUT( "CChatDlg::OnActivate:Active\n" ); ::PostMessage( CApp::GetHWnd(), WM_VNS_SHORTCUTENABLE, (WPARAM)FALSE, 0 ); Config.InputKeyboardDisable( TRUE ); } return TRUE; } DLGMSG CChatDlg::OnSetCursor( DLGMSGPARAM ) { // DEBUGOUT( "CChatDlg::OnSetCursor\n" ); return FALSE; } DLGMSG CChatDlg::OnSize( DLGMSGPARAM ) { // DEBUGOUT( "CChatDlg::OnSize\n" ); HWND hWndCtrl; RECT rcC, rcT; ::GetClientRect( m_hWnd, &rcC ); // メッセージ枠 if( (hWndCtrl = ::GetDlgItem( m_hWnd, IDC_NCT_MESSAGE )) ) { rcT.left = rcC.left; rcT.right = rcC.right; rcT.top = rcC.top; rcT.bottom = rcC.bottom - (m_rcClient.bottom-m_rcMessage.bottom); ::MoveWindow( hWndCtrl, rcT.left, rcT.top, RCWIDTH(rcT), RCHEIGHT(rcT), TRUE ); } if( (hWndCtrl = ::GetDlgItem( m_hWnd, IDC_NCT_EDIT )) ) { rcT.left = rcC.left; rcT.right = rcC.right - (m_rcClient.right-m_rcEdit.right); rcT.top = rcC.bottom - (m_rcClient.bottom-m_rcEdit.top); rcT.bottom = rcC.bottom - (m_rcClient.bottom-m_rcEdit.bottom); ::MoveWindow( hWndCtrl, rcT.left, rcT.top, RCWIDTH(rcT), RCHEIGHT(rcT), TRUE ); } if( (hWndCtrl = ::GetDlgItem( m_hWnd, IDC_NCT_SEND )) ) { rcT.left = rcC.right - (m_rcClient.right-m_rcButton.left); rcT.right = rcT.left + RCWIDTH(m_rcButton); rcT.top = rcC.bottom - (m_rcClient.bottom-m_rcButton.top); rcT.bottom = rcT.top + RCHEIGHT(m_rcButton); ::MoveWindow( hWndCtrl, rcT.left, rcT.top, RCWIDTH(rcT), RCHEIGHT(rcT), TRUE ); } return FALSE; } DLGMSG CChatDlg::OnControlColorStatic( DLGMSGPARAM ) { if( (HWND)lParam == ::GetDlgItem( m_hWnd, IDC_NCT_MESSAGE ) ) { SetBkColor( (HDC)wParam, (COLORREF)0x00FFFFFF ); bResult = (LRESULT)GetStockObject( WHITE_BRUSH ); return TRUE; } return FALSE; } DLGCMD CChatDlg::OnMessageFocus( DLGCMDPARAM ) { DEBUGOUT( "CChatDlg::OnMessageFocus\n" ); // ::SetFocus( ::GetDlgItem( m_hWnd, IDC_NCT_EDIT ) ); ::SetFocus( m_hWnd ); } DLGCMD CChatDlg::OnOK( DLGCMDPARAM ) { // DEBUGOUT( "CChatDlg::OnOK\n" ); SetEditText(); } DLGCMD CChatDlg::OnCancel( DLGCMDPARAM ) { // DEBUGOUT( "CChatDlg::OnCancel\n" ); ::ShowWindow( m_hWnd, SW_HIDE ); // 非表示にするだけ } DLGCMD CChatDlg::OnSend( DLGCMDPARAM ) { // DEBUGOUT( "CChatDlg::OnSend\n" ); SetEditText(); ::SetFocus( ::GetDlgItem( m_hWnd, IDC_NCT_EDIT ) ); }