摘要: 今天在实习时碰到一个问题(将给定的点坐标生成shp文件) 。在自己一个人琢磨时,发现可用ArcGIS中的Data Management Tools->Features->Add XY Coordinates 自动生成XY坐标 。 这个比较简单,在ArcToolbox 中找到Add XY Coordinates 双击,在弹出的对话框中选择需要生成XY点坐标的图层。 对于如何用给定 的 点...阅读全文
posted @ 2007-07-12 01:38 天下无霜 阅读(2523) 评论(7) 编辑
摘要: 创建用户时:“密码最短长度为7,其中必须包含以下非字母数字字符:1”的意思是说,密码至少有7位,且非字母、数字的字符至少必须有一个 如:~!@#$%^&*()_+ 当然这些设置可以修改。1.修改machine.config文件(该文件在 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727(所安装Framework的版本号)\C...阅读全文
posted @ 2007-05-05 21:00 天下无霜 阅读(1059) 评论(0) 编辑
摘要: 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象。现介绍几种其它安全性高的页面传值方法。阅读全文
posted @ 2007-04-22 12:21 天下无霜 阅读(303) 评论(0) 编辑

       在MFC DLL 中调用了 封装了ado的数据库操作类MyADO,定义了一个 全局的MyADO类变量。

     在DLL测试程序(静态调用)中,每次退出程序时总是报(msdart.dll)0xC0000005:Access   violation的异常。    调试时发现执行到ADO的Connection的Close方法时就会出现上述错误。     注:COM已初始化

    可能是Close方法写在MyADO类的析构函数中,而在DLL中的MyADO类变量是全局的,可能在关闭程序时先调用CoUninitialize,再调用其析构函数因COM环境已释放而出现内存访问出错。

    经过一番搜索,想到解决方法是:

    M1:在 MyADO类中新增方法 Destroy、把Connection的Close方法写此方法中,然后再在MFC DLL的App类的ExitInstance()方法中调用MyADO类的Destroy() 方法.这样就OK了。 (MFC DLL 是有App类的)

    M2:定义成App类的成员变量

 

    对于非基于MFC 的Win32 DLL工程, 把MyADO类变量定义指针,MyADO * myDB; 在 DllMain函数中处理。

Code

 

 

Reference: 

  1. http://topic.csdn.net/t/20050621/11/4096107.html
  2. http://topic.csdn.net/u/20080322/18/af2ff681-3832-4738-8ccf-35a3f8fd1bff.html
  3. http://topic.csdn.net/t/20020327/09/602528.html
  4. http://topic.csdn.net/t/20030721/17/2054300.html
     
posted @ 2008-12-08 00:01 天下无霜 阅读(867) 评论(0) 编辑

       在一个MFC DLL 工程中,导入ADO库时编译出错,提示重定义

       #import   "c:\program   files\common   files\system\ado\msado15.dll"    no_namespace    rename   ("EOF",   "adoEOF"),   rename("BOF","adoBOF")  


问题:       
      编译后,出现以下错误:   
msado15.tlh(169)   :   error   C2011:   'LockTypeEnum'   :   'enum'   type   redefinition  
msado15.tlh(212)   :   error   C2011:   'DataTypeEnum'   :   'enum'   type   redefinition  
msado15.tlh(256)   :   error   C2011:   'FieldAttributeEnum'   :   'enum'   type   redefinition  
msado15.tlh(277)   :   error   C2011:   'EditModeEnum'   :   'enum'   type   redefinition  
msado15.tlh(285)   :   error   C2011:   'RecordStatusEnum'   :   'enum'   type   redefinition   
msado15.tlh(405)   :   warning   C4146:   unary   minus   operator   applied   to   unsigned   type,   result   still   unsigned  
msado15.tlh(527)   :   error   C2011:   'ParameterDirectionEnum'   :   'enum'   type   redefinition  

……

原因:

      是因为我们建立MFC DLL 工程时,VC在stdafx.h中包含了如下两个操作数据库的类的头文件
     include   <afxdb.h>           //   MFC   database   classes 
     include   <afxdao.h>         //   MFC   DAO   database

     与ADO库中的类型定义冲突。

 

解决方法:

  1、若没有用到上述两个头文件中的类,则去掉stdafx.h中下面所示的两行代码。   
       #include   <afxdb.h>        //   MFC   database   classes   
       #include   <afxdao.h>      //   MFC   DAO   database

  2、导入库时不去掉命名空间,即不加no_namespace  。导入语句改为
        #import   "C:\Program   Files\Common   Files\System\ADO\msado15.dll"     rename("EOF","adoEOF"),   rename("BOF","adoBOF")          
        using   namespace   ADODB; //在用到ADO类的头文件中添加此语句

  3、用rename修改所有重定义的类型名称.
          rename("LockTypeEnum","adoLockTypeEnum")
          rename("DataTypeEnum","adoDataTypeEnum")
          ……

 

 

posted @ 2008-12-06 22:50 天下无霜 阅读(533) 评论(0) 编辑
 

