📄 cwnd.cpp
字号:
#include <stdio.h>
#include <string.h>
#include "EW_VxWorksAdaptor.h"
#include "CWnd.h"
#include "CEMGIS.h"
#include "EW_Menu.h"
#include "cgis_maincontroller.h"
#include "CGIS_MapView.h"
static CWnd *g_MainWindow = NULL;
CWnd *EW_GetMainWindow()
{
return g_MainWindow;
}
void EW_SetMainWindow(CWnd *pMainWindow)
{
g_MainWindow = pMainWindow;
}
SEM_ID countSem;
int DrawMapTask();
BEGIN_MESSAGE_MAP(CWnd, EW_Window)
ON_NOTIFY (FBN_PRESSED, CWnd::OnExit)
ON_DRAW (CWnd::OnPaint)
ON_KEYDOWN (CWnd::OnKeyDown)
END_MESSAGE_MAP()
//##ModelId=3F57F6DE01EE
CWnd::CWnd(WORD wID) :EW_Window("", wID, FS_NONE)
{
int screenwidth , screenheight;
EW_VxWorksAdaptor *pAdaptor = (EW_VxWorksAdaptor *)EW_GetAdaptor();
pAdaptor->GetScreenSize(&screenwidth , &screenheight);
m_Rect.Set( 0 , 0 , screenwidth , screenheight);
RegisterKey('q', FVK_ENTER, ID_WINDOW);
CEMGIS *pEMGIS = GetCEMGIS();
pEMGIS->SetOwnerWnd(this);
pEMGIS->SetDrawingAreaPos(m_Rect.wLeft , m_Rect.wTop , m_Rect.wRight , m_Rect.wBottom);
m_nDrawingCount = 0;
countSem = semCCreate(SEM_Q_PRIORITY,SEM_EMPTY);
m_hDrawingTask = taskSpawn("DrawTask", 100, 0, 100000,
(FUNCPTR)DrawMapTask,0 , 1 , 2, 3, 4, 5, 6, 7, 8, 9);
}
CWnd::~CWnd()
{
taskDelete(m_hDrawingTask);
semDelete(countSem);
}
void CWnd::OnPaint(EW_OSAdaptor * pAdaptor)
{
CEMGIS *pEMGIS = GetCEMGIS();
//只有当没有图层需要显示的时候才绘制窗口背景
if(pEMGIS->GetLayerCount() == 0){
pAdaptor->BeginDraw(m_Rect);
EW_Window::OnDraw(pAdaptor);
pAdaptor->EndDraw();
return ;
}
if(EW_GetScreen()->GetWindowCount() != 1){
//窗口个数多于1个的时候用单任务绘制地图
pAdaptor->BeginDraw(m_Rect);
CDC *pDC = pAdaptor->GetMemDC();
pEMGIS->OnDraw(pDC , NULL);
pAdaptor->EndDraw();
}else{
//只有主窗口的时候用多任务绘制地图
//发送绘图信号
// pAdaptor->BeginDraw(m_Rect);
m_nDrawingCount++;
semGive(countSem);
}
}
int DrawMapTask()
{
while(1){
//等待接收绘图信号
semTake(countSem , WAIT_FOREVER);
EW_GetMainWindow()->m_nDrawingCount--;
if(EW_GetMainWindow()->m_nDrawingCount < 0)
EW_GetMainWindow()->m_nDrawingCount = 0;
CEMGIS *pEMGIS = GetCEMGIS();
CDC *pDC = EW_GetAdaptor()->GetMemDC();
pEMGIS->OnDraw(pDC , NULL);
if(EW_GetMainWindow()->m_nDrawingCount){
int preMode = pDC->GetBkMode();
pDC->SetBkMode(OPAQUE);
pDC->SetBkColor(RGB(255 , 0 , 0));
pDC->TextOutW(400 , 10 , "显示任务被中断");
pDC->SetBkMode(preMode);
}
// EW_GetAdaptor()->EndDraw();
}
return 1;
}
//##ModelId=3F5C4AEB0321
bool CWnd::OnKeyDown(EW_Message * pMsg)
{
CEMGIS *pEMGIS = GetCEMGIS();
UGL_WCHAR key = pMsg->lData;
switch(key)
{
case '-':
pEMGIS->ZoomOut();
break;
case '+':
pEMGIS->ZoomIn();
break;
case '4':
pEMGIS->Rotate(10);
break;
case '6':
pEMGIS->Rotate(-10);
break;
case FVK_PAGE_DOWN:
pEMGIS->Scroll(GIS_SCROLL_DOWN , 100);
break;
case FVK_PAGE_UP:
pEMGIS->Scroll(GIS_SCROLL_UP , 100);
break;
case FVK_LEFT:
pEMGIS->Scroll(GIS_SCROLL_RIGHT , 1);
break;
case FVK_RIGHT:
pEMGIS->Scroll(GIS_SCROLL_LEFT , 1);
break;
case FVK_UP:
pEMGIS->Scroll(GIS_SCROLL_DOWN , 1);
break;
case FVK_DOWN:
pEMGIS->Scroll(GIS_SCROLL_UP , 1);
break;
case FVK_END:
OnExit();
break;
case FVK_ESCAPE:
OnOpenMenu();
break;
case 'l':
{
pEMGIS->SetOwnerWnd(this);
EW_Rect rect;
GetClientRect(rect);
pEMGIS->SetDrawingAreaPos(rect.wLeft , rect.wTop , rect.wRight , rect.wBottom);
pEMGIS->OpenVXWLayer("road.vxw");
}
break;
default:
break;
}//end switch
}
void CWnd::OnOpenMenu()
{
EW_Menu *pMenu = new EW_Menu(100 , 50);
EW_GetScreen()->AddWindow(pMenu);
}
void CWnd::OnExit(void)
{
EW_GetScreen()->RemoveWindow(this);
EW_VxWorksAdaptor *pAdaptor = (EW_VxWorksAdaptor *)EW_GetAdaptor();
pAdaptor->OnExit();
}
CDC * CWnd::GetDC()
{
EW_VxWorksAdaptor *adaptor = (EW_VxWorksAdaptor *)EW_GetAdaptor();
CDC *pDC = adaptor->GetDC();
return pDC;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -