📄 mainwnd.cpp
字号:
#include "MainWnd.h"
#include "WndProc.h"
#include "client.h"
#include "ServerIP.h"
#include "Compression.h"
#include "ColorMode.h"
#include "GridSpacing.h"
#include "Gdi.h"
#include "resource.h"
#define DISCONNECT_MSG "DISCONNECT"
// 服务器IP的类的一个指针
extern CServerIP *pServerIP;
// 压缩类的一个指针
extern CCompression *pCompression;
// 网格空间类的一个指针
extern CGridSpacing *pGridSpacing;
// 颜色模式类的一个指针
extern CColorMode *pColorMode;
// 位图和socket变量
extern "C" char *pDIBitmap;
extern "C" BOOL fDIBitmap;
extern "C" int iWidth,iHeight;
extern "C" int iScreenWidth,iScreenHeight;
extern "C" int iWidth1,iWidth2,iHeight1,iHeight2;
extern "C" int iCompressionLevel;
extern "C" LPBITMAPINFOHEADER lpBitmapIH;
extern "C" SOCKET sClient;
extern "C" BOOL fConnected;
extern "C" struct GdiList GdiStart;
extern "C" struct GdiList *pGdiNode;
extern "C" int nGridX,nGridY;
extern "C" BOOL fGridX,fGridY;
extern "C" WORD bmBitsPixel;
extern "C" UINT port;
// 连接,发送和接收变量
int iSent,iRecv;
char szMouseMessage[81];
BYTE CMainWnd::m_ip[4];
CMainWnd::CMainWnd()
{
// 初始化滚动条
iHScrollPos = 0;
iVScrollPos = 0;
GdiStart.pNext = NULL;
// 设置初始化时间间隔
m_iTimerInterval = 398;
}
CMainWnd::~CMainWnd()
{
delete this;
// 释放全局内存
if (fDIBitmap)
free(pDIBitmap);
// 释放全局区域的内存
pGdiNode = GdiStart.pNext;
while (pGdiNode)
{
if (pGdiNode->Gdi.fDIBitmap)
{
free(pGdiNode->Gdi.pDIBitmap);
free(pGdiNode->Gdi.pDIB);
}
pGdiNode = pGdiNode->pNext;
}
}
void CMainWnd::SetInstance(HINSTANCE hInst)
{
m_hInst = hInst;
}
// 处理WM_CREATE消息
BOOL CMainWnd::OnCreate(HWND hWnd,CREATESTRUCT FAR *lpCreateStruct)
{
//按照WinMains的nCmdShow参数显示窗口
ShowWindow(hWnd,*(LPINT)lpCreateStruct->lpCreateParams);
m_hWnd = hWnd;
m_hMenu = GetMenu(m_hWnd);
EnableMenuItem(m_hMenu,IDM_DISCONNECT,MF_BYCOMMAND|MF_GRAYED);
EnableMenuItem(m_hMenu,IDM_COLORMODE,MF_BYCOMMAND|MF_GRAYED);
// 设置初始化压缩级数
iCompressionLevel = 10;
WSADATA wsd;
char szString[255];
char name[20];
if (WSAStartup(0x202,&wsd) != 0)
{
sprintf(szString,"Failed to load Winsock!");
MessageBox(NULL,szString,"Remote Server",MB_OK);
return 1;
}
GetLocalHostName(name);
GetIpAddress(name,&m_ip[0],&m_ip[1],&m_ip[2],&m_ip[3]);
return TRUE;
}
//处理WM_DESTROY消息
void CMainWnd::OnDestroy(HWND hWnd)
{
if (fDIBitmap)
{
KillTimer(m_hWnd,0);
}
if (fConnected)
{
memset(szMouseMessage,'\0',sizeof(szMouseMessage));
strcpy(szMouseMessage,DISCONNECT_MSG);
// 发送结束消息到服务器端
iSent = Send(sClient,szMouseMessage);
// 关闭socket
closesocket(sClient);
WSACleanup();
// 设置连接状态
fConnected = FALSE;
}
// 发送Windows Quit 消息到窗口
PostMessage(hWnd,WM_QUIT,(WPARAM)0,0L);
}
// 处理WM_SIZE消息
void CMainWnd::OnSize(HWND hWnd,UINT state,int cx,int cy)
{
if (fDIBitmap)
{
GetClientRect(m_hWnd,&m_Rect);
// 按照新的屏幕尺寸设置滚动条
SetScrollRange(m_hWnd,SB_HORZ,0,iScreenWidth - m_Rect.right,FALSE);
SetScrollPos(m_hWnd,SB_HORZ,iHScrollPos,TRUE);
SetScrollRange(m_hWnd,SB_VERT,0,iScreenHeight - m_Rect.bottom,FALSE);
SetScrollPos(m_hWnd,SB_VERT,iVScrollPos,TRUE);
// 生成 WM_PAINT 消息
InvalidateRect(hWnd,NULL,FALSE);
}
}
// 处理WM_PAINT消息
void CMainWnd::OnPaint(HWND hWnd)
{
PAINTSTRUCT ps;
HDC hDC;
struct GdiList *pNode;
int iX1,iX2,iY1,iY2;
hDC = BeginPaint(hWnd,&ps);
if (fDIBitmap)
{
GetClientRect(m_hWnd,&m_Rect);
if (!fConnected)
{
m_hMemDC = CreateCompatibleDC(hDC);
m_hDDBitmap = CreateCompatibleBitmap(hDC,iScreenWidth,iScreenHeight);
SelectObject(m_hMemDC,m_hDDBitmap);
}
pNode = GdiStart.pNext;
while (pNode)
{
if (pNode->Gdi.fDIBitmap)
{
StretchDIBits(m_hMemDC,
pNode->Gdi.iWidth1,pNode->Gdi.iHeight1,
pNode->Gdi.lpBitmapIH->biWidth,pNode->Gdi.lpBitmapIH->biHeight,
0,0,
pNode->Gdi.lpBitmapIH->biWidth,pNode->Gdi.lpBitmapIH->biHeight,
(LPBYTE)pNode->Gdi.lpBitmapIH + (pNode->Gdi.lpBitmapIH->biSize + (1 << pNode->Gdi.lpBitmapIH->biBitCount) * sizeof(RGBQUAD)),
(LPBITMAPINFO)pNode->Gdi.lpBitmapIH,DIB_RGB_COLORS,SRCCOPY);
}
if (fGridX)
{
iX1 = pNode->Gdi.iWidth1;
iY1 = pNode->Gdi.iHeight1;
iY2 = pNode->Gdi.iHeight2;
MoveToEx(m_hMemDC,iX1,iY1,NULL);
LineTo(m_hMemDC,iX1,iY2);
}
if (fGridY)
{
iX1 = pNode->Gdi.iWidth1;
iX2 = pNode->Gdi.iWidth2;
iY1 = pNode->Gdi.iHeight1;
MoveToEx(m_hMemDC,iX1,iY1,NULL);
LineTo(m_hMemDC,iX2,iY1);
}
pNode = pNode->pNext;
}
BitBlt(hDC,0,0,iScreenWidth,iScreenHeight,m_hMemDC,iHScrollPos,-iVScrollPos,SRCCOPY);
if (!fConnected)
{
DeleteObject(m_hDDBitmap);
DeleteDC(m_hMemDC);
}
}
EndPaint(hWnd,&ps);
}
//处理WM_TIMER消息
void CMainWnd::OnTimer(HWND hWnd,UINT iId)
{
// 如果我们连上了服务器
if (fConnected)
{
// 得到一个新的屏幕
GetScreen();
}
}
// 处理WM_COMMAND消息
void CMainWnd::OnCommand(HWND hWnd,int iId,HWND hWndCtl,UINT iCodeNotify)
{
// 选择菜单的退出
if (iId == IDM_EXIT)
{
// 是否连上了服务器?
if (fConnected)
{
// 发送结束消息到服务器
memset(szMouseMessage,'\0',sizeof(szMouseMessage));
strcpy(szMouseMessage,DISCONNECT_MSG);
iSent = Send(sClient,szMouseMessage);
// 关闭socket
closesocket(sClient);
// 清除socket
WSACleanup();
// 设置链接状态
fConnected = FALSE;
// 删去背景的位图
DeleteObject(m_hDDBitmap);
// 删去背景的Mem DC
DeleteDC(m_hMemDC);
}
// 结束应用程序
PostQuitMessage(0);
}
// 选择菜单的连接
else if (iId == IDM_CONNECT)
{
// 初始化IP地址
sprintf(pServerIP->szIP,"%d.%d.%d.%d",CMainWnd::m_ip[0],CMainWnd::m_ip[1],CMainWnd::m_ip[2],CMainWnd::m_ip[3]);
pServerIP->port=::port;
// 创建ip和port的对话框
if (DialogBox(m_hInst,MAKEINTRESOURCE(IDD_SERVERIP),m_hWnd,(DLGPROC)ServerIPDlgProc))
{
if (LoadWinsock(m_hWnd,pServerIP->szIP) == 0)
fConnected = TRUE;
else
fConnected = FALSE;
if (fConnected)
{
// 使断开连接菜单项有效
EnableMenuItem(m_hMenu,IDM_DISCONNECT,MF_BYCOMMAND|MF_ENABLED);
// 使连接菜单项有效
EnableMenuItem(m_hMenu,IDM_REFRESH,MF_BYCOMMAND|MF_GRAYED);
// 使色彩模式菜单有效
EnableMenuItem(m_hMenu,IDM_COLORMODE,MF_BYCOMMAND|MF_ENABLED);
if (fDIBitmap)
{
// 在Mem DC建立完整的位图
m_hMemDC = CreateCompatibleDC(GetDC(NULL));
// 为Mem DC创建兼容句柄
m_hDDBitmap = CreateCompatibleBitmap(GetDC(NULL),iScreenWidth,iScreenHeight);
SelectObject(m_hMemDC,m_hDDBitmap);
// 得到客户区域
GetClientRect(m_hWnd,&m_Rect);
// 设置滚动条
SetScrollRange(m_hWnd,SB_HORZ,0,iScreenWidth - m_Rect.right,FALSE);
SetScrollPos(m_hWnd,SB_HORZ,iHScrollPos,TRUE);
SetScrollRange(m_hWnd,SB_VERT,0,iScreenHeight - m_Rect.bottom,FALSE);
SetScrollPos(m_hWnd,SB_VERT,iVScrollPos,TRUE);
// 设置刷新时间
SetTimer(m_hWnd,0,m_iTimerInterval,NULL);
}
}
}
}
// 选择断开连接的菜单
else if (iId == IDM_DISCONNECT)
{
if (fConnected)
{
KillTimer(m_hWnd,0);
EnableMenuItem(m_hMenu,IDM_DISCONNECT,MF_BYCOMMAND|MF_GRAYED);
EnableMenuItem(m_hMenu,IDM_COLORMODE,MF_BYCOMMAND|MF_GRAYED);
EnableMenuItem(m_hMenu,IDM_REFRESH,MF_BYCOMMAND|MF_ENABLED);
//发送消息到服务器端结束连接
memset(szMouseMessage,'\0',sizeof(szMouseMessage));
strcpy(szMouseMessage,DISCONNECT_MSG);
// 发送消息到服务器
iSent = Send(sClient,szMouseMessage);
// 关闭socket
closesocket(sClient);
WSACleanup();
fConnected = FALSE;
DeleteObject(m_hDDBitmap);
DeleteDC(m_hMemDC);
}
}
// 选择压缩菜单选项
else if (iId == IDM_COMPRESSION)
{
// 选择压缩级数和压缩方式
pCompression->m_iCompressionLevel = iCompressionLevel;
if (DialogBox(m_hInst,MAKEINTRESOURCE(IDD_COMPRESSION),m_hWnd,(DLGPROC)CompressionDlgProc))
{
iCompressionLevel = pCompression->m_iCompressionLevel;
if (fConnected)
{
KillTimer(m_hWnd,0);
// 建立压缩消息
memset(szMouseMessage,'\0',sizeof(szMouseMessage));
sprintf(szMouseMessage,"WM_COMP;%d;0;0;0;\0",iCompressionLevel);
// 设置压缩级数
SendCommand(hWnd,1,szMouseMessage);
// 设置网格
SetGrids(m_hWnd);
UpdateRegionalScreen(m_hWnd,sClient,TRUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -