// CGisView_Demo1View.cpp : implementation of the CCGisView_Demo1View class
//
#include "stdafx.h"
#include "CGisView_Demo1.h"
#include "ddeobj.h"
#include "CGisView_Demo1Doc.h"
#include "CGisView_Demo1View.h"
#include "dialog2.h"
#include "Win_area.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "childfrm.h"
/
// CCGisView_Demo1View
IMPLEMENT_DYNCREATE(CCGisView_Demo1View, CGisView)
BEGIN_MESSAGE_MAP(CCGisView_Demo1View, CGisView)
……
END_MESSAGE_MAP()
/
// CCGisView_Demo1View construction/destruction
extern HDDEDATA CALLBACK EXPORT DdeCallback(UINT iType,UINT iFmt,HCONV hCconv, HSZ hsz1, HSZ hsz2,HDDEDATA hData,DWORD dwData1,DWORD dwData2);
CDDEObj theDDE;
HWND hwnd;
char * Dwarfs[]={"Grumpy","Sleepy","Sneezy","Bashful","Dopey","Happy","Doc"};
char *Reindeer[]={"Dasher","Dancer","Prancer","Vixen","Comet","Cupid","Donner","Blitzen"};
CCGisView_Demo1View::CCGisView_Demo1View()
{bmp1.LoadBitmap(IDB_BITMAP1);
LButtonPos=(0,0);
gotoanywhere_flage=false;
querybore_flage=false;
flashtype=-1;
connectToDbs=false;
curview_area=-1;
curview_type=-1;
//DDE Initialize
DdeInitialize(&(theDDE.idInst),DdeCallback,APPCLASS_STANDARD |CBF_FAIL_ADVISES |
CBF_FAIL_EXECUTES |CBF_FAIL_POKES |CBF_SKIP_REGISTRATIONS | CBF_SKIP_UNREGISTRATIONS, 0L );
HSZ hszService;
theDDE.AppName="MyDDEApp";
hszService=DdeCreateStringHandle(theDDE.idInst,theDDE.AppName,0);
DdeNameService(theDDE.idInst,hszService,NULL,DNS_REGISTER);
//DDE end
}
HDDEDATA CALLBACK EXPORT DdeCallback(UINT iType,UINT iFmt,HCONV hCconv,
HSZ hsz1, HSZ hsz2,HDDEDATA hData,DWORD dwData1,DWORD dwData2)
{//Topic=hsz1 Item=hsz2.
char szBuffer[32];
switch(iType) {
case XTYP_CONNECT:
//GET the application name
DdeQueryString((theDDE.fakeThis)->idInst,hsz2,szBuffer,sizeof(szBuffer),0);
if((theDDE.fakeThis)->AppName!=szBuffer)
return false;
DdeQueryString((theDDE.fakeThis)->idInst,hsz1,
szBuffer,sizeof(szBuffer),0);
if(strcmp(szBuffer,"Dwarfs") && strcmp(szBuffer,"Reindeer"))
return false;
return (HDDEDATA)TRUE;
break;
case XTYP_REQUEST:
DdeQueryString((theDDE.fakeThis)->idInst,hsz1,
szBuffer,sizeof(szBuffer),0);
if(strcmp(szBuffer,"Dwarfs")==0)
{ //get the item name
DdeQueryString((theDDE.fakeThis)->idInst,hsz2,
szBuffer,sizeof(szBuffer),0);
int dwarfcode=atoi(szBuffer);
// SendMessage(hwnd,WM_COMMAND,ID_TRY2, 0L );
if((dwarfcode<0) || (dwarfcode>6))
return false;
return DdeCreateDataHandle((theDDE.fakeThis)->idInst,
(LPBYTE)Dwarfs[dwarfcode],
strlen(Dwarfs[dwarfcode])+1,
0,hsz2,CF_TEXT,0);
}
}
return NULL;
}
CCGisView_Demo1View::~CCGisView_Demo1View()
{}
BOOL CCGisView_Demo1View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
// ptai=NULL;//选择显示区
return CGisView::PreCreateWindow(cs);
}
/
// CCGisView_Demo1View drawing
void CCGisView_Demo1View::OnDraw(CDC* pDC)
{
CCGisView_Demo1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
hwnd=m_hWnd;
// TODO: add draw code for native data here
CGisView::OnDraw(pDC);
}
void CCGisView_Demo1View::_OwnerDraw(MyDC myDC)
{
short ti,i,j,k;
short *pLst;
short type;
BOOL flage=false;
CCGisView_Demo1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
_GetAreaList(&pLst);
if(pLst==NULL)
return;
for(ti=0;ti<4;ti++) //循环4次,依次显示 区,线,点,网
{
switch(ti)
{
case 0: type=REG; break;
case 1: type=NET; break;
case 2: type=LIN; break;
case 3: type=PNT; break;
}
if(pDoc->ptai==NULL) //选择显示区)
{
for(i=1;i<=pLst[0];i++)
{
if(type!=_GetAreaType(pLst[i]))
continue;
switch(type)
{
case PNT: _DispPntArea(myDC,pLst[i]); break;
case LIN: _DispLinArea(myDC,pLst[i]); break;
case REG: _DispRegArea(myDC,pLst[i]); break;
case NET: _DispLinArea(myDC,pLst[i]); break;
default: break;
}
}
}
else
for(i=1;i<=pDoc->ptai[0];i++)
{
if(type!=_GetAreaType(pDoc->ptai[i]))
continue;
for(k=1;k<=pLst[0];k++) {
if(pLst[k]==pDoc->ptai[i]) {flage=true; break;}
flage=false;
}
if(flage)
switch(type)
{
case PNT: _DispPntArea(myDC,pDoc->ptai[i]); break;
case LIN: _DispLinArea(myDC,pDoc->ptai[i]); break;
case REG: _DispRegArea(myDC,pDoc->ptai[i]); break;
case NET: _DispLinArea(myDC,pDoc->ptai[i]); break;
default: break;
}
}
}
}
/
// CCGisView_Demo1View diagnostics
#ifdef _DEBUG
void CCGisView_Demo1View::AssertValid() const
{
CGisView::AssertValid();
}
void CCGisView_Demo1View::Dump(CDumpContext& dc) const
{
CGisView::Dump(dc);
}
CCGisView_Demo1Doc* CCGisView_Demo1View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCGisView_Demo1Doc)));
return (CCGisView_Demo1Doc*)m_pDocument;
}
#endif //_DEBUG
/
// CCGisView_Demo1View message handlers
void CCGisView_Demo1View::LoadAFile(short fType)
{
CCGisView_Demo1App *ptApp;
short ai,i;
short *pOldLst;
short *pNewLst;
ptApp=(CCGisView_Demo1App *)AfxGetApp(); //取当前应用程序对象地址
ai=_OpenArea(ptApp->m_AHInst,fType); //打开一个fType类型的空工作区
if(ai<=0) //失败则返回
return;
if(!_LoadFile(ai)) //装入文件到ai工作区,若失败则关闭工作区,然后返回
{
_CloseArea(ai);
return;
}
_GetAreaList(&pOldLst); //取当前视窗口对应的工作区,若没有,则pOldLst返回NULL
if(pOldLst) //pOldLst!=NULL,说明当前视窗口已经有对应的工作区,保存原来对应的工作区
{
pNewLst=new short [pOldLst[0]+2];//
pNewLst[0]=pOldLst[0]+1;
for(i=1;i<=pOldLst[0];i++)
pNewLst[i]=pOldLst[i];
}
else
{
pNewLst=new short [2];
pNewLst[0]=1;
i=1;
}
pNewLst[i]=ai; //再添加新的工作区
_SetAreaList(pNewLst); //重新设置当前视窗口对应的工作区
delete[] pNewLst;
_RestoreWindow(); //复位当前视窗口
return;
}
void CCGisView_Demo1View::OnLoadPnt()
{
LoadAFile(PNT); //装入点文件
}
void CCGisView_Demo1View::OnLoadLIN()
{
LoadAFile(LIN); //装入线文件
}
void CCGisView_Demo1View::OnLoadREG()
{
LoadAFile(REG); //装入区文件
}
void CCGisView_Demo1View::OnStartFlash()
{
// char _WillGetRect(char yesOrNo);
//是否将要取鼠标左键按住移动的矩型范围,该函数必须在_SetCommandFlag后面调用。
_SetCommandFlag(ID_START_FLASH);
_WillGetRect(1);
return;
}
void CCGisView_Demo1View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
RECT rc;
F_RECT frc;
long *ptLst;
short *ptAiLst;
short i;
CGisView::OnLButtonUp(nFlags, point);
long cmd=_GetCommandFlag();
switch(cmd)
{
case IDMN_ENLARGE: //放大窗口