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

📄 maindlg.cpp

📁 用于PDA
💻 CPP
字号:
// MainDlg.cpp : implementation of the CMainDlg class
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resource.h"

#include "aboutdlg.h"
#include "MainDlg.h"

#include <gdiplus.h>
using namespace Gdiplus;

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;

const size_t FILE_BUFFER_SIZE = 16 * 1024;
BYTE FileBuffer[FILE_BUFFER_SIZE];

BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)
{
	return CWindow::IsDialogMessage(pMsg);
}

BOOL CMainDlg::OnIdle()
{
	return FALSE;
}

LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	// center the dialog on the screen
	CenterWindow();

	// set icons
	HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
		IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
	SetIcon(hIcon, TRUE);
	HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
		IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
	SetIcon(hIconSmall, FALSE);

	// register object for message filtering and idle updates
	CMessageLoop* pLoop = _Module.GetMessageLoop();
	ATLASSERT(pLoop != NULL);
	pLoop->AddMessageFilter(this);
	pLoop->AddIdleHandler(this);

	UIAddChildWindowContainer(m_hWnd);

	//UI Related
	m_bThreadRunning = false;
	//m_IpAddressCtrl.Attach(GetDlgItem(IDC_IPADDRESS1));
	//memset(m_szFilePath,0,sizeof(m_szFilePath));
	memset(&m_msgHead,0,sizeof(m_msgHead));

	DoDataExchange(TRUE);


	//Initialize the WinSock Stuff...

	WORD VersionRequested = MAKEWORD(2,2);
	WSADATA wsaData;

	WSAStartup(VersionRequested, &wsaData);	// Start Winsock Service
	if ( wsaData.wVersion != VersionRequested )
	{
		MessageBox(TEXT("Wrong version or WinSock not loaded\n"),MB_OK);
		fflush(0);	
	}

	m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	if ( m_Socket == INVALID_SOCKET )
	{
		MessageBox(TEXT("Error: failed to create socket\n"),MB_OK);
		fflush(0);
		return false;
	}

	m_ServerSockAddr.sin_family = AF_INET;
	m_ServerSockAddr.sin_addr.s_addr = htonl( INADDR_ANY );	
	m_ServerSockAddr.sin_port = htons(6970);

	BOOL temp;
	int len=sizeof(BOOL);
	int hr;
	if(	setsockopt(m_Socket,SOL_SOCKET,SO_REUSEADDR,(char*)&temp,len)!=0)
	{
		hr=WSAGetLastError();
		return hr;
	}

	if ( bind( m_Socket, (struct sockaddr *)&m_ServerSockAddr, sizeof(m_ServerSockAddr)) != 0 )
	{
		MessageBox(TEXT("Error: failed to bind\n"),MB_OK);
		closesocket( m_Socket );
		return false;
	}

	if ( listen(m_Socket,SOMAXCONN) != 0)
	{
		MessageBox(TEXT("Error: failed to Listen\n"),MB_OK);
		closesocket( m_Socket );
		return false;
	}

	// Initialize GDI+.
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

	return TRUE;
}

LRESULT CMainDlg::OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	CAboutDlg dlg;
	dlg.DoModal();
	return 0;
}

LRESULT CMainDlg::OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	// TODO: Add validation code 
	//CloseDialog(wID);
	if(!m_bThreadRunning)
	{

		HANDLE hThread;
		DWORD dwThreadID;

		hThread =  CreateThread 
			(NULL, 
			0,
			(LPTHREAD_START_ROUTINE)(CMainDlg::ReceiveThread),
			(void *)this,
			0,
			&dwThreadID	);

		if(hThread==NULL)
		{
			MessageBox(TEXT("Error:Faild to create thread\n"),MB_OK);
			return false;
		}
		else
		{
			m_bThreadRunning=true;
			::EnableWindow(GetDlgItem(IDOK),false);
			return true;
		}
	}
	else
	{
		return false;
	}
}

LRESULT CMainDlg::OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	GdiplusShutdown(gdiplusToken);
	WSACleanup();
	CloseDialog(wID);
	return 0;
}

