// clientDlg.cpp : implementation file
//
#include "stdafx.h"
#include "client.h"
#include "clientDlg.h"
#include "math.h"'
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CAboutDlg dialog used for App About
#define CM_RECEIVED WM_USER+2;
#define GraphSize 1024;
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CClientDlg dialog
CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CClientDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CClientDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CClientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CClientDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CClientDlg, CDialog)
//{{AFX_MSG_MAP(CClientDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CClientDlg message handlers
BOOL CClientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
char hname[MAX_PATH];
memset (hname,0,MAX_PATH);
gethostname(hname,MAX_PATH);
hostent*phost=gethostbyname('''');
char*localIP=inet_ntoa(*(struct in_addr*)*phost->h_addr_list);
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr =inet_addr(localIP);
addr.sin_port=htons(5001);
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if (m_socket == INVALID_SOCKET)
{
MessageBox("套接字创建失败");
}
char*len="512";
if (setsockopt(m_socket,SOL_SOCKET,SO_SNDBUF,len,4)!=0)
{
MessageBox("设置失败");
}
if (bind(m_socket,(sockaddr*)&addr,sizeof (addr))==SOCKET_ERROR)
{
MessageBox("套接字绑定失败");
}
m_server IP="127.0.0.1";
GET private profile string ("serverInfo","IP","127.0.0.1",m_serverIP,GetBuffer(0)) Max_PATH);
WSAAsyncSelect(m_socket,m_hWND,CM_RECEIVED,FD_READ);
m_x=m_y=0;
m_RecvX=m_RecvY=0;
m_confirm="TURE";
PSendBuf=new char[1024*1024*2];
PHeader=PSendBuf;
m_Received=FALSE;
m_Counter=0;
OnOK();
SetTimer(1,1000,NULL);
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CClientDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CClientDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
int CClientDlg::SendData(UNIT, index, int mod, int bmpsize, int frames, char *PsendBuf, sockaddr_in addr)
{
char*Ppackage;
int Packsize=0;
if (mod==0 // index !=frames-1)
packsize=2+2+bmpsize+4+2+2+4;
else
packsize=2+2+mod+4+2+2+4;
Ppackage=new char[packsize];
memset(ppackage,0,packsize);
*(WORD)&ppackage[0]=index;
if (index!=frames-1)
*(WORD*)&ppackage[2]=0;
else
*(WORD*)&ppackage[2]=1;
psendBuf+=bmpsize*index;
memcpy(&ppackage[4],psendBuf,packsize-16);
*(int*)&ppackage[packsize-12]=bmpsize;
*(WORD*)&package[packsize-8]=m_X;
*(WORD*)&package[packsize-6]=m_Y;
*(WORD*)&package[packsize-4]=packsize;
m_confirm=FALSE;
int ret=send to (m_socket,ppackage,packsize,0,(sockaddr*)&addr;sizeof(addr));
delete [] ppackage;
return ret;
}
void CClientDlg::OnOK()
{
CDC*PDESKDC=GETDesktopwindow()->GetDC();
CRect rc;
GetDesktopwindow()->GetclientRect(rc);
int width=300;
int height=300;
CDC memDC;
memDC.createcompatibleDC(pdeskDC);
CBitmap bmap;
bmp.createcompatibleBitmap(pDeskDC,width,height);
memDC.select object(&bmp);
BITMAP.bitmap;
bmp.getBitmap;
int panelsize=0;
if (bitmap,bmbitspixe1<16)
panelsize=pow(2,bitmap,bmbitspixel*sizeof(RGBQVAP);
BITMAPINFO*PbInfo=(BIMAPINFO*)localAlloc(LPTR,sizeof(BITMAPINFO)+panelsize);
pBInfo->bmiheader.biBitcount=bitmap.bmBitspixel;
pBInfo->bmiheader.biclrImportant=0;
pBInfo->bmiheader.bicompression=0;
pBInfo->bmiheader.biheight=height;
pBInfo->bmiheader.biplanes=bitmap.bmplanes;
pBInfo->bmiheader.bisize=sizeof (BITMAPINFO);
pBInfo->bmiheader.bisizeImage=bitmap.bmwidthBytes*bitmap.bmHeight;
pBInfo->bmiheader.biwidth=width;
pBInfo->bmiheader.bixpelsperMeter=0;
pBInfo->bmiheader.biypelsperMeter=0;
m_x=m_Recvx;
m_y=m_Recvy;
memDC.bitblt(0,0,width,height,pDeskDC,m_x,m_y_SR(COPY);
char*pdata=new char[bitmap,bmwidthbytes*bitmp,bmHeight];
::GETDIBits(memDC.m_hDC,bmp,0,bitmap,bmHeight,pData,pBInfo,DIB_RGB_COLORS);
Int Bufsize=panelsize+sizeof(BITMAPINFO);
char*PHead=psendBuf;
psendBuf+=sizeof(BITMAPINFO);
memcpy(psendBuf,pData,bitmap.bmwidthBytes*bitmap.bmHeight);
psendBuf=pHead;
addr1.sin_family=AF_INET;
addr1.sin_port=htons(5002);
addr1.sin_addr.s_un,s_addr=inet_addr(local IP);
bmpsize=Graphsize;
count=Bufsize/Graphize;
mod=Bufsize%Graphize;
if (mod!=0)
count+=1;
m_frameIndex=0;
int ret=sendData(m_FrameIndex,mod,bmpsize,count,psendBuf,addr1);
psendBuf=pHead;
delete[] pData;
localFree(pBInfo);
pDeskDC->DeleteDC();
bmp.Delete object();
memDC.DeleteDC();
}
void CClientDlg::OnTimer(UINT nIDEvent)
{
if(!m_Received)
{
m_counter++;
if(m_counter>5);
m_counter=0;
on ok();
}
}
else
{
m_Received=FALSE;
m_Counter=0;
}
CDialog::onTimer(nIDEVENT)
void CClientDlg::onReseived()
{
char*pdata=new char[1024];
memset(pData,0,1024);
sockaddr_in addr;
int factsize=sizeof(sockaddr);
int ret=recvfrom(m_socket,pData,1024,0,(sockaddr*)&addr,&factsize);
if (ret!=-1)
{
if (ret==4)
{m_recvx=*(WORD*)&pData[0];
m_recvy=*(WORD*)&pData[2];
}
else if (ret==8)
{m_Received=TURE;
m_FrameIndex+=1;
if (m_FrameIndex<count)
sendData(m_FrameIndex,mod,bmpsize,count,psendBuf,addr1);
else
onok ();
}
}
void CClientDlg::OnCancel()
{
delete[] pHeader;
CDialog::onconcel();
}