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

📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(三).htm

📁 详细的介绍了minigui的原理及其在linux上的实现.
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml#2">2 
                        控件和控件类</A> </TD></TR>
                    <TR>
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml#3">3 
                        控件子类化</A> </TD></TR>
                    <TR>
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml#4">4 
                        对话框和对话框模板</A> </TD></TR>
                    <TR>
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml#5">5 
                        MSG_INITDIALOG 消息</A> </TD></TR>
                    <TR>
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml#6">6 
                        模态对话框和非模态对话框</A></TD></TR>
                    <TR>
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml#7">7 
                        小结</A> </TD></TR>
                    <TR>
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml#author1">作者介绍</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End TOC --><!-- Start Related Content Area -->
            <TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
              <TBODY>
              <TR>
                <TD width=160 bgColor=#000000 height=1><IMG height=1 alt="" 
                  src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(三).files/c.gif" 
                width=160></TD></TR>
              <TR>
                <TD align=middle 
                background="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(三).files/bg-gold.gif" 
                height=5><B>相关内容:</B></TD></TR>
              <TR>
                <TD width=160 bgColor=#666666 height=1><IMG height=1 alt="" 
                  src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(三).files/c.gif" 
                width=160></TD></TR>
              <TR>
                <TD align=right>
                  <TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
                    <TBODY>
                    <TR>
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml">主题一:选择MiniGUI-Threads 
                        或者 MiniGUI-Lite</A> </TD></TR>
                    <TR>
                      <TD><A 
                        href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml">主题二:理解消息循环和窗口过程</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End Related dW Content Area -->
            <TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
              <TBODY>
              <TR>
                <TD width=150 bgColor=#000000 colSpan=2 height=2><IMG height=2 
                  alt="" src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(三).files/c.gif" 
                  width=160></TD></TR>
              <TR>
                <TD width=150 bgColor=#ffffff colSpan=2 height=2><IMG height=2 
                  alt="" src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(三).files/c.gif" 
                  width=160></TD></TR></TBODY></TABLE><!-- END STANDARD SIDEBAR AREA --></TD></TR></TBODY></TABLE><!-- START SUBTITLE AND CONTENT --><SPAN 
      class=atitle2>主题三:对话框和控件编程</SPAN> 
      <P><A 
      href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml#author1">魏永明</A> 
      (<A 
      href="mailto:ymwei@minigui.org">ymwei@minigui.org</A>)<BR>自由撰稿人<BR>2001 年 
      7 月</P>
      <BLOCKQUOTE>本文讲述 MiniGUI 中的对话框和控件编程。首先讲解 MiniGUI 
        中的控件类和控件实例的关系,并举例说明控件子类化的概念及应用;其次讲解 MiniGUI 
        对话框的编程技术,包括对话框模板的定义和对话框回调函数的编程;最后解释模态对话框和非模态对话框之间的区别。</BLOCKQUOTE>
      <P><A id=1 name=1><SPAN class=atitle2>1 
      引言</SPAN></A><BR>对话框编程是一个快速构建用户界面的技术。通常,我们编写简单的图形用户界面时,可以通过调用 CreateWindow 
      函数直接创建所有需要的子窗口,即控件。但在图形用户界面比较复杂的情况下,每建立一个控件就调用一次 CreateWindow 
      函数,并传递许多复杂参数的方法很不可取。主要原因之一,就是程序代码和用来建立控件的数据混在一起,不利于维护。为此,一般的 GUI 
      系统都会提供一种机制,利用这种机制,通过指定一个模板,GUI 系统就可以根据此模板建立相应的主窗口和控件。MiniGUI 
      也提供这种方法,通过建立对话框模板,就可以建立模态或者非模态的对话框。</P>
      <P>本文首先讲解组成对话框的基础,即控件的基本概念,然后讲解对话模板的定义,并说明模态和非模态对话框之间的区别以及编程技术。</P>
      <P><A id=2 name=2><SPAN class=atitle2>2 
      控件和控件类</SPAN></A><BR>许多人对控件(或者部件,widget)的概念已经相当熟悉了。控件可以理解为主窗口中的子窗口。这些子窗口的行为和主窗口一样,即能够接收键盘和鼠标等外部输入,也可以在自己的区域内进行输出――只是它们的所有活动被限制在主窗口中。MiniGUI 
      也支持子窗口,并且可以在子窗口中嵌套建立子窗口。我们将 MiniGUI 中的所有子窗口均称为控件。</P>
      <P>在 Windows 或 X Window 
      中,系统会预先定义一些控件类,当利用某个控件类创建控件之后,所有属于这个控件类的控件均会具有相同的行为和显示。利用这些技术,可以确保一致的人机操作界面,而对程序员来讲,可以像搭积木一样地组建图形用户界面。MiniGUI 
      使用了控件类和控件的概念,并且可以方便地对已有控件进行重载,使得其有一些特殊效果。比如,需要建立一个只允许输入数字的编辑框时,就可以通过重载已有编辑框而实现,而不需要重新编写一个新的控件类。</P>
      <P>如果读者曾经编写过 Windows 应用程序的话,应该记得在建立一个窗口之前,必须确保系统中存在新窗口所对应的窗口类。在 Windows 
      中,程序所建立的每个窗口,都对应着某种窗口类。这一概念和面向对象编程中的类、对象的关系类似。借用面向对象的术语,Windows 
      中的每个窗口实际都是某个窗口类的一个实例。在 X Window 编程中,也有类似的概念,比如我们建立的每一个 Widget,实际都是某个 
      Widget 类的实例。</P>
      <P>这样,如果程序需要建立一个窗口,就首先要确保选择正确的窗口类,因为每个窗口类决定了对应窗口实例的表象和行为。这里的表象指窗口的外观,比如窗口边框宽度,是否有标题栏等等,行为指窗口对用户输入的响应。每一个 
      GUI 
      系统都会预定义一些窗口类,常见的有按钮、列表框、滚动条、编辑框等等。如果程序要建立的窗口很特殊,就需要首先注册一个窗口类,然后建立这个窗口类一个实例。这样就大大提高了代码的可重用性。</P>
      <P>在 MiniGUI 
      中,我们认为主窗口通常是一种比较特殊的窗口。因为主窗口代码的可重用性一般很低,如果按照通常的方式为每个主窗口注册一个窗口类的话,则会导致额外不必要的存储空间,所以我们并没有在主窗口提供窗口类支持。但主窗口中的所有子窗口,即控件,均支持窗口类(控件类)的概念。MiniGUI 
      提供了常用的预定义控件类,包括按钮(包括单选钮、复选钮)、静态框、列表框、进度条、滑块、编辑框等等。程序也可以定制自己的控件类,注册后再创建对应的实例。表 
      1 给出了 MiniGUI 预先定义的控件类和相应类名称定义。</P>
      <P>表 1 MiniGUI 预定义的控件类和对应类名称</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" border=1>
        <TBODY>
        <TR>
          <TD>控件类</TD>
          <TD>类名称</TD>
          <TD>宏定义</TD>
          <TD>备注</TD></TR>
        <TR>
          <TD>静态框</TD>
          <TD>"static"</TD>
          <TD>CTRL_STATIC</TD>
          <TD></TD></TR>
        <TR>
          <TD>按钮</TD>
          <TD>"button"</TD>
          <TD>CTRL_BUTTON</TD>
          <TD></TD></TR>
        <TR>
          <TD>列表框</TD>
          <TD>"listbox"</TD>
          <TD>CTRL_LISTBOX</TD>
          <TD></TD></TR>
        <TR>
          <TD>进度条</TD>
          <TD>"progressbar"</TD>
          <TD>CTRL_PRORESSBAR</TD>
          <TD></TD></TR>
        <TR>
          <TD>滑块</TD>
          <TD>"trackbar"</TD>
          <TD>CTRL_TRACKBAR</TD>
          <TD></TD></TR>
        <TR>
          <TD>单行编辑框</TD>
          <TD>"edit"、"sledit"</TD>
          <TD>CTRL_EDIT、CTRL_SLEDIT</TD>
          <TD></TD></TR>
        <TR>
          <TD>多行编辑框</TD>
          <TD>"medit"、"mledit"</TD>
          <TD>CTRL_MEDIT、CTRL_MLEDIT</TD>
          <TD></TD></TR>
        <TR>
          <TD>工具条</TD>
          <TD>"toolbar"</TD>
          <TD>CTRL_TOOLBAR</TD>
          <TD></TD></TR>
        <TR>
          <TD>菜单按钮</TD>
          <TD>"menubutton"</TD>
          <TD>CTRL_MENUBUTTON</TD>
          <TD></TD></TR>
        <TR>
          <TD>树型控件</TD>
          <TD>"treeview"</TD>
          <TD>CTRL_TREEVIEW</TD>
          <TD>包含在 mgext 库,即MiniGUI 扩展库中。</TD></TR>
        <TR>
          <TD>月历控件</TD>
          <TD>"monthcalendar"</TD>
          <TD>CTRL_MONTHCALENDAR</TD>
          <TD>同上</TD></TR>
        <TR>
          <TD>旋钮控件</TD>
          <TD>"spinbox"</TD>
          <TD>CTRL_SPINBOX</TD>
          <TD>同上</TD></TR></TBODY></TABLE><BR><BR>
      <P>在 MiniGUI 中,通过调用 CreateWindow 函数,可以建立某个控件类的一个实例。控件类既可以是表 1 中预定义 MiniGUI 
      控件类,也可以是用户自定义的控件类。与 CreateWindow 函数相关的几个函数的原型如下(include/window.h):</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>904 HWND GUIAPI CreateWindowEx (const char* spClassName, const char* spCaption,
 905                   DWORD dwStyle, DWORD dwExStyle, int id, 
 906                   int x, int y, int w, int h, HWND hParentWnd, DWORD dwAddData);
 907 BOOL GUIAPI DestroyWindow (HWND hWnd);
 908 
 909 #define CreateWindow(class_name, caption, style, id, x, y, w, h, parent, add_data) \
 910         CreateWindowEx(class_name, caption, style, 0, id, x, y, w, h, parent, add_data)
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
      <P>CreateWindow 
      函数建立一个子窗口,即控件。它指定了控件类、控件标题、控件风格,以及窗口的初始位置和大小。该函数同时指定子窗口的父窗口。CreateWindowEx 
      函数的功能和 CreateWindow 函数一致,不过,可以通过 CreateWindowEx 函数指定控件的扩展风格。DestroyWindow 
      函数用来销毁用上述两个函数建立的控件或者子窗口。</P>
      <P>清单 1 中的程序,利用预定义控件类创建控件。其中hStaticWnd1 是建立在主窗口 hWnd 
      中的静态框;hButton1、hButton2、hEdit1、hStaticWnd2则是建立在 hStaicWnd1 内部的几个控件,并作为 
      hStaticWnd1 的子控件而存在,建立了两个按钮、一个编辑框和一个静态按钮;而 hEdit2 是 hStaicWnd2 的子控件,是 
      hStaticWnd1 的子子控件。</P>
      <P>清单1 利用预定义控件类创建控件</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>#define IDC_STATIC1     100
