完善DOS程序的新尝试

本文探讨了在DOS环境下如何借鉴Windows的优点,采用事件驱动机制和GUI设计思想,完善DOS程序。通过定义消息结构、消息队列和窗口结构等,实现了DOS下的图形界面编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       虽 然Microsoft Windows 正 在 逐 渐 取 代DOS 而 成 为 新 的PC 标 准 操 作 系 统 平 台, 但 不 知 你 发 现 了 没 有, 不 管 是 愿 意 或 是 不 愿 意, 我 们 还 是 经 常 在Windows 和DOS 之 间 用“Alt+Tab” 来 回 切 换, 抑 或 是 在“Starting Windows 95... ” 时 别 无 选 择 地 按 下F4。 有 太 多 的 理 由 让 我 们 仍 将 在 一 段 时 间 内 与“ 丑 陋” 的DOS 为 伍,DOS 7.0 仍 将 隐 现 在Windows 95 华 丽 外 表 的 背 后。
   那 么 对 现 阶 段 的DOS 程 序 又 将 如 何 加 以 完 善 呢 ? 我 们 结 合 自 己 以 往 的 开 发 经 验 以 及 最 近 报 刊 中 介 绍 的 新 方 法, 作 了 一 些 有 益 的 尝 试, 希 望 能 给 爱 好 自 己 写 程 序 的 读 者 一 些 启 发 和 帮 助。 有 趣 的 是, 我 们 所 做 的 似 乎 是 类 似Windows 1.0 当 年 所 做 的 一 些 工 作。
  Microsoft Windows 同 其 它 的 高 级 操 作 系 统 平 台 一 样, 主 要 在 以 下 四 个 方 面 优 于DOS : 内 存 自 由 访 问、GUI、 协 同 式 多 任 务( 或 抢 占 式 多 任 务) 以 及 数 量 庞 大 的 设 备 驱 动 程 序。 对 于 后 两 个 方 面, 我 们 目 前 力 不 能 及 或 是 根 本 没 有 必 要 去 做( 因 为 我 们 编 写 的 不 是 一 个 操 作 系 统), 而 前 两 个 方 面 正 是DOS 程 序 目 前 尚 待 完 善 的 方 向。 需 要 注 意 的 是 : 我 们 不 仅 要 实 现 内 存 自 由 访 问 和GUI, 更 重 要 的 是 要 实 现DOS 下 程 序 设 计 思 路 的 转 变, 使DOS 程 序 能 够 更 好 更 快 地 实 现。
   在Windows 下 编 写 过 程 序 的 朋 友 都 知 道Windows 在 其 程 序 运 行 过 程 中 采 取 了 所 谓 的 事 件 驱 动 机 制。 勿 庸 置 疑, 这 种 机 制 与DOS 下 的 过 程 式 编 程 相 比 具 有 较 大 的 优 越 性。 因 此, 在DOS 下 若 采 用 事 件 驱 动 机 制 将 会 带 来 较 大 的 好 处, 正 如UCDOS 6.0 的SDK for C/C++ 中 所 做 的 那 样。 在 我 们 的 程 序 中, 事 件 被 分 为 硬 件 事 件 和 应 用 程 序 事 件 两 大 类, 其 中 硬 件 事 件 又 大 致 分 为 键 盘、 鼠 标 和 时 钟 等 几 类, 而 应 用 程 序 事 件 由 于 种 类 太 多, 故 除 了 系 统 级 的 事 件 外 其 余 的 均 可 根 据 需 要 另 外 定 义。 采 用 了 事 件 驱 动 机 制 后, 主 函 数 就 变 成 了 一 个 大 的 消 息 循 环, 这 时 的 主 函 数 就 具 有Windows 中 的 调 度 程 序 的 作 用, 它 不 断 地 调 用 事 件 捕 获 函 数, 一 旦 有 事 件 发 生 就 生 成 相 应 结 构 的 消 息 发 给 相 应 窗 口, 窗 口 执 行 完 相 应 处 理 后 控 制 权 返 回 主 循 环, 这 就 是 程 序 执 行 的 大 体 过 程。 下 面, 我 们 将 具 体 讨 论 一 下 程 序 的 实 现( 由 于 篇 幅 所 限, 下 面 仅 列 出 程 序 片 断)。

  系 统 消 息 的 结 构 定 义 如 下 :
  typedef struct Sys_Mesg
  {
   unsigned char mesg_valid;// 消 息 有 效 性
   unsigned mesg_type;// 消 息 类 型
   unsigned mesg_word1;// 消 息 内 容1
   unsigned mesg_word2;// 消 息 内 容2
   unsigned mesg_word3;// 消 息 内 容3
   unsigned reserved; // 保 留
  }S_SYS_MESG;

   对 于 键 盘 消 息,mesg_word1 的 高8 位 用 来 表 示 键 的ASCII 码( 如 果 能 表 示 为ASCII 码), 低8 位 用 来 表 示 键 的 扫 描 码( 即 直 接 由INT 09H 得 到 的 键 盘 扫 描 码),mesg_word2 用 来 表 示 统 一 的 自 定 义 虚 拟 键 码, 它 由mesg_word1 的 值 转 换 而 来, 一 般 情 况 下 程 序 直 接 使 用mesg_word2 即 可。 而mesg_word3 中 存 放 着Shift、Ctrl、Caps Lock、Num Lock 等 键 的 状 态。
   对 于 鼠 标 消 息,mesg_word1 用 来 表 示 鼠 标 光 标 热 点 的X 坐 标 值,mesg_word2 用 来 表 示 鼠 标 光 标 热 点 的Y 坐 标 值。mesg_word3 存 放 着 鼠 标 各 按 钮 的 状 态 等 信 息, 第15 位 表 示 键 盘Ctrl 的 状 态, 第14 位 表 示 键 盘Shift 的 状 态, 第13、12、11 位 分 别 表 示 鼠 标 左、 中、 右 按 钮 在 上 次 鼠 标 事 件 发 生 时 的 状 态, 第10、9、8 位 分 别 表 示 鼠 标 左、 中、 右 按 钮 在 本 次 鼠 标 事 件 发 生 时 的 状 态, 第6、5、4、3、2、1、0 位 分 别 表 示 鼠 标 左、 中、 右 按 钮 的 单、 双 击 事 件。 不 难 发 现 以 上 消 息 结 构 中 的 信 息 是 冗 余 的, 程 序 中 可 根 据 具 体 实 现 的 方 便 程 度 选 用 不 同 的 信 息。
   定 时 器 消 息 相 对 来 说 较 简 单,mesg_word1 用 来 表 示 要 求 定 时 消 息 的 程 序ID 值,mesg_word2 和mesg_word3 可 由 读 者 自 行 填 写 需 要 的 内 容。 系 统 建 立 并 维 护 一 张 定 时 器 请 求 表, 表 中 存 放 了 各 程 序ID 值 及 其 所 要 求 的 定 时 数。 定 时 中 断 例 程 根 据 请 求 表 判 断 和 填 写 定 时 器 消 息 结 构 并 放 入 系 统 消 息 队 列。 要 求 定 时 消 息 的 程 序 根 据 所 获 定 时 器 消 息 的ID 值 判 断 是 否 为 自 己 所 需 的 消 息。

   以 下 定 义 的 是 系 统 消 息 队 列 的 结 构 :
  typedef struct Sys_Mesg_Buf
  {
   unsigned char buf_lenth;// 队 列 长 度, 与“40” 对 应
   unsigned char mesg_head;// 队 列 头 指 针
   unsigned char mesg_end;// 队 列 尾 指 针
   S_SYS_MESG sys_mesg[40];// 队 列 内 容
  }S_SYS_MESG_BUF;

   消 息 队 列 为 循 环 单 链 表, 长 度 为40 个 消 息( 可 自 定)。 此 队 列 由 各 中 断 例 程 或 普 通 程 序 填 入( 由 于 填 入 消 息 的 过 程 不 允 许 被 打 断, 因 此 对 于 中 断 优 先 级 比 较 低 的 键 盘 和 鼠 标( 包 括 普 通 程 序) 应 注 意 关 中 断、 开 中 断 处 理, 以 保 证 消 息 的 完 整 填 入), 由 主 函 数 读 出 并 发 往 相 应 的 窗 口。
   下 面 以 鼠 标 为 例, 说 明 如 何 进 行 事 件 的 捕 获 和 处 理。 为 实 现 真 正 意 义 上 的 事 件 驱 动, 我 们 不 能 调 用INT 33H 对 鼠 标 状 态 不 断 进 行 查 询。 从 本 质 上 说, 我 们 应 该 截 获INT 0CH( 对 于 连 接 在COM1 上 的 鼠 标), 但 这 类 资 料 几 乎 无 从 查 找。 幸 好INT 33H 提 供 了0CH 功 能 调 用, 利 用0CH 功 能 我 们 可 以 安 装 自 己 的 鼠 标 事 件 管 理 例 程, 从 而 绕 过 直 接 的 硬 件 编 程。 具 体 的0C H 功 能 细 节 读 者 可 参 考 相 关 的 书 籍 或 文 章, 本 文 不 再 赘 述。 但 在C 程 序 中 利 用0CH 功 能 时 需 要 注 意 一 个 问 题, 将 在 下 文 中 提 及。
   我 们 定 义 了 如 下 的 一 个 最 简 单 的 用 户 鼠 标 事 件 管 理 例 程, 假 设 已 经 定 义 和 分 配 了 全 局 量( 即 消 息 队 列) :

  S_SYS_MESG_BUF far * sys_mesg_buf
  void far User_Mouse_Event(void )
  {
    unsigned button_status;
   unsigned temp_x;
   unsigned temp_y;
   unsigned status=0;
   asm mov temp_x,cx
   asm mov temp_y,dx
   asm mov button_status,bx
   if(Add_One(sys_mesg_buf->buf_lenth, sys_mesg_buf->mesg_end)==sys_mesg_buf->mesg_head)
   {// 队 列 满
       Beep(1000,20);
       return;
   }
   sys_mesg_buf->sys_mesg[sys_mesg_buf->mesg_end].mesg_type=MOUSE_MESG;
   sys_mesg_buf->sys_mesg[sys_mesg_buf->mesg_end].mesg_valid=TRUE;
   sys_mesg_buf->sys_mesg[sys_mesg_buf->mesg_end].mesg_word1=temp_x;
   sys_mesg_buf->sys_mesg[sys_mesg_buf->mesg_end].mesg_word2=temp_y;
   if(button_status==0X0001)
       status=status|LBUTTON_DOWN;
       //LBUTTON_DOWN=0X0100
   else
   if(button_status==0X0002)
       status=status|RBUTTON_DOWN;
       //RBUTTON_DOWN=0X0040
   sys_mesg_buf->sys_mesg[sys_mesg_buf->mesg_end].mesg_word3=status;
   sys_mesg_buf->mesg_end=Add_One(sys_mesg_buf->buf_lenth,sys_mesg_buf->mesg_end);
  }

   其 中Add_One 函 数 用 于 向 循 环 队 列 中 插 入 一 个 成 员。 普 通 程 序 发 消 息 时 可 采 用Send_Sysmesg 函 数, 不 要 直 接 修 改 消 息 队 列。 用 于 挂 接 和 删 除 用 户 鼠 标 事 件 的 管 理 例 程 可 由 以 下 函 数 实 现 :
  void User_Mouse_Event_Set()
  {
   union REGS regs;
   struct SREGS sregs;
   regs.x.ax=0x000C;
   regs.x.cx=0x007F;// 调 用 掩 码
   regs.x.dx=FP_OFF(User_Mouse_Event);
   sregs.es=FP_SEG(User_Mouse_Event);
   int86x(0x33,&regs,&regs,&sregs);
  }

  void User_Mouse_Event_Del()
  {
   union REGS regs;
   regs.x.ax=0x000C;
   regs.x.cx=0x0000;
   int86(0x33,&regs,&regs);
  }

   消 息 被 放 入 消 息 队 列 中 以 后, 我 们 就 可 在 主 函 数 中 获 取 消 息 并 发 往 相 应 的 程 序 了。“Get_Message” 的 基 本 形 式 如 下
  while(1)
  {
   if(Get_Sysmesg()!=SYS_MESG_EMPTY)
   {
   if(current_window->User_Func!=NULL)
   ( * current_window->User_Func)();
   Sys_Func(current_window);
   }
  }
   其 中Get_Sysmesg 的 作 用 实 际 上 是 读 取 消 息 队 列, 判 断 是 否 有 有 效 的 消 息, 如 果 有 则 将 其 写 入 一 个 全 局 的 消 息 结 构, 并 删 除 消 息 队 列 中 的 此 项 消 息, 否 则 返 回SYS_MESG_EMPTY。current_window 是 当 前 窗 口 的 指 针,User_Func 函 数 是 窗 口 结 构 中 定 义 的 用 户 函 数, 它 是 用 户 用 于 控 制 窗 口 行 为 的 主 要 手 段, 也 是 用 户 将 来 主 要 编 写 的 内 容 之 一。Sys_Func 是 系 统 定 义 的 窗 口 处 理 函 数, 主 要 用 于 完 成 窗 口 标 准 构 件( 按 钮、 菜 单、 滚 动 条 等) 的 处 理, 这 个 函 数 相 当 复 杂 繁 琐, 需 要 进 行 仔 细 分 析。 对 于 标 准 构 件 也 可 以 采 用 分 离 处 理 方 式, 即 直 接 在 各 标 准 构 件 的 结 构 中 定 义 相 应 的 处 理 函 数, 而 不 必 再 集 中 在 一 个 函 数 中 处 理, 这 种 方 法 对 于 具 有 很 多 标 准 构 件 的 系 统 来 说 更 具 合 理 性。 这 样, 主 函 数 不 断 读 取 消 息 队 列, 发 现 有 消 息 时 即 先 调 用 用 户 自 定 义 的 窗 口 处 理 函 数, 然 后 再 调 用 系 统 函 数。 这 种 顺 序 有 利 于 用 户 灵 活 实 现 系 统 功 能, 例 如 用 户 函 数 可 以 在 处 理 完 后 删 除 或 修 改 系 统 消 息 以 实 现 特 殊 的 窗 口 行 为。 需 要 指 出 的 是, 用 户 窗 口 处 理 函 数 和 窗 口 标 准 构 件 也 可 以 调 用Send_Message, 特 别 是 在 窗 口 之 间 进 行 通 信 时 尤 其 如 此。

   下 面 我 们 来 谈 谈 窗 口 结 构 的 定 义。 事 实 上, 这 种 定 义 是 见 仁 见 智 的, 读 者 可 以 充 分 发 挥 自 己 的 聪 明 才 智, 设 计 出 合 理 高 效 的 窗 口 来。 这 里 仅 给 出 一 个 基 本 的 构 造 :
  typedef struct window
  {
   int top_x;
   int top_y;
   unsigned width;
   unsigned depth;
   S_RESOURCE * res_head;// 资 源 链 头
   char far * title;
   void far * background_bitmap;
   void far * forground_bitmap;
   void (* Init_Self)();// 窗 口 初 始 化 函 数
   void ( * Kill_Self)();// 窗 口 中 止 函 数
   void ( * User_Func)();
  }S_WINDOW;

   我 们 在 处 理 窗 口 时 采 用 了 栈 结 构, 即 只 有 栈 顶 的 窗 口 是 活 动 的( 当 前 窗 口), 必 须 关 闭 当 前 窗 口 后 才 能 实 现 对 另 一 个 窗 口 的 操 作。 这 种 方 法 可 以 满 足 大 部 分 的 单 任 务 程 序 的 需 要, 但 这 种 栈 结 构 还 不 够 合 理, 有 待 进 一 步 改 进。 在 实 际 应 用 过 程 中, 我 们 采 用 了 一 个 比 较 勉 强 的 方 法 来 解 决 多 窗 口 同 时 工 作 的 问 题, 即 每 个 窗 口 的 用 户 处 理 函 数 除 了 完 成 自 身 的 功 能 外, 还 需 判 断 鼠 标 单 击 时 光 标 处 在 哪 个 窗 口 中, 以 便 将current_window 及 时 赋 给 相 应 窗 口 的 指 针, 从 而 将 控 制 权 交 给 它。 同 时 还 需 要 调 整 窗 口 栈 的 内 容 以 确 保 其 正 确 性。 这 种 作 法 就 像 调 用 了 系 统 的 未 公 开 调 用 功 能, 直 接“ 干 涉” 系 统 工 作, 不 太 可 取。

   关 于 构 件 的 结 构, 下 面 也 给 出 了 一 个 示 例, 仅 供 参 考。
  typedef struct button
  {
   unsigned button_ID;
   int top_x;
   int top_y;
   unsigned width;
   unsigned depth;
   char far * caption;
   struct button * father;
   struct button * son;
   void ( * Been_Clicked)();
  }S_BUTTON;
   按 钮 采 用 双 链 表 结 构, 并 定 义 了 单 击 函 数, 这 类 函 数 也 将 是 用 户 主 要 编 写 的 内 容 之 一。 读 者 可 对 其 稍 加 改 造, 使 按 钮 具 有“ 浮 动 提 示”、“ 光 标 变 换”、“ 自 画 按 钮” 等 丰 富 内 容。 当 然, 要 实 现 这 些 内 容, 还 需 对Sys_Func 作 适 当 的 修 改。
   至 此, 主 要 内 容 已 经 介 绍 完 毕。 作 为 总 结, 我 们 来 看 看 在 这 种 系 统 中 如 何 编 写 程 序。 实 际 上 比 较 简 单, 我 们 所 要 做 的 只 是 分 别 给 窗 口 和 各 构 件 结 构 赋 值, 然 后 编 写 相 应 的“ 单 击 函 数” 和 窗 口 处 理 函 数( 这 是 程 序 的 本 质 部 分), 最 后 在 需 要 创 建 窗 口 时 调 用Create_Window, 窗 口 就 会 被 加 入 到 消 息 循 环 中, 需 要 关 闭 窗 口 时 调 用Kill_Window。

   最 后, 我 们 来 谈 一 些 细 节 问 题, 这 部 分 内 容 可 能 会 使 你 的 程 序 锦 上 添 花。
  1、 为 了 适 应 高 分 辨 率 和 高( 真) 彩 色 下 的 图 形 界 面, 我 们 应 该 编 写 自 己 的 光 标 绘 制 程 序。 同 时, 经 常 使 用INT 33H 光 标 的 读 者 可 能 会 对16*16 的 狭 小 空 间 感 到 不 满 意。 事 实 上, 我 们 同 样 可 以 调 用0CH 功 能 来 完 成 光 标 的 绘 制。 在 我 们 的 程 序 中, 我 们 使 用 了 彩 色32*32( 可 自 定 义) 的 光 标 模 式, 用 它 来 表 现 沙 漏 是 再 合 适 不 过 的 了。 在 下 面 这 个 程 序 中, 我 们 会 遇 到 上 文 所 提 及 的 问 题, 即 由 于0CH 功 能 调 用 不 像 普 通 的 中 断 服 务 程 序(interrupt 类 型), 用 户 鼠 标 事 件 管 理 例 程 可 被 随 机 调 用,C 系 统 不 可 能 为 其 保 存 和 恢 复 寄 存 器, 因 此 在 这 个 例 程 中 我 们 将 不 能 访 问C 的 变 量。 解 决 的 方 法 是 占 用 一 个 绝 对 地 址( 如 空 闲 的INT 60H 向 量 所 在 地 址), 将 例 程 所 需 的 结 构 数 据 指 针 放 入 其 中, 例 程 则 通 过 该 绝 对 地 址 进 行 数 据 操 作。 虽 然INT 60H 是 用 户 定 义 的 中 断, 但 为 保 险 起 见, 应 保 存 其 向 量。 鼠 标 数 据 可 参 考 下 例 :
  typedef struct Mouse_Data
  {
   char code[5];// 执 行 被 替 换 中 断 的 代 码
   unsigned cursor_x;
   unsigned cursor_y;
   unsigned focus_x;// 光 标 热 点 相 对 光 标 位 图 左 上 角 的X 坐 标
   unsigned focus_y;// 光 标 热 点 相 对 光 标 位 图 左 上 角 的Y 坐 标
   unsigned cursor_width;
   unsigned cursor_depth;
   unsigned char cursor_on;// 光 标 显 示 与 否
   char far * image_and;
   char far * image_or;
   char far * image_bk;
   unsigned offset1;
   // 未 用 显 存 中 存 储 第 一 幅 鼠 标 位 图 的 偏 移 地 址
   unsigned offset2;
   // 未 用 显 存 中 存 储 第 二 幅 鼠 标 位 图 的 偏 移 地 址
  }MOUSE_DATA;
   其 中code 由JMP 指 令 和 所 获 的INT 60H 向 量 合 成( 可 参 考 相 关 的 汇 编 书 籍), 以 保 证 经 两 次JMP 后 仍 能 执 行 正 常 的INT 60H。 因 此 在 替 换 时 应 保 证 偏 移 地 址 在 前, 段 址 在 后。 鼠 标 光 标 的 位 图 由 两 个 掩 模 组 成, 首 先 保 存 背 景, 绘 制 时 先 将 第 一 个 掩 模 与 背 景 作 与 运 算, 以 保 证 矩 形 内 不 需 改 变 的 部 分 保 持 不 变, 而 其 余 部 分 写 成 黑 色 ; 再 将 第 二 个 掩 模 与 此 结 果 作 或 运 算, 即 在 黑 色 部 分 绘 出 所 需 的 内 容, 其 余 部 分 同 样 保 持 不 变。 为 了 尽 快 地 完 成 这 一 操 作, 应 使 用 汇 编 语 言 编 写 程 序, 同 时 最 好 利 用 显 存 中 未 使 用 的 部 分 和VGA 的 写 模 式1。 为 此, 还 可 以 利 用 时 钟 中 断INT 08H 来 实 现 动 画 光 标。

  2、 内 存 可 能 比 较 令 人 头 疼。 我 们 使 用 的 是 类 似 于 本 刊1996 年 第1 期 上 的“ 使 自 己 的 应 用 程 序 有 用 不 完 的 内 存” 一 文 中 提 到 的 方 法。 由 此 形 成 的 基 本 思 路 是 : 将 常 规 内 存、XMS(EMS)、INT 15H 和 硬 盘 结 合 起 来 形 成 类 似 虚 存 的 统 一 概 念。 分 配 程 序 将 所 有 这 些 封 装 起 来, 首 先 分 配 常 规 内 存( 保 留 有 置 换 页 面), 用 完 后 先 按 一 定 的 淘 汰 算 法 将 某 些 数 据 淘 汰 到 扩 充 内 存 中, 扩 充 内 存 分 配 完 后 再 按 一 定 的 淘 汰 算 法 将 某 些 数 据 淘 汰 到 硬 盘 中。 这 里 的 扩 充 内 存 是 指XMS 或EMS 以 及 未 装 驱 动 程 序 时 直 接 对INT 15H 的 调 用。 这 种 算 法 现 在 看 来 无 疑 是 比 较 合 理 的, 但 实 现 起 来 比 较 复 杂, 读 者 可 参 考 上 面 提 及 的 这 篇 文 章, 文 中 给 出 了 源 程 序。

  3、 关 于 文 本 的 闪 烁 光 标, 我 们 采 用 截 获INT 08H 的 方 法 来 加 以 实 现, 并 不 困 难。 这 里 就 不 再 详 述, 只 是 补 充 说 明 一 点 : 当 文 本 光 标 和 鼠 标 光 标 同 时 存 在 时, 在 用 户 鼠 标 事 件 管 理 例 程 中 需 加 入 关 中 断 和 开 中 断 的 语 句, 在 文 本 光 标 例 程 中 每 次 显 示 时 都 要 进 行Cursor_Off 和Cursor_On 操 作。

  4、 当DOS 遇 到 致 命 错 误 时 就 会 调 用INT 24 H, 如 果 在 程 序 运 行 中 发 生 这 种 情 况, 轻 则 破 坏 界 面, 使 用 户 认 为 程 序 已 失 去 控 制 ; 重 则 使 程 序 意 外 终 止 丢 失 数 据, 没 有 机 会 关 闭 已 打 开 的 文 件 等 等。 因 此 我 们 必 须 截 获INT 24H 以 保 证 系 统 控 制 权 始 终 保 持 在 自 己 的 程 序 中, 并 有 机 会 给 使 用 者 提 供 更 详 细 和 更 有 帮 助 的 信 息。 需 要 注 意 的 是, 自 己 的INT 24H 例 程 既 要 保 护 所 有 寄 存 器 的 内 容, 又 要 避 免DOS 的 重 入 问 题, 所 以 必 须 仔 细 分 析 各 寄 存 器 内 容 的 含 义。 对 于 有 些C/C++ 编 译 系 统 则 还 需 注 意Ctrl_C 和Ctrl_Break 即INT 23H 和INT 1BH 这 两 者 是 不 同 的。

  5、 在 实 际 编 程 过 程 中, 我 们 发 现 编 写 窗 口 的 工 作 比 较 繁 琐, 调 整 修 改 十 分 麻 烦。 因 此, 我 们 可 以 采 用 类 似 于“Visual” 的 方 法, 编 写 一 个 实 用 程 序 来 画 出 窗 口 并 生 成 相 应 的 程 序 ; 或 者 利 用 实 用 程 序 读 出“WorkShop” 等 工 具 所 产 生 的 文 件 并 生 成 相 应 的 程 序。 我 们 还 可 进 一 步 直 接 生 成 自 己 的 资 源 文 件 供 程 序 调 用, 既 方 便 又 易 于 修 改。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值