⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcc6.htm

📁 SHELL排序算法与应用
💻 HTM
字号:
<html>
<head>
<title>c++系列</title>
 
 
 
 
 
 
 
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
 
 
</head>
<p align="center"><script src="../../1.js"></script></a>

<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center> 
  <table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
    <tbody> 
    <tr> 
      <td width=200 height="59"> 
         
    </tr>
    </tbody> 
  </table>
  <table border=1 bordercolordark=#ffffff bordercolorlight=#ffffff cellpadding=0 
cellspacing=0 width=685 align="center" height="70">
    <tbody> 
    <tr> 
      <td bgcolor=#F9D23C height=14> 
        <div align=center class=H1> <b><strong><b><font face="幼圆" size="3"><span class="unnamed1">在C++ 
          Builder中编写控制面板应用程序</span></font></b></strong></b></font></div>
      </td>
    </tr>
    <tr valign=top> 
      <td class=H1 height=212> 
        <p align="center"><font color="#FF0000"><strong><b><font face="幼圆" size="3"> </span></font></b></strong></font></p>
        <p align="right">  ---转载自《计算机世界日报》 
          (文/李进)</span></font></p>
        <p>  &nbsp;&nbsp;&nbsp; 当我们打开控制面板时,会看到一些控制面板项目,如“添加/删除程序”,“调制解调器”,“系统”等。我们经常需要通过这些项目来对Windows进行配置。使用C++Builder,能方便快速地开发出自己的控制面板应用程序。 
          </span></font></p>
        <p>  ---- 一:利用BCB的可视化编程和控制面板程序标准编程相结合,框架使用标准的控制面板程序编程,具体的功能和显示窗口直接利用C++Builder强大的可视化编程能力来生成。 
          </span></font></p>
        <p>  ---- 控制面板程序实际上就是一个DLL(动态链接库)文件,关键是它实现了CPlApplet函数。CPlApplet是一个回调(callback)函数,它处理所有发送给控制面板应用程序的消息。当控制面板应用程序运行起来时,调用它的程序从该控制面板应用程序中取得CPlApplet函数的地址,然后用该地址调用CPlApplet函数,并将消息传递给它。在处理消息时,必须按照一定的顺序进行。控制面板应用程序还有一个特点,就是一个DLL文件可以实现多个模块,每个模块可以有自己的图标、字符串资源,每一个模块对应于控制面板中的一个项目。 
          </span></font></p>
        <p>  ---- 首先我们来看看控制面板应用程序执行的过程。弄明白了这点,才能编写出正确的控制面板应用程序。 
          </span></font></p>
        <p>  ---- 由于控制面板应用程序是一个DLL文件,所以调用者必须使用LocaLibrary()函数来装载并执行。在控制面板应用程序装载时,CPlApplet 
          函数会接收到CPL_INIT消息,它表示控制面板应用程序正在初始化。这时CPlApplet 函数应该进行一些必要的初始化工作。如果初始化失败,CPlApplet 
          函数应该返回零值,通知调用者中止该控制面板应用程序的运行并释放占用的资源。该消息只发送一次。 </span></font></p>
        <p>  ---- 当CPlApplet 函数返回初始化成功的信息后,调用者会发送CPL_GETCOUNT消息给它,CPlApplet 
          函数应该返回控制面板应用程序中模块的个数。该消息只发送一次。 </span></font></p>
        <p>  ---- 随后,对于每个模块,CPlApplet 
          函数都会收到一条CPL_INQUIRE 和CPL_NEWINQUIRE消息。响应此消息,CPlApplet函数将填充CPLINFO或者NEWCPLINFO结构,其中存放了控制面板应用程序的名称、图标及描述信息。通常只需要处理CPL_INQUIRE消息,如果想更改图标和显示信息(如在不同的语言平台上显示不同的语言文字),则需要响应CPL_NEWINQUIRE消息。对于每个模块都会发送这两个消息一次。 
          </span></font></p>
        <p>  ---- 当CPlApplet 函数接收到CPL_DBLCLK消息时,表示将要运行相应的模块。这个消息可以多次发送,一般的,当使用者用鼠标双击某个图标时,就会发送一个CPL_DBLCLK消息。该消息包含了模块的识别号,因此CPlApplet 
          函数可以分辨出是需要执行那个模块的功能。 </span></font></p>
        <p>  ---- 在控制面板应用程序退出前,对于每一个模块CPlApplet函数都会接收到一条CPL_STOP消息,消息中包含该模块的识别号。此时CPlApplet函数需要针对不同的模块做不同的清理工作。 
          </span></font></p>
        <p>  ---- 在处理完最后一条CPL_STOP消息后,CPlApplet函数会收到CPL_EXIT消息,表示控制面板应用程序即将退出。在CPlApplet函数返回后,调用者将立即使用FreeLibrary()函数释放占用的资源。 
          </span></font></p>
        <p>  ---- 下面我们用C++ Builder来创建一个DLL文件,并编写CPlApplet函数代码。该控制面板应用程序包含一个模块,该模块的功能是显示一个窗口,窗口中显示“Hello 
          World”。以下代码在BCB4专业版和BCB5企业版中调试通过。 </span></font>
        <ol>
          <li> <span class="unnamed1">首先选择菜单“File - &gt; 
            new ”,在出现的画面中选择“DLL Wizard”。 <br>
            </span></font></li>
          <li> <span class="unnamed1">选择菜单中的“save project 
            as”,保存项目文件和CPP文件到指定的目录下。项目文件名称使用默认project1。 <br>
            </span></font></li>
          <li>  定义控制面板应用程序在控制面板中显示的图标。这里我们使用RC资源文件。首先选择菜单中的“new- 
            &gt;Text file”,生成一个文本文件,然后将它另存为ico.rc文件。编辑该文件,在其中加入一行“ MYICON ICON 
            icon1.ico”。 </span></font></li>
        </ol>
        <p>  ---- 将一个图标文件复制到程序所在的目录里,并将文件名改为 
          icon1.ico。或者用Image Editor创建一个。注意,这个图标大小应该为32X32(大图标)。 </span></font></p>
        <p>  ---- 在Project Manager中,将该RC文件加入到工程项目中。 
          </span></font>
        <ol start="4" type="1">
          <li>  加入一个新的Form,该Form将被作为窗口显示出来。 
            </span></font></li>
        </ol>
        <p>  ---- 选择菜单中的“file- &gt;new”,从中选择Form。然后在Forn上加上一个Label对象,设置其Caption为“Hello 
          World”。 </span></font>
        <ol start="5" type="1">
          <li>  编辑project1.cpp文件。</span></font></li>
        </ol>
        <p>  ---- 首先需要包含头文件cpl.h,这样才可以使用一些常数,如CPL_INIT等消息。 
          </span></font></p>
        <p>  ---- 然后定义一个全局变量 gInstance。 
          </span></font></p>
        <p>  ---- 处理DLL的入口函数,将程序句柄保存到全局变量gInstance中。程序内容如下: 
          </span></font></p>
        <pre>  #include  &lt; vcl.h &gt;