如何动态添加菜单/菜单项、子菜单、右键菜单

 有关菜单的操作主要用到CMenu类,当然也可用相应API函数,CMenu类只是MFCAPI中操作菜单的函数的封装而已。 不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服。 若是SDK编程,那就用API

 

     CMenu menuMain,menu1; //首先 定义CMenu对象

 

一、         创建菜单,有两种方法

1.       LoadMenu函数从资源加载

menuMain.LoadMenu(IDR_MAINFRAME); //从资源加载,这里使用SDI的主菜单资源 

2.       CreateMenu函数创建

menu1.CreateMenu();   //创建菜单,还没有菜单项

二、           添加菜单项,可用AppendMenu()在菜单的最后加、InsertMenu()在指定的位置加.

// ID_TEST1 Resource.h 中定义,随便给个整数值,不要和已有的重复就行了

menu1.AppendMenu(MF_STRING,ID_TEST1,"Test1"); // 第一项菜单项

menu1.AppendMenu(MF_STRING,ID_TEST2,"Test2"); // 第二项菜单项

 

menu1.InsertMenu(1,MF_BYPOSITION|MF_STRING,

(UINT)ID_TEST1,"ID_TEST1"); // 在第二项菜单项前添加新菜单项

三、           添加子菜单

同样用AppendMenu()InsertMenu()函数。不过要注意参数的设置

menu1.AppendMenu(MF_BYPOSITION|MF_POPUP|MF_STRING,

              (UINT) menuMain.GetSubMenu(0) ->m_hMenu,"子菜单");

//第二个参数是菜单的句柄HMENU

四、           删除菜单

DeleteMenu()RemoveMenu()函数来删除指定位置的菜单/菜单项。

两者区别:如果菜单项是一个弹出式菜单,那么DeleteMenuRemoveMenu之间的区别就很重要。DeleteMenu清除弹出式菜单,但RemoveMenu不清除它。一个是彻底的删除,一个只是移除.

 MSDN:  1.The   DeleteMenu   function   destroys   the   handle   to   the   menu   or   submenu   and   frees   the   memory   used   by   the   menu   or   submenu.       它使菜单或者子菜单的handle无效(destroys)  
  2.   RemoveMenu   does   not   destroy   the   menu   or   its   handle,   allowing   the   menu   to   be   reused. 
可以再利用,并不从内存中将menu删除。

五、           添加右键菜单

CMenu menu1;

      menu1.CreatePopupMenu();     //动态创建弹出式菜单对象

      menu1.AppendMenu(MF_STRING,ID_TEST1," 菜单项1");

      menu1.AppendMenu(MF_STRING,ID_TEST2," 菜单项2");

menu1.InsertMenu(2,MF_BYPOSITION|MF_POPUP|MF_STRING,

           (UINT) menuMain.m_hMenu,"子菜单"); //添加子菜单

      CPoint pt;

      GetCursorPos(&pt);

      menu1.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);

      menu1.DestroyMenu();

六、           响应菜单的事件

1.         若是资源中添加的菜单可用Class Wizard添加菜单的响应事件。

2.         若是通过代码创建的菜单,要手工实现菜单的消息映射。本例是在CmainFrame类中,当然也可在View类、Doc类中,基于对话框的同样也可以。

1)        .h文件中

// Generated message map functions

protected:

       //{{AFX_MSG(CMainFrame)

       afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

       afx_msg void OnChangmenuitem(); //这里添加菜单命令处理函数的声明

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()

 

2)        .cpp文件中,

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

       //{{AFX_MSG_MAP(CMainFrame)

       ON_WM_CREATE()

       ON_COMMAND(IDM_CHANGMENUITEM, OnChangmenuitem) //这里添加,注意没有 ;

       //}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

void CMainFrame::OnChangmenuitem()

{

       // 这里写你要如何处理的代码

……      

}

其他方法:

若菜单ID值是连续的,最好用ON_COMMAND_RANGE来映射消息处理函数,可以在一个函数中处理一个范围内的所有消息。

当用户按下某个菜单项,会发出一个WM_COMMAND消息,而菜单项的ID号,就包含在参数wParam的低位中.  
  BOOL   CYourView::OnCommand(WPARAM   wParam,   LPARAM   lParam)

{

  //  TODO:   Add your specialized code here and/or call the base class  
  UINT   m_nItemID=LOWORD(wParam);  
  if   (m_nItemID==ID_YOURITEM)  //ID_YOURITEM
为你加入菜单项时指定的ID

{  
          //
在这里放入响应的代码  
   }  
  return   CScrollView::OnCommand(wParam,   lParam);  
 }  
 

   对于右键菜单可以通过TrackPopupMenu的返回值来处理。在参数uFlags中设置TPM_ RETURNCMD,这样返回值就是你选择的菜单项的ID,然后可以根据ID来处理。

TrackPopupMenu(TPM_ RETURNCMD ,pt.x,pt.y,this);

MSDNIf you specify TPM_RETURNCMD in the uFlags parameter, the return value is the menu-item identifier of the item that the user selected.

