📄 maindlg.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 + -