虚拟串口(非常、非常初级的文章)

虚拟串口(非常、非常初级的文章)
2010年11月25日
  比如说,假设你的计算机上没有物理串口,你可以用上面所说的虚拟串口的软件虚拟出一个COM1和COM2(并且将它们虚拟地“连接”),然后你用你写的代码向COM1发东西,然后你可以打开“串口调试助手”之类的软件,查看COM2上接收到的内容,就可以调试你写的软件是否正常了。在很多时候这样的软件是非常有用的。
  使用TinyXML时的库冲突问题
  软件中经常需要保存一些用户设置,如果内容不多,可以使用.ini文件来保存,但是比较没有层次性,数据交换也不方便,于是越来越多软件都用XML文件来保存软件的配置信息了。
  TinyXML是一个非常简单、小巧的C++ XML解析器,很容易集成到程序中。使用TinyXML来读写XML文件非常简单,今天我依葫芦画瓢地写了一段代码,用于将我软件中的设置信息写入XML文件,编译没有问题,链接的时候却出错,在网上搜了一下,找到了微软的文章(http://msdn2.microsoft.com/zh-cn/library/6wtdswk0(VS.80).aspx),一下就解决了问题,原来是TinyXML的库tinyxml.lib与某个默认库产生了冲突,所以只要忽略掉这个默认库就可以了。
  我用的是VC2005,解决方法是:“项目”→“×××属性”→“链接器”→“输入”的“忽略特定库”中填上msvcrt.lib,再重新编译运行,搞定!
  CTrueColorToolBar还真好用!
  如果你用VC的工具栏编辑器来制作工具栏图标,那么得到的效果真让人心寒,只支持256色,程序看上去相当丑陋,但是CTrueColorToolBar这个类为我们提供了非常、非常方便的使用真彩色工具条的接口,详见:http://www.codeproject.com/docking/truecolortoolbar.asp
  具体就不多说了,今天一试,方知就两个字:好用!绝对值得大家应用在自己的软件中!
  [转帖]取消移动硬盘的自动播放
  移动硬盘一插上系统就开始自动播放,非常讨厌。取消这种功能的办法是:
  使用组策略一次性全部关闭windows xp的自动播放功能:
    如果你想一次全部禁用Windows XP的自动播放功能,可以使用组策略。
    1、点击“开始”选择“运行”,键入“gpedit.msc”,并运行,打开“组策略”窗口;
    2、在左栏的“本地计算机策略”下,打开“计算机配置_管理模板_系统”,然后在右栏的“设置”标题下,双击“关闭自动播放”;
    3、选择“设置”选项卡,勾取“已启用”复选钮,然后在“关闭自动播放”框中选择“所有驱动器”,单击“确定”按钮,退出“组策略”窗口。
    在“用户配置”中同样也可以定制这个“关闭自动播放”。但“计算机配置”中的设置比“用户配置”中的设置范围更广。有助于多个用户都使用这样的设置。
  提醒:“关闭自动播放”设置是只能使系统不再列出光盘和移动存储的目录,并不能够阻止自动播放音乐CD盘。要阻止音乐CD的自动播放,你就只有更改移动设备的属性了。
  CTrueColorToolBar的使用
  这是一个真彩工具条类。使用步骤:
  (1) 在MainFrm.h中加入:
  #define TOOLBAR_DRAW_BUTTON_WIDTH 32 //定义真彩工具条宽度
  #include ".UITrueColorToolBar.h" //真彩工具条支持类
  (2)在MainFrm.h中将这一句注释掉:
  //CToolBar m_wndToolBar; //这一句是系统生成的
  加上:
  CTrueColorToolBar m_wndToolBar; //修改为真彩工具条对象
  (3)在MainFrm.cpp中,将以下部分注释掉:
  /*VC原来生成的
  if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  {
  TRACE0("Failed to create toolbar ");
  return -1; // fail to create
  }
  */
  // TODO: Delete these three lines if you don't want the toolbar to
  // be dockable
  /*VC原来生成的
  m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  EnableDocking(CBRS_ALIGN_ANY);
  DockControlBar(&m_wndToolBar);
  */
  添加上以下代码:
  /*为真彩工具条添加的代码*/
  m_wndToolBar.SetBorders(1, 1, 1, 1); //Fix for WinXP
  if (!m_wndToolBar.Create(this, WS_CHILD |
  WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
  CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  {
  TRACE0("Failed to create toolbar ");
  return -1; //Failed to create
  }
  m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP
  m_wndToolBar.LoadTrueColorToolBar(TOOLBAR_DRAW_BUTTON_WIDTH, //加载真彩工具条
  IDB_BITMAP_NORMAL,
  IDB_BITMAP_HOT,
  IDB_BITMAP_DISABLE);
  其中, IDB_BITMAP_NORMAL 是正常状态的工具条,IDB_BITMAP_HOT 是鼠标移动到上面时的工具条,IDB_BITMAP_DISABLE 是被禁止状态的工具条。这是三个位图(bmp)文件,需要你事先制作好,并导入VC工程的资源中。此外还要注意:你在VC工程的资源里原先的Toolbar尺寸必须调整得与上面代码中的 TOOLBAR_DRAW_BUTTON_WIDTH 的值保持一致,否则显示的时候会出问题。
  (4)OK,编译运行。效果如下所示:
  rackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1759488
  有多个视图时,从文档类获取指定视图类的指针
  从文档类取得视图类的指针:
  CDocument类提供了两个函数用于视图类的定位:
     GetFirstViewPosition()和GetNextView()
  注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变.GetFirstViewPosition()用于
  返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调动的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):
   CView* pView;
   POSITION pos=GetFirstViewPosition();
    pView=GetNextView(pos);
  这样,便可到了C*View类的指针pView.执行完成几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是之几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查.
  如:
  pView->IsKindOf(RUNTIME_CLASS(CView));
  即可检查pView所指是否是CView类。
  VC单文档多视图工程中,在任何地方访问某一指定视图类的方法
  此处讨论的是单文档、多视图的VC工程。
  我们知道,在多视图工程中,要获取某一个指定视图类的指针(进而对它里面的控件等进行操作),我们可以通过这样的办法:
  从文档类取得视图类的指针:
  CDocument类提供了两个函数用于视图类的定位:
   GetFirstViewPosition()和GetNextView()
  注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变.GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调动的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):
  CView* pView;
   POSITION pos=GetFirstViewPosition();
    pView=GetNextView(pos);
  这样,便可到了C*View类的指针pView.执行完成几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是之几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查。
  如:
  pView->IsKindOf(RUNTIME_CLASS(CView));
  即可检查pView所指是否是CView类。
  但是我们也注意到:上述办法的前提条件是你先要得到文档类的指针。在视图类中,获取文档类指针的方法非常简单,但是想在程序的任何地方,例如点击一个菜单弹出的对话框中(指的是:在对话框类的实现文件里)获取文档类的指针,就要多加点东西了:
  首先,我们为文档类添加一个静态函数:
  public:
  static CXXXDoc* GetDoc(); //其中CXXXDoc就是你的文档类的类名
  这个静态函数的实现是:
  CXXXDoc* CXXXDoc::GetDoc()
  {
  CFrameWnd* pFrame = (CFrameWnd*)(AfxGetApp()->m_pMainWnd);
  return (CXXXDoc*)pFrame->GetActiveDocument();
  }
  然后,我们就可以在任何你需要获取某一指定视图类指针的地方,例如上面所说的对话框类中:
  CXXXDoc* pDoc = CXXXDoc::GetDoc();
  再用上面所说的“从文档类取得视图类的指针”的办法,来获取你想要的视图类指针了。得到了指针后,你就可以对视图中的控件等进行操作了。
  话说多线程
  刚接触多线程不久,写了些代码,有些心得,记下来。
  我在dialog-based application中用到了多线程,一个线程是用于进行大量计算的,另一个线程是用于显示计算状态信息的,剩下的就是主线程啦。原来我将和GUI有关的操作(例如利用某控件绘制曲线图)放在了计算线程中――因为它们依赖于计算结果,当结果没有计算出来的时候,是没有数据可以绘图的。但是后来出问题,什么堆栈被破坏之类的提示都出来了,请教了一下别人,修改了方式:将GUI操作放在主线程中,当计算线程完成计算时,向主线程发送一条自定义消息,只要在相关文件中添加好相应的自定义消息定义、映射及处理函数就可以了,当主线程收到这条消息的时候就可以进行相关的动作了。这样下来发现问题解决了。dialog-based application的主线程就是用户界面线程,它是有消息循环的,在别的线程中发消息的方法比较方便。
  一点拙见,也许还有不对的地方。
  笔记本的串口卡
  笔记本没有串口,但是由于工作需要,所以今天买了张笔记本的串口卡(PCMCIA接口转RS232的,单口),BBL(贝贝龙)的 ,便宜,130块。其实你要找得好的话,100块就能拿到手了,不过我看那家信誉比较好,态度也好,所以就买了他的。
  提醒大家:同样是这张卡,我在网上看到有个论坛竟然买380块,简直是宇宙最狠的JS!其实这张卡不
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值