七、           其他

DrawMenuBar () ; //当您改变菜单时,需要重画菜单才能显示所做的改变

GetSystemMenu () ; //取得窗口控制窗口

GetMenu()    //取得当前程序使用的菜单

GetSubMenu() //取得子菜单

应使用CMenu类的Detach()成员函数从Cmenu对象中分离出菜单句柄,避免对象失效后程序出错。

如:

       CMenu menu;

       menu.CreatePopupMenu(); //动态创建弹出式菜单对象

       menu.AppendMenu(0,ID_TEST1,"Test1");

       menu.AppendMenu(0,ID_TEST2,"Test2");

 

       CMenu*  menuMain = GetMenu();  //取得程序主菜单 需在CMainFrame类中

       menuMain->AppendMenu(MF_BYPOSITION|MF_POPUP|MF_STRING,(UINT)menu.m_hMenu,"子菜单1"); 

       menu.Detach();      //直接用menu.m_hMenu在运行时出错,menu对象在这个事件结束就销毁了

       DrawMenuBar();  

posted @ 2008-09-27 11:00 天下无霜 阅读(2907) 评论(0) 编辑
摘要: CFile类中的Remove()函数来删除一个文件,但是这样的操作将永久性的删除该文件,不能在必要的时候再恢复该文件,解决这个问题的方法就是把文件送到Windows系统中的回收站里面,而不是简单的永久性删除它,这样用户就可以在必要的时候恢复这个文件。 在Windows的shellapi文件中定义了一个名为SHFileOperation()的外壳函数,用它可以实现各种文件操作,如文件的拷贝、删除、移...阅读全文
posted @ 2008-07-11 14:49 天下无霜 阅读(718) 评论(0) 编辑

在工具栏中嵌入其他控件,如编辑框

1, 定义一个编辑控件对象,不能是局部变量,否则会被释放掉。
在CMainFrame添加类变量  CEdit edit;

2, 调用控件的Create函数,注意控件在工具条的位置。

  CRect rect;

       m_wndToolBar.GetItemRect(1,&rect);

       edit.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndToolBar,ID_EDIT); 
      //ID_EDIT 自己资源的String Table中添加

将对话框作为工具条

1、在资源中插入一个对话框,Stylesstyle设为child,border设为none.

2、在CMainFramem_wndToolBar的改成CDialogBar;

3、把建立工具条的那一句改为:

m_wndToolBar.Create(this,IDD_DIALOG1,WS_CHILD|WS_VISIBLE|CBRS_TOP,AFX_IDW_STATUS_BAR);

 

posted @ 2008-07-10 17:56 天下无霜 阅读(1499) 评论(0) 编辑
摘要: 重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。

覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。

隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了。隐藏与另外两个概念表面上看来很像,很难区分,其实他们的关键区别就是在多态的实现上。

下面,我们来看看它们间的区别。
阅读全文
posted @ 2008-06-28 19:47 天下无霜 阅读(5525) 评论(0) 编辑
摘要: Q:我使用新申请的网易的126/163邮件箱,能在网页上收邮件,但是通过FOXMAIL无法收信,错误提示:ERR,没有权限使用POP3 ,但是以前的126/163邮箱是可以正常使用的, 出现提示:具体信息 -ERR 您没有权限使用pop3功能 重新输入口令吗? 是 否A: 登陆163、126官方网站,得知:目前免费邮箱新注册的用户(从2006年12月20日新注册用户)不支持直接开通smtp、pop...阅读全文
posted @ 2008-04-10 16:46 天下无霜 阅读(15492) 评论(5) 编辑
摘要: Skyling3DMaxMultigen CreatorArcScene.SketchUp (Google)ArcGIS的三维显示与三维分析功能。 三维显示包含的主要内容为:三维场景的生成与设置、三维场景的浏览、叠加纹理、分层设色(贴图)。 三维分析方面的主要内容为:三维场景的属性查询、自动生成等高线、坡度分析、通视分析、剖面图的绘制。阅读全文
posted @ 2008-04-09 01:14 天下无霜 阅读(665) 评论(0) 编辑
摘要: <转>E都市圈地--三维地图搜索的商业模式在哪里 出处:官方新闻| E都市 杭州阿拉丁信息科技有限公司是一家致力于三维仿真网络城市开发的高科技专业公司,公司座落于“天堂硅谷”――杭州。2004年3月成立的阿拉丁公司,经过两年多来的拚博创业,通过自主创新,推出了全球第一个三维仿真的网络交互性城市-----E都市。公司于2004年11月发布“EDUSH...阅读全文
posted @ 2008-04-09 00:19 天下无霜 阅读(624) 评论(0) 编辑
摘要: 一、在字符串前加一个L作用: 如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。 strlen("asd") = 3; strlen(L"asd") = 6;二、_T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式 如果你定义了UNICODE,那么_T宏会把字符串...阅读全文
posted @ 2008-03-06 12:00 天下无霜 阅读(5630) 评论(5) 编辑