VISUAL C++浏览器开发源代码

这是一个使用Visual C++实现的GIS浏览器源代码,包含DDE(动态数据交换)通信功能。代码中展示了如何初始化DDE、注册服务以及处理连接请求。同时,该代码涉及了GIS视图的绘制、文件加载、区域提取以及不同图元类型的处理。通过DDECallback函数,实现了客户端与服务器间的交互,用于处理不同数据类型的请求。
摘要由CSDN通过智能技术生成

// 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: //
放大窗口

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值