?? mainwnd.cpp
字號:
#include "MainWnd.h"
#include "WndProc.h"
#include "Server.h"
#include "Gdi.h"
#include "resource.h"
//引用到的外部全局變量
extern "C" SOCKET Listen;
extern "C" HWND hServerWnd;
extern "C" BOOL fDIBitmap;
extern "C" struct GdiList GdiStart;
extern "C" struct GdiList *pGdiNode;
extern "C" UINT gPort;
// 線程變量
HANDLE hThread;
DWORD dwThreadId;
//因為IP地址是一個全局信息,所以我們把它設置為CMainWnd的靜態變量
BYTE CMainWnd::m_ip[4];
CMainWnd::CMainWnd()
{
}
CMainWnd::~CMainWnd()
{
// 刪除自窗口自身的指針
delete this;
// 釋放全局區域的DIB
ClearDisplay(m_hWnd);
}
// 設置程序Instance
void CMainWnd::SetInstance(HINSTANCE hInst)
{
m_hInst = hInst;
}
// 處理WM_CREATE消息
BOOL CMainWnd::OnCreate(HWND hWnd,CREATESTRUCT FAR *lpCreateStruct)
{
// 顯示主窗口
lpCreateStruct->cx=400;
lpCreateStruct->cy=600;
lpCreateStruct->x=100;
lpCreateStruct->y=100;
ShowWindow(hWnd,*(LPINT)lpCreateStruct->lpCreateParams);
m_hWnd = hWnd;
m_hMenu = GetMenu(m_hWnd);
EnableMenuItem(m_hMenu,IDM_STARTSERVER,MF_BYCOMMAND|MF_ENABLED);
EnableMenuItem(m_hMenu,IDM_STOPSERVER,MF_BYCOMMAND|MF_GRAYED);
// Winsock初始化的地方
WSADATA wsd;
char szString[255];
char name[20];
// 裝入Winsock2.2版本
if (WSAStartup(0x202,&wsd) != 0)
{
sprintf(szString,"Failed to load Winsock!");
MessageBox(NULL,szString,"Remote Server",MB_OK);
return 1;
}
//得到本機的IP地址
GetLocalHostName(name);
GetIpAddress(name,&m_ip[0],&m_ip[1],&m_ip[2],&m_ip[3]);
return TRUE;
}
// 處理WM_DESTORY消息
void CMainWnd::OnDestroy(HWND hWnd)
{
// 關閉監聽Socket
closesocket(Listen);
// 清除socket
WSACleanup();
// 發送結束消息到窗口
PostMessage(hWnd,WM_QUIT,(WPARAM)0,0L);
}
// 處理WM_GETMINMAXINFO消息
void CMainWnd::OnGetMinMaxInfo(HWND hWnd,MINMAXINFO FAR* lpMinMaxInfo)
{
RECT size;
size.bottom=1000;
size.top=100;
size.left=100;
size.right=1000;
lpMinMaxInfo->ptMaxTrackSize.x = size.right-size.left;
lpMinMaxInfo->ptMaxTrackSize.y = size.bottom-size.top;
lpMinMaxInfo->ptMaxSize.x = size.right-size.left;
lpMinMaxInfo->ptMaxSize.y = size.bottom-size.top;
}
// 處理WM_KEYDOWN消息
void CMainWnd::OnKeyDown(HWND hWnd,UINT vk,BOOL fDown,int cRepeat,UINT flags)
{
if (vk == VK_ESCAPE || vk == VK_F12)
PostMessage(hWnd,WM_CLOSE,0,0);
}
//對話框處理的回調函數
BOOL CALLBACK SettingItemProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL b;
char name[15];
switch (message)
{
case WM_INITDIALOG:
sprintf(name,"%d.%d.%d.%d",CMainWnd::m_ip[0],CMainWnd::m_ip[1],CMainWnd::m_ip[2],CMainWnd::m_ip[3]);
::SetDlgItemInt(hwndDlg,IDC_EDIT1,gPort,false);
::SetDlgItemText(hwndDlg,IDC_IP,name);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
gPort=::GetDlgItemInt(hwndDlg, IDC_EDIT1,&b, false);
case IDCANCEL:
EndDialog(hwndDlg, wParam);
return TRUE;
}
}
return FALSE;
}
//處理WM_COMMAND消息
void CMainWnd::OnCommand(HWND hWnd,int iId,HWND hWndCtl,UINT iCodeNotify)
{
if (iId == IDM_EXIT)
{
//終結線程
if (hThread)
{
//關閉監聽窗口
closesocket(Listen);
// 清除socket
WSACleanup();
}
// 結束程序
PostQuitMessage(0);
}
else if (iId == IDM_STARTSERVER)
{
if (DialogBox(this->m_hInst,
MAKEINTRESOURCE(IDD_DIALOG),
hWnd, (DLGPROC)SettingItemProc)==IDOK)
{
ShowWindow(hWnd,SW_MINIMIZE);
RedrawWindow(hWnd,NULL,NULL,RDW_ERASE|RDW_INVALIDATE);
// 創建一個新的線程,LoadWinsock是在Server.c中定義的線程函數
hThread = CreateThread(NULL,0,LoadWinsock,(LPVOID)NULL,0,&dwThreadId);
if (hThread == NULL)
MessageBox(hWnd,"Socket線程創建失敗","遠程控制服務器端",MB_ICONEXCLAMATION|MB_OK);
else
{
InitDisplay(hWnd);
hServerWnd = hWnd;
EnableMenuItem(m_hMenu,IDM_STARTSERVER,MF_BYCOMMAND|MF_GRAYED);
EnableMenuItem(m_hMenu,IDM_STOPSERVER,MF_BYCOMMAND|MF_ENABLED);
}
}
}
else if (iId == IDM_STOPSERVER)
{
if(MessageBox(hWnd,"你真的想關閉遠程控制服務?","遠程控制服務器端",MB_YESNO)==IDYES)
{
EnableMenuItem(m_hMenu,IDM_STARTSERVER,MF_BYCOMMAND|MF_ENABLED);
EnableMenuItem(m_hMenu,IDM_STOPSERVER,MF_BYCOMMAND|MF_GRAYED);
ClearDisplay(hWnd);
// 終結線程
if (hThread)
{
// 清除監聽窗口
closesocket(Listen);
}
}
}
else if(iId==IDC_About)
{
MessageBox(hWnd,"2003-7-2創建\r\n一個遠程控制的程序","遠程控制服務器端",MB_OK);
}
}
//獲得本地計算機名稱
int CMainWnd::GetLocalHostName(char* sHostName)
{
char szHostName[256];
int nRetCode;
nRetCode=gethostname(szHostName,sizeof(szHostName));
if(nRetCode!=0)
{
//產生錯誤
strcpy(sHostName,"沒有取得");
return GetLastError();
}
strcpy(sHostName,szHostName);
return 0;
}
//獲得本地IP
int CMainWnd::GetIpAddress(char *sHostName, char *sIpAddress)
{
struct hostent FAR * lpHostEnt=gethostbyname(sHostName);
if(lpHostEnt==NULL)
{
//產生錯誤
sIpAddress=NULL;
return GetLastError();
}
//獲取IP
LPSTR lpAddr=lpHostEnt->h_addr_list[0];
if(lpAddr)
{
struct in_addr inAddr;
memmove(&inAddr,lpAddr,4);
//轉換為標準格式
strcpy(sIpAddress,inet_ntoa(inAddr));
}
return 0;
}
//獲得本地IP
int CMainWnd::GetIpAddress(char *sHostName, BYTE *f0,BYTE *f1,BYTE *f2,BYTE *f3)
{
struct hostent FAR * lpHostEnt=gethostbyname(sHostName);
if(lpHostEnt==NULL)
{
//產生錯誤
f0=f1=f2=f3=0;
return GetLastError();
}
//獲取IP
LPSTR lpAddr=lpHostEnt->h_addr_list[0];
if(lpAddr)
{
struct in_addr inAddr;
memmove(&inAddr,lpAddr,4);
*f0=inAddr.S_un.S_un_b.s_b1;
*f1=inAddr.S_un.S_un_b.s_b2;
*f2=inAddr.S_un.S_un_b.s_b3;
*f3=inAddr.S_un.S_un_b.s_b4;
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -