⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cwnd.cpp

📁 基于Windml2.0的窗口系统原代码 , 以及和MFC CDC兼容的CDC
💻 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 + -