#define IDC_STATIC2     150
#define IDC_BUTTON1     110
#define IDC_BUTTON2     120
#define IDC_EDIT1       130
#define IDC_EDIT2       140
int ControlTestWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
        static HWND hStaticWnd1, hStaticWnd2, hButton1, hButton2, hEdit1, hEdit2;
        switch (message) {
        case MSG_CREATE:
        {
            hStaticWnd1 = CreateWindow (CTRL_STATIC, 
                                        "This is a static control", 
                                        WS_CHILD | SS_NOTIFY | SS_SIMPLE | WS_VISIBLE | WS_BORDER,
                                        IDC_STATIC1, 
                                        10, 10, 180, 300, hWnd, 0);
            hButton1    = CreateWindow (CTRL_BUTTON,
                                        "Button1", 
                                        WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE, 
                                        IDC_BUTTON1, 
                                        20, 20, 80, 20, hStaticWnd1, 0);
            hButton2    = CreateWindow (CTRL_BUTTON,
                                        "Button2", 
                                        WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE, 
                                        IDC_BUTTON2, 
                                        20, 50, 80, 20, hStaticWnd1, 0);
            hEdit1      = CreateWindow (CTRL_EDIT,
                                        "Edit Box 1", 
                                        WS_CHILD | WS_VISIBLE | WS_BORDER, 
                                        IDC_EDIT1, 
                                        20, 80, 100, 24, hStaticWnd1, 0);
            hStaticWnd2 = CreateWindow (CTRL_STATIC, 

⌨️ 快捷键说明

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