#include  &lt; cpl.h &gt;
	HINSTANCE 		gInstance;  
int WINAPI DllEntryPoint(HINSTANCE hinst, 
unsigned long reason, void*)
{
if (reason==DLL_PROCESS_ATTACH) gInstance=hinst;  
//gInstance 中存放着程序的句柄。
    return 1;
}
5:继续编辑project1.cpp文件,完成CPlApplet函数。
//  由于CPlApplet函数需要在DLL外部使用,所以必须被输出。
extern &quot;C&quot; int __stdcall __declspec(dllexport)
CPlApplet(HWND HwControlPanel,  int Msg,  
int lParam1,   int lParam2)
{
  switch (Msg) {
    case CPL_INIT:
       return true; 	// 返回初始化成功的信息
    case CPL_GETCOUNT:
return 1;	// 告诉调用者该控制面板应用程序包含一个模块
    case CPL_NEWINQUIRE: {
      // 在这里设置图标,名称等信息
      NEWCPLINFO *Info=(NEWCPLINFO *)lParam2;
      ZeroMemory(Info,sizeof(NEWCPLINFO));
      Info- &gt;dwSize=sizeof(NEWCPLINFO);
      // 图标用资源文件ico.rc文件中定义的MYICON
      Info- &gt;hIcon=LoadIcon(gInstance,&quot;MYICON&quot;);
      strcpy(Info- &gt;szName,&quot;模块名称&quot;);  
// szName为控制面板中该模块的名称
      strcpy(Info- &gt;szInfo,&quot;模块详细说明&quot; ); 
// szInfo为对该模块的说明。在控制面板
//中使用列表方式查看时,左面是模块的名称,右面是模块的说明。
      return 0;
      }
    case CPL_DBLCLK:
// 在这里加入需要实现的功能。这里我们只是简单的显示Form。
      try
      {
        Application- &gt;Initialize();
Application- &gt;CreateForm(__classid(TForm1), &amp;Form1);
        Application- &gt;Run();
      }
      catch (Exception &amp;exception)
      {
Application- &gt;ShowException(&amp;exception);
      }
      return 0;
    }
}</span></font></pre>
        <p>  ---- 需要注意的是,在BCB4中,用DLL 
          Wizard会生成Project1.cpp文件,新加入的Form为Form1,对应CPP文件为Unit1.cpp;而在BCB5中,不会生成project1.cpp,而是生成了Unit1.cpp,新加入的Form为Form2,对应CPP文件为Unit2.cpp。如果使用的是BCB5,则需要对上述代码做修改。 
          </span></font>
        <ol start="6" type="1">
          <li>  好了,现在我们来编译该程序,成功后会生成一个project1.dll文件。为了让该DLL文件作为控制面板应用程序来运行,我们必须用以下两种方式之一: 
            </span></font></li>
        </ol>
        <p>  ---- ①将其扩展名修改为CPL,并将文件复制到Windows的系统目录下。对于Win9x,复制到c:\windows\system目录下,对于Winnt,复制到c:\winnt\system32下。 
          </span></font></p>
        <p>  ---- ②将其扩展名修改为CPL,并在c:\windows\control.ini文件的[MMCPL]部分,加入该文件的路径,形式为 
          “name=CPL文件的全路径”。 </span></font></p>
        <p>  ---- 现在打开控制面板,就会多了一项“模块名称”。 
          </span></font></p>
        <p>  ---- 二:利用C++Builder本身提供的控制面板应用程序类TappletModule 
          </span></font></p>
        <p>  ---- BCB5中提供了直接生成控制面板应用程序的功能。下面的例子生成一个控制面板应用程序,拥有两个模块,就是说,在控制面板中,会出现两个新的项目。 
          </span></font>
        <ol>
          <li> <span class="unnamed1">运行C++ Builder5,执行菜单中的“File- 
            &gt;New”,选择“Control Panel Application”。 <br>
            </span></font></li>
          <li> <span class="unnamed1">在默认情况下,BCB5已经有了一个模块TAppletModule1,我们需要再增加一个模块TAppletModule2。 
            <br>
            执行菜单中的“File- &gt;New”,选择“Control Panel Module”。模块1和模块2的CPP文件分别为Unit1.cpp和Unit2.cpp。 
            <br>
            </span></font></li>
          <li> <span class="unnamed1">在“Object Inspector”中分别设置这两个模块的图标,名称。这里将TAppletModule1的Caption设置为“模块1”,TAppletModule2的Caption设置为“模块2”,这将是模块显示在控制面板中的名称。点击AppletIcon属性,为它们选择不同的图标。 
            <br>
            </span></font></li>
          <li>  分别在两个模块中编写对消息的处理函数。 
            </span></font></li>
        </ol>
        <p>  ---- TAppletModule提供了7个事件。其中OnActivate对应于CPL_DBLCLICK消息,OnInquire对应于CPL_INQUIRE消息,OnNewInquire对应于NEWINQUIRE消息,OnStop对应于CPL_STOP消息,OnCreate对应于CPL_INIT消息,OnDestroy对应于CPL_EXIT消息。还有一个OnStartWParms事件,如果控制面板应用程序是由RunDll(包括Rundll.exe和Rundll32.exe)启动的,则此事件被触发。例如我想运行控制面板中的“调制解调器”,你可以在命令行上运行:rundll32 
          shell32.dll,Control_RunDll modem.cpl ,这时OnStartWParms事件会被触发。如果是进入控制面板来运行“调制解调器”, 
          OnStartWParms事件就不会被触发。 </span></font></p>
        <p>  ---- 为了增加功能和实现窗口,在两个模块中分别加入Form。对于每个模块,可以作为一个标准的BCB窗口程序来编写。 
          </span></font>
        <ol start="5" type="1">
          <li> <span class="unnamed1">至此,一个控制面板应用程序就已经编写好了。编译后,将生成的project1.cpl复制到c:\windows\system目录下。下图是控制面板中的显示。模块1和模块2实际上是由一个控制面板程序实现的。 
            </span></font></li>
        </ol>
        <p>  ---- 从以上步骤可以看出,用BCB5编写控制面板应用程序非常的方便,所有的框架BCB已经自动的为你编写好了,你只需要决定使用几个模块,并针对每个模块来编写功能代码,从而避免了繁琐的消息处理。 
          </span></font>
         
      </td>
    </tr>
    </tbody> 
  </table>
</div>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -