?? 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 + -