void CMainDlg::CloseDialog(int nVal)
{
	GdiplusShutdown(gdiplusToken);
	WSACleanup();

	DestroyWindow();
	::PostQuitMessage(nVal);
}

void CMainDlg::ReceiveThread(void* pData)
{

	CMainDlg* pMainDlg=(CMainDlg*) pData;
	while(pMainDlg->m_bThreadRunning)
	{
		pMainDlg->m_AcceptSocket = SOCKET_ERROR;
		while( pMainDlg->m_AcceptSocket == SOCKET_ERROR )
		{
			pMainDlg->m_AcceptSocket = accept( pMainDlg->m_Socket, NULL,NULL/*(sockaddr *)&m_AcceptSockAddr, sizeof(m_AcceptSockAddr)*/ );
		}

		DWORD nBytestoRecv= sizeof(MESSAGEHEAD);
		DWORD nIndex=0;
		DWORD nBytesRecv;
		DWORD nBytesRemaining=nBytestoRecv;
		while(nBytesRemaining>0)
		{
			nBytesRecv=recv(pMainDlg->m_AcceptSocket,(char*)&pMainDlg->m_msgHead + nIndex ,nBytesRemaining,0);
			nBytesRemaining-=nBytesRecv;
			nIndex+=nBytesRecv;
		}

		//Message Head Received, attract data from it
		DWORD nTotalBytestoRecv= pMainDlg->m_msgHead.nImageFileSize;
		//		int nBytesofRecvBlok;
		
		//Create a file to store the image received.
		HANDLE hFile; 
		hFile = CreateFile(pMainDlg->m_msgHead.chImageFileName,    // file to open
			GENERIC_WRITE,          // open for writing
			0,                      // do not share
			NULL,                   // default security
			CREATE_ALWAYS,          // overwrite existing
			FILE_ATTRIBUTE_NORMAL,  // normal file
			NULL);                  // no attr. templat
		if (hFile == INVALID_HANDLE_VALUE) 
		{ 
			pMainDlg->MessageBox(TEXT("Could not Create file !"),TEXT("Error"), MB_ICONEXCLAMATION);
			return;
		}

		//Receive the Image File using a file buffer
		while(nTotalBytestoRecv>0)
		{
			nBytestoRecv = FILE_BUFFER_SIZE;
			nIndex=0;
			nBytesRemaining= nBytestoRecv;
			while (nBytesRemaining>0)
			{
				nBytesRecv=recv(pMainDlg->m_AcceptSocket,(char *)FileBuffer + nIndex, nBytesRemaining, 0);
				if(nBytesRecv==0||nBytesRecv==WSAECONNRESET )
					break;
				nBytesRemaining-=nBytesRecv;
				nIndex+=nBytesRecv;
			}
			nTotalBytestoRecv-=nIndex;

			DWORD nBytesWritten;
			WriteFile(hFile,FileBuffer,nIndex,&nBytesWritten,NULL);

		}

		CloseHandle(hFile);
		shutdown(pMainDlg->m_AcceptSocket,SD_RECEIVE);
		closesocket(pMainDlg->m_AcceptSocket);

		//Update the Text
		pMainDlg->DoDataExchange(FALSE);

		//Displays the Picture
		WCHAR wszFilePath[MAX_PATH*sizeof(WCHAR)];

		MultiByteToWideChar(
			CP_ACP,         // code page
			MB_PRECOMPOSED,         // character-type options
			pMainDlg->m_msgHead.chImageFileName, // string to map
			strlen(pMainDlg->m_msgHead.chImageFileName)+1,       // number of bytes in string
			wszFilePath,  // wide-character buffer
			sizeof(wszFilePath)        // size of buffer
			);

		Image thePic(wszFilePath);

		HWND hWnd=pMainDlg->GetDlgItem(IDC_STATIC_PIC);
		RECT rect;
		::GetWindowRect(hWnd,&rect);
		Graphics graphic(hWnd);

		graphic.DrawImage(&thePic,0,0,rect.right-rect.left,rect.bottom-rect.top);

	}

	ExitThread(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -