快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

金沙赌船贵宾后手机_酒文化网进入



本文将先容以下内容:

有关 GUI 编程的问题

创建窗口工具

处置惩罚事故和看护

窗体和控件

本文应用以下技巧:

Win32 API、C++

目录

兼有本机和可移植性

无 windows.h

处置惩罚每个窗口

直不雅的代码

控件与窗体

窗体编程

处置惩罚窗体

离开旧 ID

事故和看护

菜单、快捷要领及类似项

选项卡控件和窗体

调剂大年夜小

与 Visual Studio 2005 集成

实现行径

应用 C++ 进行 GUI 编程的问题是大年夜多半库的级别太低,给编程职员带来了太多包袱。这些库依附类似 C 说话的布局,或者它们的包装类不能暗藏足够的繁杂性。而且,它们不能使事故编程足够简单,反而迫使您必须懂得有关根基 WM_ 消息的常识。

在本文中,我将为您先容 eGUI++,这是我编写的一个 C++ 库,可为您(客户端编程职员)供给一种处置惩罚 GUI 利用法度榜样的金沙赌船贵宾后手机高档界面。它可以暗藏繁杂性,经由过程完全暗藏 WM_ 消息的常识使事故编程变得相称简单。您不必要处置惩罚任何类似 C 说话的原始布局;始终只必要处置惩罚类。总之,eGUI++ 客户端代码易于涉猎,也易于编写。

eGUI++ 只在 Windows® 中运行。我其实不相信跨平台的 GUI 利用法度榜样,除非是在不太紧张(只是对照简单的测试框架、原型)或者仅供教授教化的场合应用这样的利用法度榜样。更紧张的是,我真的觉得应该善用根基操作系统供给的所有功能。而 Windows XP 和 Windows Vista® 切实着实供给了不少功能。

兼有本机和可移植性

那些期望应用 CLR 代码的人,你们已掌握了 C++。那是一个很好的平台,以是无需对其进行改进。另外愿望应用优越的库来为 Windows 2000 及更新的操作系统生资源机 Windows 代码的人,请继承涉猎。您会对结果知足的;该库使用您的目标操作系统,应用起来很直不雅。并且您根本不必要应用 Microsoft® .NET Framework。您编写的代码应用起来就像 C++ 代码。此外,您将编写的代码不是特定于 Visual C++ 编译器的。假如您乐意,可应用 g++(GNU C++ 编译器)4.1 编译自己写的代码。基础上,假如您封装了 Win32® API,就没什么能阻拦您编写可移植代码了。

也便是说,对付紧张的 GUI,您必要优越的 IDE,如 Visual Studio® 2005 或 Visual Studio 2008 速成版。我已调剂了我的库,以与 Visual Studio 2005 Express 及更新的版本集成,为您供给更好的 GUI 体验。我真正注重的是代码补全功能,以便确保当您创建新的 GUI 类或扩展现有 GUI 类时 IDE 会尽力供给赞助。

我盼望享受编写 GUI 利用法度榜样的历程。是以,我创建 eGUI++ 的目的是使 GUI 代码易于涉猎和编写。例如,我已在所有可能的地方实现了代码补全功能。这样,GUI 编程便安然了(假如存在差错,只要有可能,我就会在编译时将其捕获;否则,将激发运行时非常)。eGUI++ 得当资本编辑器(它与 Visual Studio 2005 和资本编辑器的更新版本进行了集成)。

无 windows.h

包括 windows.h 的主要问题是它太轻易孕育发生差错。什么能让您竣事监视永世不会发生的事故?假设您是 button 类,而在等待键盘事故;您将永世弗成能等到。

那么,您为什么还必要 windows.h 呢?您应该能够应用老例 C++ 类用 C++ 编写 Windows 利用法度榜样。是以,您无需知道 windows.h 的内部信息:无需知道 WM_LBUTTONDBLCLK、WM_LBUTTONUP 以及其他较长的事故名称。无需知道 LPNMITEMACTIVATE、NMHDR 或其他任何可疑的 C 布局。也无需知道更多的 C 样式转换。优越的 C++ GUI 库的主要功能应该是抽象出 Win32 API 并容许您处置惩罚类。

// code from eGUI++

struct os {

typedef enum type {

win_2k,

win_2k_sp4,

win_xp,

win_xp_sp2,

win_vista

};

};

#ifndef EGUI_OS

#define EGUI_OS os::win_xp_sp2

#endif

当知道此代码中的 #ifdefs 很少时,您会异常痛快,由于这样涉猎起来就轻易多了。而您也会留意到某些属性是特定于操作系统的:

property some_prop;

例如,当您面向早期版本的操作系统并考试测验应用上面的属性时,会发生编译时差错。

处置惩罚每个窗口

平日是您(编程职员)抉择工具存在多长光阴。然则,GUI 编程中一个很大年夜的问题是可视窗口和窗口工具之间存在差别 — 抉择何时关闭窗口的是用户。是以,在您的代码中,您可以设置指向窗口已被用户销毁的窗口工具的有效指针或对它的引用。因为这使掩护一对一对应关系(也便是说屏幕上的一个窗口代表一个工具实例,反之亦然)变得艰苦,以是由此规划孕育发生的一个明确限定便是您无法拥有本地窗口实例(算感化域存在时将被销毁):

{

form f(...);

f.show();

...

}

假定您的窗体 f 显示在屏幕上。当您退出 f 的感化域时,会发生什么?您有两种选择:在销毁与该窗体对应的 C++ 实例时,销毁该(屏幕上)窗体或将其留在屏幕上。两个选择都是分歧理的。在第一种环境下,用户可能会认为迷惑,不知道该窗体哪里去了。在第二种环境下,虽然您将窗体留在屏幕上,但由于其对应的 C++ 实例不在了,以是它不会相应任何事故。此外,用户可能已在当 f 位于感化域中时关闭了此屏幕上窗体。是以您应中止对不存在于屏幕上的工具的处置惩罚。

