📄 gpsscview.cpp
字号:
// GpsSCView.cpp : implementation of the CGpsSCView class
//
#include "stdafx.h"
#include "GpsSC.h"
#include "MainFrm.h"
#include "GpsSCDoc.h"
#include "GpsSCView.h"
#include "ComUserDlg.h"
#include "FindMessageDlg.h"
#include "TreeCtrlEx.h"
#include "VehicleMessageSet.h"
#include "ClientinfoSet.h"
#include "ToolTipWnd.h"
#include "ListCtrlEx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGpsSCView
extern CGpsSCApp theApp;
IMPLEMENT_DYNCREATE(CGpsSCView, CScrollView)
BEGIN_MESSAGE_MAP(CGpsSCView, CScrollView)
//{{AFX_MSG_MAP(CGpsSCView)
ON_MESSAGE(WM_COMMNOTIFY,OnCommNotify)
ON_COMMAND(ID_TEST, OnTest)
ON_UPDATE_COMMAND_UI(ID_TEST, OnUpdateTest)
ON_UPDATE_COMMAND_UI(ID_SETJKNUMBER, OnUpdateSetjknumber)
ON_COMMAND(ID_SINULATEDRIVER, OnSinulatedriver)
ON_UPDATE_COMMAND_UI(ID_SINULATEDRIVER, OnUpdateSinulatedriver)
ON_COMMAND(ID_CCONNET_COMM, OnCconnetComm)
ON_COMMAND(ID_REFRESH, OnRefresh)
ON_UPDATE_COMMAND_UI(ID_REFRESH, OnUpdateRefresh)
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
ON_COMMAND(ID_MZOOM_DOWN, OnMzoomDown)
ON_UPDATE_COMMAND_UI(ID_MZOOM_DOWN, OnUpdateMzoomDown)
ON_COMMAND(ID_MZOOM_UP, OnMzoomUp)
ON_UPDATE_COMMAND_UI(ID_MZOOM_UP, OnUpdateMzoomUp)
ON_COMMAND(ID_OPENLOCK, OnOpenlock)
ON_COMMAND(ID_GETVEHICLEPOSITION, OnGetvehicleposition)
ON_COMMAND(ID_SETLOCK, OnSetlock)
ON_COMMAND(ID_SHUTOIL, OnShutoil)
ON_COMMAND(ID_SETPASSWORD, OnSetpassword)
ON_COMMAND(ID_SENDNORMALSM, OnSendnormalsm)
ON_COMMAND(ID_SENDINFOTOGROUP, OnSendinfotogroup)
ON_COMMAND(ID_SELECTTYPE, OnSelectUserType)
ON_COMMAND(ID_AUTOMONITOR, OnAutomonitor)
ON_COMMAND(ID_GETHELP, OnGethelp)
ON_COMMAND(ID_MDISP_SIGN_POINT, OnMdispSignPoint)
ON_UPDATE_COMMAND_UI(ID_MDISP_SIGN_POINT, OnUpdateMdispSignPoint)
ON_COMMAND(ID_MSEARCH_SIGN_BY_REGION, OnMsearchSignByRegion)
ON_UPDATE_COMMAND_UI(ID_MSEARCH_SIGN_BY_REGION, OnUpdateMsearchSignByRegion)
ON_COMMAND(ID_MSEARCH_BEST_ROAD, OnMsearchBestRoad)
ON_UPDATE_COMMAND_UI(ID_MSEARCH_BEST_ROAD, OnUpdateMsearchBestRoad)
ON_COMMAND(ID_FINDMESSAGE, OnFindmessage)
ON_UPDATE_COMMAND_UI(ID_AUTOMONITOR, OnUpdateAutomonitor)
ON_WM_LBUTTONDOWN()
ON_UPDATE_COMMAND_UI(ID_GETVEHICLEPOSITION, OnUpdateGetvehicleposition)
ON_UPDATE_COMMAND_UI(ID_SETLOCK, OnUpdateSetlock)
ON_UPDATE_COMMAND_UI(ID_SHUTOIL, OnUpdateShutoil)
ON_UPDATE_COMMAND_UI(ID_GETHELP, OnUpdateGethelp)
ON_UPDATE_COMMAND_UI(ID_OPENLOCK, OnUpdateOpenlock)
ON_UPDATE_COMMAND_UI(ID_SENDNORMALSM, OnUpdateSendnormalsm)
ON_UPDATE_COMMAND_UI(ID_SENDINFOTOGROUP, OnUpdateSendinfotogroup)
ON_UPDATE_COMMAND_UI(ID_SELECTTYPE, OnUpdateSelecttype)
ON_UPDATE_COMMAND_UI(ID_CHANGEUSERPASSWORD, OnUpdateChangeuserpassword)
ON_UPDATE_COMMAND_UI(ID_SETPASSWORD, OnUpdateSetpassword)
ON_COMMAND(ID_CDISCONNET_COMM, OnCdisconnetComm)
ON_UPDATE_COMMAND_UI(ID_CDISCONNET_COMM, OnUpdateCdisconnetComm)
ON_COMMAND(ID_CANCELAUTOMONITOR, OnCancelautomonitor)
ON_UPDATE_COMMAND_UI(ID_CANCELAUTOMONITOR, OnUpdateCancelautomonitor)
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_POP_FRESH, OnPopFresh)
ON_UPDATE_COMMAND_UI(ID_POP_FRESH, OnUpdatePopFresh)
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_MSEARCH_SIGN, OnMsearchSign)
ON_UPDATE_COMMAND_UI(ID_MSEARCH_SIGN, OnUpdateMsearchSign)
ON_WM_ERASEBKGND()
ON_COMMAND(ID_CCONNECT_COM, OnCconnectCom)
ON_UPDATE_COMMAND_UI(ID_CCONNECT_COM, OnUpdateCconnectCom)
ON_COMMAND(ID_CANCEL_CURR_MONITOR_CAR, OnCancelCurrMonitorCar)
ON_UPDATE_COMMAND_UI(ID_CANCEL_CURR_MONITOR_CAR, OnUpdateCancelCurrMonitorCar)
ON_COMMAND(ID_SET_CURR_MONITOR_CAR, OnSetCurrMonitorCar)
ON_UPDATE_COMMAND_UI(ID_SET_CURR_MONITOR_CAR, OnUpdateSetCurrMonitorCar)
ON_UPDATE_COMMAND_UI(ID_CCONNET_COMM, OnUpdateCconnetComm)
//}}AFX_MSG_MAP
// Standard printing commands
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGpsSCView construction/destruction
CGpsSCView::CGpsSCView()
{
// TODO: add construction code here
m_bSocketConnect = FALSE;
password = FALSE;
flag_usertype = TRUE;
m_bDispSignPoint = false;
m_bDispSignPic = false;
m_bSearchBestRoad = false;
m_bDispBusRoad = false;
m_bSearchSignbyRegion = false;
m_bMapIsDrawed = false;
m_bLButtomDown = false;
m_bMoveFatMap = false;
m_pRBDownPoint.x = 0;
m_pRBDownPoint.y = 0;
m_nVMove = 0;
m_nHMove = 0;
m_DC.DeleteDC();
}
CGpsSCView::~CGpsSCView()
{
if(m_bMapIsDrawed) {
m_DC.DeleteDC();
}
}
BOOL CGpsSCView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGpsSCView drawing
void CGpsSCView::OnDraw(CDC* pDC)
{
CGpsSCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
DrawMap(pDC);
if(m_bDispSignPoint) m_cDrawMap.DrawSignLib(pDC);
if(m_bSearchBestRoad) m_cDrawMap.DrawBetweenBRCrossLine(pDC,&m_cDrawMap.mSaveBRList);
if(m_bSearchSignbyRegion) m_cDrawMap.DrawOneSignPoint(pDC);
m_cDrawMap.DrawGpsCar(pDC,0.0);
}
/////////////////////////////////////////////////////////////////////////////
// CGpsSCView diagnostics
#ifdef _DEBUG
void CGpsSCView::AssertValid() const
{
CScrollView::AssertValid();
}
void CGpsSCView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CGpsSCDoc* CGpsSCView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGpsSCDoc)));
return (CGpsSCDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGpsSCView message handlers
LRESULT CGpsSCView::OnCommNotify(WPARAM wParam, LPARAM lParam)
{
CGpsSCDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(!pDoc->m_bConnected || (wParam & EV_RXCHAR)!=EV_RXCHAR)
{
SetEvent(pDoc->m_hPostMsgEvent); //允许发送下一个WM_COMMNOTIFY消息
return 0L;
}
CProcSM processSM;
processSM.ReadComPort(wParam,pDoc);
SetEvent(pDoc->m_hPostMsgEvent); //允许发送下一个WM_COMMNOTIFY消息
return 0L;
}
void CGpsSCView::DrawMap(CDC *pDC)
{
// SetScrollSizes(MM_TEXT, CSize((int)Wnd_Max_X,(int)Wnd_Max_Y));
CRect client;
CRect rect;
// pDC->GetClipBox(client); //检取无效区
// GetClientRect(rect); //检取整个客户区
if((m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_X == 0) || (m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_Y == 0)) {
m_cDrawMap.RefreshMapWnd();
}
if(!m_bMapIsDrawed) {
CBitmap bitmap;
CBitmap *pOldBitmap;
m_DC.DeleteDC();
SetScrollPos(SB_HORZ,0,TRUE);
SetScrollPos(SB_VERT,0,TRUE);
rect.top = 0;
rect.left = 0;
rect.bottom = m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_Y;
rect.right = m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_X;
client.top = 0;
client.left = 0;
client.bottom = m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_Y;
client.right = m_cDrawMap.m_cCurrMapInfo.m_lWnd_Max_X;
if(m_DC.CreateCompatibleDC(pDC)) { //创建一个与pDC兼容的内存设备环境
//创建一与pDC兼容的位图,大小为整个客户区
if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height())) {
OnPrepareDC(&m_DC,NULL); //使dc与pDC具有同样的映射关系
pOldBitmap=m_DC.SelectObject(&bitmap); //将位图选入内存环境
m_DC.SelectClipRgn(NULL); //使dc的整个客户区都成无效区
m_DC.IntersectClipRect(client); //再"与上"检取的无效区,使内存环境与pDC检取的无效区相等
}
}
CBrush brush;
if(!brush.CreateSolidBrush(RGB(255,255,255))) {
return;
}
brush.UnrealizeObject();
m_DC.FillRect(client,&brush); //将dc的作图区刷新成背景色
m_cDrawMap.DrawFatMap(&m_DC);
bitmap.DeleteObject();
pOldBitmap->DeleteObject();
m_bMapIsDrawed = true;
}
pDC->GetClipBox(client); //检取无效区
GetClientRect(rect); //检取整个客户区
//移动滚动条
MoveScroll();
//拷贝到窗口裁减区
pDC->BitBlt(client.left,client.top,client.Width(),client.Height(),&m_DC,client.left,client.top,SRCCOPY); //将内存裁减区的位图
}
void CGpsSCView::OnTest()
{
// TODO: Add your command handler code here
CProcSM sm;
CString str;
str = "8F6653F7003A0030003700340039000D002276D163A7002263074EE45DF27ECF6267884C0021"; //监控指令已经执行!
// str = "8F6653F7003A0030003700340039000D8F6651B5003A89E39664963276D7000D4F4D7F6E003A6DF1573357CE533A6C344E0A4E5056ED000D7ECF5EA6003A003100310034002E00300031002E00330030000D7EAC5EA6003A00320032002E00330032002E00330034000D8F66901F003A0030"; //正常信息
// str = "8F6653F7003A0030003700340039000D8F6651B5003A89E39664963276D7000D4F4D7F6E003A6DF1573357CE533A6C344E0A4E5056ED000D7ECF5EA6003A003100310034002E00300031002E00330031000D7EAC5EA6003A00320032002E00330032002E00330034000D8F66901F003A0030"; //正常信息
// str = "8F6653F7003A0030003700340039000D8F6651B5003A89E39664963276D7000D4F4D7F6E003A6DF1573357CE533A6C344E0A4E5056ED000D7ECF5EA6003A003100310034002E00300031002E00330031000D7EAC5EA6003A00320032002E00330032002E00330034000D8F66901F003A0037";
// str = "8F6653F7003A0030003700340039000D8F6651B5003A89E39664963276D7000D4F4D7F6E003A6DF1573357CE533A6C344E0A4E5056ED000D7ECF5EA6003A003100310034002E00300031002E00330032000D7EAC5EA6003A00320032002E00330032002E00330034000D8F66901F003A00310031";
AfxMessageBox(sm.UnicodeStr2AnsiStr(str));
}
void CGpsSCView::OnUpdateTest(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
BOOL MenuEnable = FALSE;
pCmdUI->Enable(MenuEnable);
}
///////////////////////////////////////////////////////////////////
//向汽车发监控命令
///////////////////////////////////////////////////////////////////
void CGpsSCView::OnUpdateSetjknumber(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CGpsSCView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
m_ToolTip.Create(this);
m_bDrawMap = FALSE;
CSize sizeTotal;
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
CGpsSCDoc *pDoc = GetDocument();
procSM.SetDocPointer(pDoc);
m_pDoc = pDoc;
//开始写线程
procSM.BeginThread();
((CMainFrame*)AfxGetApp()->m_pMainWnd)->m_wndListCtrl.GetViewPoint(this);
m_cDrawMap.GetView(this);
SendGXGY("113.06.55\r\n","23.01.01\r\n","","",1); //佛山
// SendGXGY("114.07.25\r\n","22.33.21\r\n","","",1); //深圳
// SendGXGY("113.06.46\r\n","22.34.00\r\n","","",1); //深圳
((CMainFrame*)AfxGetApp()->m_pMainWnd)->m_wndTree1.Init(&procSM);
((CMainFrame*)AfxGetApp()->m_pMainWnd)->m_wndTree2.Init(&procSM);
SetTimer(1,100,NULL);
}
//设定车主电话
void CGpsSCView::OnSinulatedriver()
{
// TODO: Add your command handler code here
procSM.SimulatorDriver();
}
void CGpsSCView::OnUpdateSinulatedriver(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(procSM.m_bSysTemInit);
}
void CGpsSCView::OnCconnetComm()
{
// TODO: Add your command handler code here
m_pDoc = GetDocument();
if(m_pDoc->OnConnetComm())
procSM.SystermInite(this);
CClientinfoSet clientinfoSet;
CVehicleMessageSet messageSet;
try
{
if(!clientinfoSet.IsOpen())
clientinfoSet.Open();
if(!messageSet.IsOpen())
messageSet.Open();
}
catch(CDBException *Exp)
{
AfxMessageBox(Exp->m_strError);
}
}
void CGpsSCView::OnRefresh()
{
// TODO: Add your command handler code here
m_cDrawMap.ClearSaveInvalidRectColor();
m_cDrawMap.ClearPointList(&m_cDrawMap.mSaveRecePointList);
m_bSearchSignbyRegion = false;
CGpsSCDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->UpdateAllViews(NULL);
}
void CGpsSCView::OnUpdateRefresh(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
//get the gx and gy and convert it
void CGpsSCView::SendGXGY(CString strGX,CString strGY,CString strVehicleNO,CString strTelNumber,BYTE IsSimulate)
{
if(!procSM.CheckVehicleMonitorNow(strVehicleNO)) return; //检测车辆是否已被监控
#if 0
if((!procSM.m_sCurrMonitorCar.IsEmpty()) && (procSM.m_sCurrMonitorCar != strVehicleNO)) return;
// if(procSM.m_sGetPositionCar == strVehicleNO) {
// procSM.m_sGetPositionCar.Empty();
// }
double gx,gy;
CDC *pDC = GetDC();
gx = CovertStdNE(strGX);
gy = CovertStdNE(strGY);
if(!m_cDrawMap.SaveRecePoint(gx,gy,pDC,strVehicleNO)) {
// pDC->DeleteDC();
return;
}
if(IsSimulate) {
m_cDrawMap.DrawGpsCar(pDC,0.0);
}
m_cDrawMap.GetCarXY(m_ny,m_ny);
m_bDrawMap=TRUE;
if(!m_cDrawMap.CheckMapIsChange(gx,gy)) {
// pDC->DeleteDC();
InvalidRect(gx,gy);
return;
}
// pDC->DeleteDC();
CGpsSCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->UpdateAllViews(NULL);
#else
CRect MapRect;
CDC *pDC = GetDC();
double gx,gy;
gx = CovertStdNE(strGX);
gy = CovertStdNE(strGY);
if(!m_cDrawMap.CheckMapIsChange(gx,gy)) {
if(!IsSimulate) {
if(!m_cDrawMap.SaveRecePoint(gx,gy,pDC,strVehicleNO)) return;
}
m_cDrawMap.DrawGpsCar(pDC,0.0);
m_cDrawMap.GetCarXY(m_nx,m_ny);
m_bDrawMap = TRUE;
return;
}
if(!m_cDrawMap.SaveRecePoint(gx,gy,pDC,strVehicleNO)) return;
if(IsSimulate) return;
GetClientRect(MapRect);
m_cDrawMap.RefreshMapWnd();
if(!m_cDrawMap.SaveRecePoint(gx,gy,pDC,strVehicleNO)) return;
m_cDrawMap.DrawGpsCar(pDC,0.0);
//获取车位置
m_cDrawMap.GetCarXY(m_nx,m_ny);
m_bDrawMap = TRUE;
#endif
}
void CGpsSCView::InvalidRect(double gx, double gy)
{
long x,y;
if(!m_cDrawMap.CalcNE2XY(gx,gy,x,y)) return;
CRect lpRect;
CPoint point = GetScrollPosition();
long MidWidth = 100;
x -= point.x;
y -= point.y;
lpRect.left = x - MidWidth - 20;
lpRect.right = x + MidWidth + 20;
lpRect.top = y - MidWidth;
lpRect.bottom = y + MidWidth;
CString str;
str.Format("%d,%d,%d,%d",lpRect.left,lpRect.right,lpRect.top,lpRect.bottom);
// StatusPrompt(str,0);
// GetClientRect(lpRect);
InvalidateRect(lpRect);
}
double CGpsSCView::CovertStdNE(CString StrNE)
{
CString Str,tmp;
double dTmp;
BYTE Len,i,chr;
StrNE.Replace("\r","");
StrNE.Replace("\n","");
for(i = 0; i < StrNE.GetLength(); i ++) {
chr = StrNE.GetAt(i);
if(((chr < '0') || (chr > '9')) && (chr != '.')) {
tmp = chr;
StrNE.Replace(tmp,"");
}
}
Len = StrNE.GetLength();
Str = StrNE.Right(2);
StrNE = StrNE.Left(Len - 2);
StrNE.Replace(".","");
dTmp = atof(Str);
dTmp = dTmp / 60.0;
return atof(StrNE) + dTmp;
}
void CGpsSCView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bLButtomDown) {
SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_MOVE));
}
TrackDispData(point);
CheckMousePointInList(point);
MoveFatMap(point);
CScrollView::OnMouseMove(nFlags, point);
}
void CGpsSCView::MoveFatMap(CPoint point)
{
int nScale=4;
if(!m_bMoveFatMap) return;
int nHMove, nVMove, i;
nHMove = (point.y - m_pRBDownPoint.y) / nScale;
nVMove = (point.x - m_pRBDownPoint.x) / nScale;
m_nVMove+=point.x - m_pRBDownPoint.x;
m_nHMove+=point.y - m_pRBDownPoint.y;
if(nHMove > 0) {
for(i = 0; i < nHMove; i++) {
OnVScroll(SB_LINEUP, 0 ,NULL); //响应UP键
}
m_nHMove=0;
}
else{
if(m_nHMove>=nScale){
// OnVScroll(SB_LINEUP, 0 ,NULL); //响应UP键
m_nHMove=0;
}
}
if(nHMove < 0) {
nHMove = -nHMove;
for(i = 0; i < nHMove; i++) {
OnVScroll(SB_LINEDOWN, 0 ,NULL); //响应DOWN键
}
m_nHMove=0;
}
else{
if(m_nHMove<=-nScale){
// OnVScroll(SB_LINEDOWN, 0 ,NULL); //响应DOWN键
m_nHMove=0;
}
}
if(nVMove > 0) {
for(i = 0; i < nVMove; i++) {
OnHScroll(SB_LINELEFT, 0 ,NULL); //响应LEFT键
}
m_nVMove=0;
}
else{
if(m_nVMove>=nScale){
// OnHScroll(SB_LINELEFT, 0 ,NULL); //响应LEFT键
m_nVMove=0;
}
}
if(nVMove < 0) {
nVMove=-nVMove;
for(i = 0; i < nVMove; i++) {
OnHScroll(SB_LINERIGHT, 0 ,NULL); //响应RIGHT键
}
m_nVMove=0;
}
else{
if(m_nVMove<=-nScale){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -