VC++编程俱乐部

Author: 粟利民 孙强 Date: 2000年 第15期

    大家好!很高兴能有机会能为大家主持“VC++编程俱乐部”。许多VC++编程爱好者都有这样的体会:编程中经常会遇到许多问题需要解答,或是在实际工作中积累了一些实用的经验方法,希望能与广大编程爱好者进行交流探讨。而“VC++编程俱乐部”正好为广大的编程爱好者提供了这样的一方天地。大家如果有问题需要解答,或是希望将自己的一些经验技巧与广大的读者分享,欢迎到我们的网上俱乐部(http://www.vcclub.yes8.com)的编程论坛来发表你的问题和见解,也可将问题或解答发E-mail至sulimin@21cn.com,我们将尽力给予解答。我们热切期待着你的参与!
  问题1:在VC++5.0中创建对话框资源时发现工程中不能使用中文,请问如何才能在应用程序中使用中文?
  答:在VC++6.0中安装程序会自动检测Windows系统的语言环境,并安装相应语言的资源和库文件,所以不存在这个问题。但是在VC++5.0中就不是这样,碰到这种问题时须要将安装盘上\DEVSTUDIO\SHAREDIDE\BIN\IDE目录下的Appwzchs.dll文件拷贝到硬盘上VC++5.0安装目录下的相同目录中,这个文件是MFC AppWizard自动创建工程时要使用的中文资源文件。这样,创建一个新工程时就可以在MFC AppWizard - Step 1对话框中选择所需要的中文资源选项了。
  问题2:我想编写一些DOS小程序用来验证某些函数的执行结果,在VC++中如何编写DOS控制台程序?
  答:在VC++集成开发环境中关闭当前所有的工程,然后在菜单中选择“File/New...”,出现New对话框。选中“Files”标签,选择“C++ Source File”条目,输入源程序名和Location项,单击“OK”按钮,可在新建源文件的编辑窗口中输入DOS控制台的程序代码。然后通过菜单“Build/Build”进行编译和链接,系统会弹出一个对话框,询问是否创建一个默认的工程。单击“是”按钮,系统将为当前文件自动建立一个工程,默认生成的应用程序为DOS应用程序,编译和链接通过后就可以运行该DOS控制台程序了。
  问题3:请问在程序代码的层次比较复杂或函数中的语句嵌套比较多的时候,怎样检测程序中的括号是否匹配?
  答:VC++集成开发环境提供了一个热键,可以很方便地检测括号是否匹配。只要把光标移动到需要检测的括号(如大括号{}、方括号[]、圆括号()和尖括号<>)前面,键入快捷键“Ctrl+]”。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告声。
  问题4:如何在VC++的程序中编程控制窗口的位置(比如移动窗口)?
  答:在应用程序程序中如果要控制窗口的位置,可调用CWnd::SetWindowPos()函数来移动窗口,注意要指定SWP_NOSIZE标志,而且这时目标位置与父窗口的位置有关(顶层窗口则与屏幕有关)。如下面的代码可将窗口移到相对父窗口(100,100)的位置:
  SetWindowPos(NULL, 100, 100, 0,0, SWP_NOSIZE|SWP_NOZORDER);
  另外也可以使用CWnd::MoveWindow()函数,但这个函数须要指定窗口的大小。
  问题5:我在开发多媒体程序时,想自己创建带位图图案的按钮。请问如何在VC++中制作这种位图按钮?
  答:先在对话框中放置一个按钮控件,选中其属性框的Styles标签中的Bitmap复选框。通过ClassWizard定义与该按钮控件相关联的CButton类的对象变量,如m_BitmapButton。创建位图资源,设置标识号如IDB_BITMAPBUTTON。然后在对话框的初始化函数中加入如下代码就可以了:
  // TODO: Add extra Initialization here
  HBITMAP hBitmap=::LoadBitmap(AfxGetInstanceHandle(),
  MAKEINTRESOURCE(IDB_BITMAPBUTTON);
  m_BitmapButton.SetBitmap(hBitmap);
  问题6:要在MDI应用程序中同时打开了多个文档进行浏览和编辑,不知如何获得当前文档和当前视图的指针?
  答:MDI应用程序中要取得当前文档和当前视图的指针,可以调用函数GetActiveDocument()和GetActiveView()来实现。如:
  ((CFrameWnd*)AfxGetApp()->m_pMainWnd))->GetActiveDocument();
  ((CFrameWnd*)AfxGetApp()->m_pMainWnd))->GetActiveView();
  问题7:在MDI应用程序中需要同时打开多个视图来绘制不同的曲线图,请问如何循环浏览所有已经打开的视图?
  答:使用CDocument的GetFirstViewPosition函数可以取得第一个视图的位置,然后调用GetNextView函数取得下一个视图的指针。这两个函数相互配合,就能循环浏览所有的视图了。下面的示例代码将循环刷新每一个视图:
  POSITION pos = GetFirstViewPosition(); // 取得第一个视图的位置
  while (pos != NULL)  // 如果视图有效,则继续查找下一个视图
  {
  CView* pView = GetNextView(pos); // 取得下一个视图
  pView->UpdateWindow();  // 更新视图窗口
  }
  问题8:我在VC++6.0中使用标准文件打开对话框来选择打开文件,请问如何能实现Windows3.1式样的通用对话框?
  答:在Windows95/98系统中,标准文件打开对话框采用的是Explorer的版本。如果要使用Windows3.1式样的文件打开对话框,可以设置对话框变量对象的成员m_ofn取消OFN_EXPLORER标志位来实现,如下代码:
  CFileDialog m_OpenDlg(TRUE);
  m_OpenDlg.m_ofn.Flags&=~OFN_EXPLORER;
  m_OpenDlg.DoModal();