[PHP-GTK-DOC] zh_cn add file

[email protected] (mikespook) Fri, 8 Dec 2006 00:03:39 +0800
Newsgroups php.gtk.doc
Message-ID <[email protected]>
Added Files:
php-gtk-doc/manual/zh_cn/tutorials/helloadvanced.xml


-- 
广州市一方信息咨询有限公司
地址:广州市 江南大道中 穗花村 三巷12号204
邮编:510245
电话:020-39738561 020-39738571
传真:020-84476279
网站:www.i-fang.com
邮件:[email protected]
helloadvanced.xml (text/xml, 7.1 KB)
<chapter id="tutorials.helloadvanced">
<!-- $Revision: 1.4 $ -->
 <title>Hello World(高级)</title>

 <simpara>
  这个指南比第一个 hello world 指南介绍了更加高级的功能。这里,我们创建一个用户可以输入用户名和密码的登录窗口。用户点击登录按钮时,检查文本框内容,当用户忘记他的用户名或密码时显示错误的消息。
 </simpara>

 <para>
  这里有一个截屏,显示了程序完成以后的样子:
  <graphic fileref="&directory.images;/tutorials/helloadvanced.png"/>
 </para>

 <para>
  首先,创建一个窗口,设置它的标题并且设置当窗口销毁时退出主循环——这些你应当已经在之前的指南中有所了解:
  <informalexample>
   <programlisting role="php"><![CDATA[
$wnd = new GtkWindow();
$wnd->set_title('Login');
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));
]]></programlisting>
  </informalexample>
 </para>

 <para>
 下一个任务是创建对话框上需要的所有元件。首先,输入用户名和密码的两个文本框:
  <informalexample>
   <programlisting role="php"><![CDATA[
$txtUsername = new GtkEntry();
$txtPassword = new GtkEntry();
]]></programlisting>
  </informalexample>
  我们希望用户明白哪个文本框输入用户名,哪个文本框输入密码,所以还需要标签用于描述:
  <informalexample>
   <programlisting role="php"><![CDATA[
//The second parameter says that the underscore should be parsed as underline
$lblUsername = new GtkLabel('_Username', true);
$lblPassword = new GtkLabel('_Password', true);
]]></programlisting>
  </informalexample>
  最后,我们需要两个按钮:一个用来登录,另一个用来取消进程:
  <informalexample>
   <programlisting role="php"><![CDATA[
$btnLogin    = new GtkButton('_Login');
$btnCancel   = new GtkButton('_Cancel');
]]></programlisting>
  </informalexample>
  你可能注意到 <classname>GtkLabel</classname> 传递的第二个参数,这表明下划线的作用是其后的字符显示下划线,而 <classname>GtkButton</classname> 的构造函数并没有这个参数:按钮的构造函数自动完成助记符的转换,而标签的并不是这样。这个行为可能对你来说有点奇怪,但是这非常类似你有一个助记符在按钮的标签上除此之外普通标签也有一个。(有问题的翻译:This behavior might be strange to you, but it's more likely that you have a mnemonic in a button's label than that a normal label has one.)
 </para>

 <para>
  现在标签需要知道当助记符激活时哪个元件被激活。由下面的方法实现:
  <informalexample>
   <programlisting role="php"><![CDATA[
$lblUsername->set_mnemonic_widget($txtUsername);
$lblPassword->set_mnemonic_widget($txtPassword);
]]></programlisting>
  </informalexample>
  更进一步,我们需要判断当按钮按下时调用哪个操作。取消按钮将会销毁窗口(这将中止应用程序)而登录按钮将检查文本框并调用进一步的操作:
  <informalexample>
   <programlisting role="php"><![CDATA[
$btnCancel->connect_simple('clicked', array($wnd, 'destroy'));
$btnLogin ->connect_simple('clicked', 'login', $wnd, $txtUsername, $txtPassword);
]]></programlisting>
  </informalexample>
  我们向(还未经定义的)<literal>login</literal> 函数传递了作为可选参数的三个元件 <varname>$wnd</varname>,
  <varname>$txtUsername</varname> 和 <varname>$txtPassword</varname> ,因为我们需要:获取文本框的值,同时如果一切正常则销毁或隐藏窗口。
 </para>

 <para>
 现在我们已经有了全部需要的元件,并添加到了窗口上。由于 <classname>GtkWindow</classname> 是二进制容器,它仅仅可容纳一个元件。所以我们需要一个可以容纳许多元件并可很好的对元件进行布局的容器。 <classname>GtkTable</classname> 是一个不错的选择,因为它可以保持标签在一列,同时文本框在下一列:
  <informalexample>
   <programlisting role="php"><![CDATA[
$tbl = new GtkTable(3, 2);
$tbl->attach($lblCredit, 0, 2, 0, 1);
$tbl->attach($lblUsername, 0, 1, 1, 2);
$tbl->attach($txtUsername, 1, 2, 1, 2);
$tbl->attach($lblPassword, 0, 1, 2, 3);
$tbl->attach($txtPassword, 1, 2, 2, 3);
]]></programlisting>
  </informalexample>
  (<varname>$lblCredit</varname> 是仅仅有一条信息的标签。).
  按钮有它们自己的 <classname>GtkHButtonBox</classname>,因为这个类可以将许多按钮排列得非常好:
  <informalexample>
   <programlisting role="php"><![CDATA[
$bbox = new GtkHButtonBox();
$bbox->set_layout(Gtk::BUTTONBOX_EDGE);
$bbox->add($btnCancel);
$bbox->add($btnLogin);
]]></programlisting>
  </informalexample>
 </para>

 <para>
  布局的最后工作是在窗口上添加 table 和 button box。这是无法直接完成的,因为 <classname>GtkWindow</classname> 继承于 <classname>GtkBin</classname> 而只能保持一个元件。所以我们需要另外的容器,这回使用 <classname>GtkVBox</classname>:
  <informalexample>
   <programlisting role="php"><![CDATA[
$vbox = new GtkVBox();
$vbox->pack_start($tbl);
$vbox->pack_start($bbox);
]]></programlisting>
  </informalexample>
   全部就这么多,我们可以显示窗口了:
  <informalexample>
   <programlisting role="php"><![CDATA[
$wnd->add($vbox);
$wnd->show_all();
Gtk::main();
]]></programlisting>
  </informalexample>
 </para>

 <para>
  最后还未完成的是 <literal>login</literal> 函数,当用户点击登录按钮时调用。它将检查用户名和密码的值:如果它们的长度是 0(用户没有输入任何内容),一个错误信息将会显示。如果一切正常,窗口将销毁同时程序继续执行并显示主窗口。
 </para>

 <para>
  从元件获取文本是非常简单的,我们仅仅需要使用 <classname>GtkEntry</classname> 的 <function class="GtkEntry">get_text</function> 方法:
  <informalexample>
   <programlisting role="php"><![CDATA[
$strUsername = $txtUsername->get_text();
$strPassword = $txtPassword->get_text();
]]></programlisting>
  </informalexample>
  使用普通的 php 函数 <literal>strlen</literal> 完成检查。如果出现错误,我们希望显示一个有一条消息的对话框。<classname>GtkMessageDialog</classname> 用于这个任务,它自动创建了图标和按钮(OK, Yes/No):
  <informalexample>
   <programlisting role="php"><![CDATA[
$dialog = new GtkMessageDialog($wnd, Gtk::DIALOG_MODAL, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, $errors);
$dialog->set_markup("The following errors occured:\r\n<span foreground='red'>" . $errors . "</span>");
$dialog->run();
$dialog->destroy();
]]></programlisting>
  </informalexample>
 </para>

 <para>
  现在你只要确保已经将 login 函数放在了主循环的前面(!),那么运行它。
 </para>

 <example>
  <title>全部代码</title>
  <programlisting role="php">
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
               href="&directory.examples;/tutorials/helloadvanced/helloadvanced.phpw"
               parse="text">
    <xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback>
   </xi:include>
  </programlisting>
 </example>

</chapter>