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

如果读者需要使用光盘中的源代码,请将相关目录及其包含的内容复制到您的硬盘上,并修改对应的硬盘目录属性——取消目录及其所包含子目录和文件的“只读”属性。否则,打开VC项目时由于无法进行文件的“写”操作,会导致提示出错信息。 下面是对光盘中主要实例的简要说明: 实例2-1:演示C++程序的运行步骤。源代码在光盘中“\02\firstcpp”目录下。 实例2-2:Visual C++语言基本元素介绍。源代码在光盘中“\02\secondcpp”目录下。 实例2-3:cout流控制符setw的使用。源代码在光盘中“\02\thirdcpp”目录下。 实例2-4:增加域内填充字符。源代码在光盘中“\02\fourthcpp”目录下。 实例2-5:同一数据用不同进制输出结果。源代码在光盘中“\02\fifthcpp”目录下。 实例2-6:用浮点数的形式输出数据。源代码在光盘中“\02\sixthcpp”目录下。 实例2-7:数据的输入及输出。源代码在光盘中“\02\seventhcpp”目录下。 实例2-8:计算学生平均成绩。源代码在光盘中“\02\eighthcpp”目录下。 实例2-9:函数的调用。源代码在光盘中“\02\ninthcpp”目录下。 实例2-10:用指针传递参数。源代码在光盘中“\02\tenthcpp”目录下。 实例2-11:全局变量和局部变量。源代码在光盘中“\02\eleventhcpp”目录下。 实例2-12:使用指针注意内存的分配。源代码在光盘中“\02\twelfthcpp”目录下。 实例2-13:引用实例。源代码在光盘中“\02\thirteencpp”目录下。 实例2-14:虚函数的使用实例。源代码在光盘中“\02\fourteencpp”目录下。 实例3-1:利用向导生成的应用程序框架实例。源代码在光盘中“\03\test”目录下。 实例4-1:文档的存取。源代码在光盘中“\04\CDocument”目录下。 实例4-2:简单的文本编辑器。源代码在光盘中“\04\CEditView”目录下。 实例5-1:菜单实例。源代码在光盘中“\05\test1”目录下。 实例5-2:图片浏览器源代码在光盘中“\05\picture”目录下。 实例5-3:工具栏资源编辑器。源代码在光盘中“\05\prop”目录下。 实例5-4:工具条的编程技术。源代码在光盘中“\05\record”目录下。 实例5-5:给状态栏添加时间窗格。源代码在光盘中“\05\pane”目录下。 实例6-1:创建模态对话框。源代码在光盘中“\06\dialog_1”目录下。 实例6-2:创建非模态对话框。源代码在光盘中“\06\dialog_2”目录下。 实例6-3:通用对话框展示。源代码在光盘中“\06\dialog_3”目录下。 实例6-4:创建一般属性页对话框。源代码在光盘中“\06\dialog_4”目录下。 实例6-5:创建向导对话框。源代码在光盘中“\06\dialog_5”目录下。 实例7-1:标准控件实例。源代码在光盘中“\07\CtrlTest”目录下。 实例8-1:区域探测实例。源代码在光盘中“\08\finding”目录下。 实例8-2:键盘字符的输入与显示。源代码在光盘中“\08\keyboard”目录下。 实例9-1:字体展示。源代码在光盘中“\09\text”目录下。 实例9-2:文字动画。源代码在光盘中“\09\characters”目录下。 实例9-3:画刷使用实例。源代码在光盘中“\09\Color”目录下。 实例10-1:打印实例。源代码在光盘中“\10\print”目录下。 实例11-1:存取SDI程序文档实例。源代码在光盘中“\11\SerialSDI”目录下。 实例11-2:文件操作实例。源代码在光盘中“\11\FileManipulate”目录下。 实例12-1:使用用户界面线程实例。源代码在光盘中“\12\InterfaceThread”目录下。 实例12-2:使用工作者线程实例。源代码在光盘中“\12\ControlThread”目录下。 实例12-3:多线程实例。源代码在光盘中“\12\WQDemo”目录下。 实例12-4:线程间的通信。源代码在光盘中“\12\ThreadCommu”目录下。 实例13-1:动态链接库(Dll)实例。源代码在光盘中“\13\dlltest ”目录下。 实例13-2:鼠标钩子应用实例。源代码在光盘中“\13\MouseHook”目录下。 实例13-3:键盘钩子应用实例。源代码在光盘中“\13\KeyboardHook”目录下。 实例14-1:WinSock网络程序:聊天室。源代码在光盘中“\14\WinSocketChat”目录下。 实例14-2:利用MSComm控件进行串口数据传输。源代码在光盘中“\14\MSComm”目录下。 实例14-3:简单的WinInet应用程序。源代码在光盘中“\14\SimpleNet”目录下。 实例15-1:创建Access数据库。源代码在光盘的“\15\Info”中。 实例15-2:MFC的ODBC数据库实例。源代码在光盘中“\15\Enroll”目录下。 实例15-3:利用ADO查询并操作数据库实例。源代码在光盘中“\15\AdoTest”目录下。 FTP应用实例:FTP客户端程序,源代码在光盘目录“\16”下。 人事管理系统:源代码在光盘目录“\17”下。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值