⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainwnd.cpp

📁 Visual C++网络通信编程实用案例精逊配套源码 光盘中存放的是书中涉及的所有实例的源代码和经过编译后的应用程序。所有程序均经过测试
💻 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 + -