开拓 eGUI++ 类时,除从其基类派生的行径之外,您无意偶尔盼望承袭一些其他行径,例如调剂大年夜小、替换外不雅等。在这种环境下,您可以创建多个可再用的行径类,金沙赌船贵宾后手机然后从这些行径类派生其他行径类。

直不雅的代码

看到 GUI 代码易于编写和涉猎是很让人愉快的。我在此书顶用尽各类法子来确保代码补全功能供给尽可能多的赞助。处置惩罚金沙赌船贵宾后手机大年夜型 GUI 库时,总会有一些轻易遗忘的内容:属性名、事故名称、标志等。我已对其逐一进行处置惩罚。我曾经应用 doxygen 处置惩罚文档;效果很好。我越常应用,就越爱好它。

浏览文档变得异常简单。要查看属性名,只需键入 w->,便可以看到措施和属性,如图 4 所示(属性显示为成员变量,以便于区分)。对付事故名称,记着类可以处置惩罚的事故是很轻易的;只需键入 class_name::ev:: 和范围运算符,之后代码补全功能便会启动并向您显示事故。但处置惩罚标志才是 eGUI++ 真正的亮点所在。对付每个可金沙赌船贵宾后手机由标志组成的属性,要找出可用的标志选项,只需向该标志属性添加“.”,这样代码补全功能就再次派上用处了。作为弥补,我还为属性添加了运算符重载。是以,以下代码是有效的:

w->text = "hello";

w->text += " world";

w->style |= w->style.tiled;

图 4 代码补全功能

为了防止忘怀您可以自由布置的控件列表,我已专门为该列表添加了名为 egui::ctrl 的命名空间。

控件与窗体

假如您曩昔进行过 Win32 GUI 编程,应该对对话框很认识。您也应该很懂得 API 处置惩罚对话框创建 (::CreateDialog) 的要领与处置惩罚窗口创建的要领 (::CreateWindow[Ex]) 有很大年夜不合。作为编程职员,您无需记着两个署名差异很大年夜的繁杂函数。它们均属于窗口类型。eGUI++ 只有一种创建窗口的要领:new_ 函数。

处置惩罚窗体

只管我憎恶领导,但我知道无意偶尔一些领导确凿可以使编程义务变得简单。是以,我在创建窗体之前创建了“新建类”领导。在类视图中,选择“添加类”,然后在“种别”中,选择“eGUI”。在左侧,选择“eGUI 窗体”,单击“添加”。指定类名称,便完成了创建(图 5)。该领导将创建一个名为“.h”的头文件,一个名为“.cpp”的源文件以及一个名为“_form_resource.h”的附加头文件,eGUI++ 会在内部掩护这些文件。

图 5 添加类

着末一个金沙赌船贵宾后手机头文件包孕您在窗体中应用的所有控件名称。是以,您无需创建额外的控件变量和应用数据互换(像在 MFC 中一样),而直接应用控件。假设您拥有一个登录对话框,该对话框具有两个编辑框(“用户名称”和“密码”)和两个按钮(“确定”和“取消”),如图 6 所示。

图 6 编辑框和按钮

将为您天生下列文件:

// login.h

#pragma once

#include "login_form_resource.h"

struct login : form,

private form_resource::login {};

// login.cpp

#include "stdafx.h"

#include "login.h"

请留意,此代码相称简单;没有类似 "enum {IDD = ...}" 的领导样式代码或消息映射。假如您不必要自定义构造函数则不必要供给,应用默认的构造函数即可。

事故和看护

我曾提到,您无需记着单个 WM_ 消息。也便是说,事故是很难驯服的。事故其实太多了,以是您必要一种简便措施来找出您可以相应的事故并轻松地相应它们。您必要找到简便的措施,以便在窗体控件上发肇事故时您能够获得看护,从而可以扩展控件和添加自己的事故。

每个窗口类(控件或窗体)都可以天肇事故。对付每个窗口类,都有一个可捕捉所有事故的事故处置惩罚法度榜样。对付每个事故,都邑定义一个函数来处置惩罚该事故;该函数是虚拟的,着实现不会起任何感化。每个事故处置惩罚法度榜样函数都具有一个参数:事故数据。

对付现有控件,对应的事故类称为 handle_events::control_name。每个现有 eGUI++ 窗口类 wnd_name 都已从 handle_events::wnd_name 派生。假如扩展现有的窗口类,则您始终可以处置惩罚其事故。(简而言之,所有事故处置惩罚法度榜样函数均以“on_”开始。)例如:

struct my_btn : button {

void on_char(ev::char& e) {

cout

假如您曾处置惩罚过其他 GUI 库,就会知道目击不必然为凭,工作没有您想的那么简单。现有的控件不发送事故,而是发送看护。看护以 WM_COMMAND/WM_NOTIFY 消息的形式发送,并且发送到该控件的父级,而不发送到该控件自身。最初,这彷佛很合乎情理:确凿是控件的父级(窗体)必要看护。然则,这使扩展控件类变得相称艰苦。假如您盼望构建树来使当前文件系统可视化,该若何做呢?您必要捕获将要发送到控件的父级的事故,如项目扩展 (TVN_ITEMEXPANDING)。接着,您必要一种措施将看护向下通报到控件自身。

对付 eGUI++ 来说,看护就是事故。是以,这些看护老是发送到控件,然后发送到控件的父级。当经由过程承袭扩展控件类时,每个看护都将转换成其他事故。例如,假如您盼望在用户编辑第一个列时创建显示复合框的列表控件而不是编辑控件,代码应该如下所示:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: