的程序,在 OnInitDialog()方法中我们调用 appInit()来对程序进行初使化, void CWhereyouareDlg::appInit() { if (WSAStartup(MAKEWORD(2,1),&m_wsaData)) //调用 Windows Sockets DLL { AfxMessageBox("Winsock 无法初始化!\n"); WSACleanup(); return; } m_local.sin_family=AF_INET; //地址族 m_local.sin_port=htons(4444); ///监听端口 m_local.sin_addr.s_addr=INADDR_ANY; ///本机 m_socket=socket(AF_INET,SOCK_DGRAM,0); int nRet = bind(m_socket,(struct sockaddr*)&m_local,sizeof(m_local)); if(SOCKET_ERROR == nRet) { closesocket(m_socket); WSACleanup(); AfxMessageBox("绑定端口失败!"); return; } GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL); m_pDC =m_mappic.GetDC(); m_graphics = Graphics::FromHDC(m_pDC->m_hDC); } 首先是初使化socket,绑定端口,接着是初使化Gdiplus,在我们PC端的程序中,接 到到经纬度后就要对它进行处理,通过一些方式来转变成图像显示出来,最常用的方法当然 是Google MAP API与Baidu MAP API了,这样转出的图片效果多,扩展性也强,适合一 些商用开发,我的演示程序采用了一种更简便的方法,在Google MAP API和Baidu MAP API中都提供了相应的静态图片生成功能,我在测试Google MAP API的时候生成的图片国 内的经纬度总是无法正常显示,不明白原因,所以选择了Baidu,首先看来相关的静态图片介绍及 使用方法,Google相关的链接为:http://code.google.com/intl/zh-CN/apis/maps/documentation/staticmaps/ ,百度相关的链接 为: http://dev.baidu.com/wiki/map/index.php?title=%E9%9D%99%E6%80%81%E5%9B%BEAPI。另外还有Sogou MAP,这里就不介绍了。在百度相关链接中我们得知静态图片返回的 格式为png,因为我们需要想办法让它显示在我们的控件中,在C++中显示png图片的最简单 方法当然是调用Gdiplus了,只需要通过图片文件构造个Image 对象,一个HDC构造一个 graphics,然后调用graphics的DrawImage()方法就可以显示出来,代码量少,很方便。 我们在获取按钮的单击代码响应中创建一个数据接收线程来完成信息的接收及图片的显示 工作,代码如下: unsigned CWhereyouareDlg::Work( LPVOID lpParam ) { CWhereyouareDlg* dlg= (CWhereyouareDlg*)lpParam; SOCKET s = dlg->m_socket; sockaddr_in saddrin = dlg->m_from; Graphics* graphics = dlg->m_graphics; ASSERT(s != NULL); while (bShow) { char buffer[512]="\0"; char phonenumber[256]="\0"; char location[256]="\0"; char url[1024]="\0"; int fromlen =sizeof(saddrin); if (recvfrom(s, buffer, sizeof(buffer), 0, (struct sockaddr*)&saddrin, &fromlen)!=SOCKET_ERROR) { fromlen = strlen(buffer); for (int i=0; i<fromlen; i++) //数据解密 { buffer[i]=buffer[i] ^ 0x90; } sscanf(buffer,"%[^|]%*[|]%s", phonenumber, location); sprintf(url, "%s\%s",baidumapurl, location); URLDownloadToFile(NULL,url,"tmp.png",0,0); Image image(L"tmp.png", FALSE); graphics->DrawImage(&image, 0, 0); dlg->SetDlgItemText(IDC_PHONENUMBER, phonenumber);//显示手机号 码 } } return 1; } 在接收到数据后对数据进行解密,最后下载图片并显示出来。图片的下载只用了 URLDownloadToFile,起先,我是想在主界面上弄个 WEB 访问控件,然后访问显示的,不 过觉得那样弄又多了控件,多了代码,不简洁,果断放弃了。好了,代码到这里也讲解完了, 我们看下在模拟器上运行的效果: ![]() ![]() 最后是在 MOTO MB525上的真机测试效果: ![]() 回顾下整个开发流程还是很简单的,程序写到这里还有什么需要完善的地方,如希望这 个程序可以在后台运行,程序地图采用实景图等,这些问题就留给大家来完成了。最后声明, 本文中提到的方法及代码只得用于学习交流,任何个人或组织不得用于非法行为,由此带来 的直接或连带后果,本人不承担任何法律责任。 |