VC++编程俱乐部 粟利民 孙强 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   #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 ,然后在需要显示目录选择对话框的函数中加入如下代码:   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++可能会提示不能将修改后的资源存回原文件,可不必管它)。然后就可以很方便地浏览该文件中的资源了,如图标、光标和位图等,还可以将其复制到自己的工程资源中。