VC++编程俱乐部

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

  大家好!新的一期“VC++编程俱乐部”又和大家见面了。我们的网上“VC++编程俱乐部”(http://vcclub.yes8.com)自开通以来,得到了广大的编程爱好者的大力支持和热心参与,在此我们深表谢意,也希望大家能继续给予关爱,齐心协力,共同营造我们VC++编程爱好者的这一方乐土。
  问:如何通过代码获取应用程序主窗口的指针和主窗口的句柄?
  答:应用程序主窗口的指针保存在CWinThread::m_pMainWnd中,编程中可调用AfxGetMainWnd来获取主窗口的指针。如下面的代码可获得主窗口的指针,并使该窗口最大化显示:
  AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);
  而主窗口的句柄可通过如下的方式来获取:
  HWND my_hWnd=AfxGetMainWnd()->m_hWnd;
  问:在编写多文档界面应用程序时,我想定义所有的类都能访问的全局变量,不知如何实现?
  答:例如要将变量MyVar声明为全局变量,只需要在该应用程序CWinApp派生类(比如为CMyApp)定义中加上public型MyVar变量声明,然后就可在程序的任何地方用下面的方法来访问MyVar变量了:
  CMyApp* myapp=(CMyApp*)AfxGetApp();
  Myapp→MyVar=...; //可进行赋值等操作
  问:在不使用通用文件打开对话框的情况下,如何显示某一指定目录下的文件列表?
  答:可以调用CWnd::DlgDirList函数或者CWnd::DlgDirListComboBox()函数,将向列表框或组合框填充指定目录下的文件列表。下面的示例代码将把C:\Temp目录中的文件列表显示在列表框中,其中IDC_LIST1为该列表框的ID值,IDC_CURRENTDIR为一静态文本框的ID值,用来显示当前列表目录。
  char szPath[MAX_PATH]=″C:\\Temp″;
  int nResult=DlgDirList( szPath,IDC_LIST1,IDC_CURRENTDIR,DDL_READWRITE | DDL_READONLY |DDL_HIDDEN |DDL_SYSTEM | DDL_ARCHIVE );
  问:我在编写服务器端的应用程序时,要求没有用户界面,如何才能实现无界面程序?
  答:只要在InitInstance函数中显示主窗口的代码前添加如下代码即可:
  UINT wParam,lParam;
  while(GetMessage(NULL,NULL,wParam,lParam));
  return FALSE;
  问:如何在程序中打开/关闭CDROM?
  答:先在文件头加入:
  #include <mmsystem.h>
  #pragma comment(lib,″WINMM.LIB″)
  使用下面的代码就可以在程序中打开/关闭CDROM了:
  mciSendString(″set cdaudio door open″,NULL,0,0);
  mciSendString(″set cdaudio door closed″,NULL,0,0);
  问:请问如何在程序中动态创建控件(比如一个按钮)?
  答:首先在相应类(如主窗口类)的定义中申明一个控件对象:
  private:
  CButton:* m_pButton;
  然后在对应的cpp文件中添加如下代码即可动态创建控件(其中IDC_MYBUTTON需要手动建立):
  m_pButton=new CButton;
  ASSERT_VALID(m_pButton);
  m_pButton->Create(_T(″Button Title″),WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,CRect(0,0,100,26),this,IDC_MYBUTTON);
  问:我需要在程序中显示一个目录选择对话框,请问如何实现?
  答:可以利用SDK函数SHBrowseForFolder()来实现目录选择对话框。先在需要引入该对话框类的文件中说明:#include <shlobj.h>,然后在需要显示目录选择对话框的函数中加入如下代码:
  BROWSEINFO bi; // 文件夹浏览结构
  char dispname[MAX_PATH],path[MAX_PATH];
  ITEMIDLIST* pidl;
  bi.hwndOwner=0; // 初始化bi
  bi.pidlRoot=0;
  bi.pszDisplayName=dispname;
  bi.lpszTitle=″请选择目录:″;
  bi.ulFlags=BIF_RETURNONLYFSDIRS;
  bi.lpfn=0;
  bi.lParam=0;
  bi.iImage=0;
  // 弹出文件夹浏览目录,并选取目录
  if(pidl=SHBrowseForFolder(&bi))
  { // 取得目录信息,path表示选取的目录
  SHGetPathFromIDList(pidl,path);
  MessageBox(″选取的目录为: ″+CString(path)); }
  问:我想从一些应用程序中“借用”光标和位图等资源,请问在VC++中如何实现?
  答:VC++中选择“File/Open…”菜单项,在弹出的对话框中,选择所需的文件如mspaint.exe,在Open as下拉式列表框中选择Resources,然后按“打开”按钮,以资源方式打开该应用程序(VC++可能会提示不能将修改后的资源存回原文件,可不必管它)。然后就可以很方便地浏览该文件中的资源了,如图标、光标和位图等,还可以将其复制到自己的工程资源中。