Sample Folders and Files | Description |
SDKSample.vcproj | Visual Studio project file. Select this to open up the whole project in Visual Studio. |
\inc\gauges.h | 包含面板和仪表系统使用的变量、宏和其他结构。在构建仪表时,必须将该文件包含在内。 |
\inc\gps_info.h | 用于GPS系统的头文件。 |
\C-Gauge Samples\makefile | 用于从命令行构建示例代码。 |
\C-Gauge Samples\SDK.h | 定义度量常量、变量和样本测量代码所使用的资源。 |
\C-Gauge Samples\SDK.cpp | 项目的主要源文件。 |
\C-Gauge Samples\SDK.attitude.cpp | 包含姿态指示源,并提供一个sprite示例。 |
\C-Gauge Samples\SDK.control_surfaces.cpp | 包含控件表面的源代码,并提供一个滑块示例。 |
\C-Gauge Samples\SDK.fuel.cpp | 包含燃料表源,并提供一个例子。 |
\C-Gauge Samples\SDK.fuel_selector.cpp | 包含燃料选择器源并提供一个基于图标的示例。 |
\C-Gauge Samples\SDK.temperature.cpp | 包含温度显示源并提供一个字符串和图标示例。 |
\C-Gauge Samples\SDK.wiskey.cpp | 包含威士忌罗盘的来源,并提供一个移动的图像示例。 |
\C-Gauge Samples\SDK.FlightMap.cpp | 包含一个简单的gps标准,并提供了一个实现“owner draw”量表的示例。 |
\C-Gauge Samples\res | 包含与样本测量器使用的资源位图。 |
\C-Gauge Samples\SDK.FlightInfo.xml | XML Gauge string. |
示例的目标是创建一个名为sdk . gau的文件。这个文件供面板系统使用。这个是一个带有扩展的Windows DLL并由面板系统加载的.gau
第一步:定义变量和资源
这个SDK提供的示例代码在三个文件中完成了这些关键定义:
SDK.h
SDK.cpp
SDK.rc
SDK.h: 定义测量仪资源
其结构如下:
下面是一系列的# define指令,它们设置了版本信息以及c++预处理器中的一些常量
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define VERSION_BUILD 0
// magic to get the preprocessor to do what we want
#define lita(arg) #arg
#define xlita(arg) lita(arg)
#define cat3(w,x,z) w##.##x##.##z##\000
#define xcat3(w,x,z) cat3(w,x,z)
#define VERSION_STRING xlita(xcat3 (VERSION_MAJOR,VERSION_MINOR,VERSION_BUILD))
#ifndef VS_VERSION_INFO
#define VS_VERSION_INFO 0x0001
#endif
下面的代码用于定义使用的资源(与态度指标样本有关(SDK.attitude.cpp))
// Attitude Bitmaps
//
#define BMP_ATTITUDE_SMALL_BACKGROUND 0x1000
#define BMP_ATTITUDE_SMALL_CARD1 0x1100
#define BMP_ATTITUDE_SMALL_MASK1 0x1101
#define BMP_ATTITUDE_SMALL_CARD2 0x1200
#define BMP_ATTITUDE_SMALL_MASK2 0x1201
这些常数的实际的具体连接的.bmp文件发生在SDK.rc 中。
通过将十六进制值增加500,您可以识别低分辨率和高分辨率的位图。
#define BMP_1024_AIRSPEED_BACKGROUND 1000
#define BMP_1280_AIRSPEED_BACKGROUND 1500
示例SDK.h为样本表文件使用的所有位图资源定义了常量值。
SDK.rc: 将资源ID和位图文件关联在一起
注意其包含了#include "sdk.h"
下面是版本信息
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "Your Company\0"
VALUE "FileDescription", "Gauge\0"
VALUE "FileVersion", VERSION_STRING
VALUE "LegalCopyright", "Your Copyright.\0"
VALUE "ProductName", "Your Product\0"
VALUE "ProductVersion", VERSION_STRING
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
下面是SDK中定义的每个resource_id定义在(SDK.h )与合适的相关.bmp文件相关连
// Attitude Bitmaps
//
BMP_ATTITUDE_SMALL_BACKGROUND BITMAP DISCARDABLE "res\\SDK.Attitude.bg.BMP"
BMP_ATTITUDE_SMALL_CARD1 BITMAP DISCARDABLE "res\\SDK.Attitude.card1.BMP"
BMP_ATTITUDE_SMALL_MASK1 BITMAP DISCARDABLE "res\\SDK.Attitude.mask1.BMP"
BMP_ATTITUDE_SMALL_CARD2 BITMAP DISCARDABLE "res\\SDK.Attitude.card2.BMP"
BMP_ATTITUDE_SMALL_MASK2 BITMAP DISCARDABLE "res\\SDK.Attitude.mask2.BMP"
SDK.cpp:命名和定位指示器,包含资源文件和输出指针
注意包含gauges.h和SDK.h头文件
然后进行各个模块的编写,各个模块的编写都有一定的规则,规则如下:
/
// Attitude
/
#define GAUGE_NAME "Attitude"
#define GAUGEHDR_VAR_NAME gaugehdr_attitude
#define GAUGE_W 100
#include "SDK.Attitude.cpp"
/
// Control Surfaces
/
#define GAUGE_NAME "Control_Surfaces"
#define GAUGEHDR_VAR_NAME gaugehdr_control_surfaces
#define GAUGE_W 100
#include "SDK.Control_Surfaces.cpp"
/
// Fuel
/
#define GAUGE_NAME "Fuel"
#define GAUGEHDR_VAR_NAME gaugehdr_fuel
#define GAUGE_W 100
#include "SDK.Fuel.cpp"
其他仪表重复上面的代码,GAUGE_NAME为被指定为表名称的字符串,这个表名用在Panel.cfg file under the [windowXX] 的部分,下面部分就是如何在Panel.cfg 里面定义表
gauge00=SDK!Attitude, 247, 58
gauge01=SDK!Control_Surfaces, 370, 160
gauge02=SDK!Fuel, 146, 57
GAUGEHDR_VAR_NAME被指定在Gauge Table 里面,Gauge Table 在下面介绍。
GAUGE_W被指定了一个值,用于度量标准的x轴设计单位的数量。
#include "SDK_xxx.cpp只是在编译中包含每个规格的特定规格代码文件。
/
// Gauge table entries
/
GAUGE_TABLE_BEGIN()
GAUGE_TABLE_ENTRY(&gaugehdr_attitude)
GAUGE_TABLE_ENTRY(&gaugehdr_control_surfaces)
GAUGE_TABLE_ENTRY(&gaugehdr_fuel)
GAUGE_TABLE_ENTRY(&gaugehdr_fuel_selector)
GAUGE_TABLE_ENTRY(&gaugehdr_temperature)
GAUGE_TABLE_ENTRY(&gaugehdr_wiskey)
GAUGE_TABLE_ENTRY(&gaugehdr_flightmap)
GAUGE_TABLE_END()
因此表可以导出一个指针
第二步:设置仪表的头
在每个示例规范源文件的开头,您将看到类似这样的代码片段
// Set up gauge header
char attitude_gauge_name[] = GAUGE_NAME;
extern PELEMENT_HEADER attitude_list;
extern MOUSERECT attitude_mouse_rect[];
代码为gauge header使用的下列变量赋值
PELEMENT_HEADER:确定哪个度量宏构成了背景
MOUSERECT识别鼠标矩形
GAUGE_HEADER_FS700(GAUGE_W, attitude_gauge_name, &attitude_list, attitude_mouse_rect, 0, 0, 0, 0);
然后,代码填充了GAUGE_HEADER_FS700的值,它是仪表头的宏,仪表头是一个结构,它定义了面板系统用来控制仪表DLL的接口。必须导出仪表头,以向面板系统公开仪表接口,下面演示其在代码中的使用
GAUGE_HEADER_FS700(GAUGE_W, attitude_gauge_name, &attitude_list, attitude_mouse_rect, 0, 0, 0, 0);
这里是其宏的语法
#define GAUGE_HEADER_FS700(default_size_mm, gauge_name, element_list, pmouse_rect, pgauge_callback, user_data, parameters, usage)
其成员含义如下:
default_size_mm | 在设计单元中,默认的X轴尺寸。这个值设置为SDK.cpp中的GAUGE_W |
gauge_name | 在SDK.cpp中定义的名称 |
element_list | 一个指向元素列表中的第一个绘图元素的指针 |
pmouse_rect | 指向鼠标矩形的指针 |
pgauge_callback | 一个指向整个仪表的函数的指针。这将传递一个消息给系统。如果没有使用0。 |
user_data | 一个32位的空间,你可以使用任何你想要的数据。如果没有使用0。 |
parameters | 包含字符串的字段,一个指向该字符串的指针被放置在仪表头中,为了方便使用,在仪表毁掉函数中,如果不使用给0 |
usage | 不用,使用0 |
这个GAUGE_HEADER_FS700 创建了一个结构体GAUGEHDR 和一个变量gauge_header,面板系统使用gauge_header变量来初始化每个绘图元素。大多数面板API函数使用gauge_header作为一个参数传递你将经常使用这个变量
第三步:模拟系统失败
FAILURE_RECORD 失败记录
你将使用FAILURE_RECORD结构体 来定义系统,如果失败,则反映在一边上,结构体如下:
typedef struct FAILURE_RECORD
{
FAILURE_KEY key;
FAILURE_ACTION action;
PVOID reserved;
}
FAILURE_RECORD, *PFAILURE_RECORD, **PPFAILURE_RECORD;
下面演示了如何为燃油表构建该结构体:
FAILURE_RECORD fuel_fail[] =
{
{FAIL_SYSTEM_ELECTRICAL_PANELS, FAIL_ACTION_ZERO},
{FAIL_GAUGE_FUEL_INDICATORS, FAIL_ACTION_FREEZE},
{FAIL_NONE, FAIL_ACTION_NONE}
}
{FAILURE_KEY,FAILURE_ACTION}
系统故障被列在FAILURE_KEY枚举中(定义在gauges.h中)
FAIL_NONE | 标志着失败记录的结束 |
OLD_FAIL_SYSTEM_ | 过时的,禁止使用 |
FAIL_SYSTEM_ENGINE | 制定引擎系统故障 |
FAIL_SYSTEM_PITOT_STATIC | Specifies a pitot-static system failure. |
FAIL_SYSTEM_VACUUM | Specifies a vacuum system failure. |
FAIL_GAUGE_ADF | Specifies an ADF gauge system failure. |
FAIL_GAUGE_AIRSPEED | Specifies an airspeed gauge system failure. |
FAIL_GAUGE_ALTIMETER | Specifies an altimeter gauge system failure. |
FAIL_GAUGE_ATTITUDE | Specifies an attitude gauge system failure. |
FAIL_GAUGE_COMMUNICATIONS | Specifies a COM1 communication gauge system failure. |
FAIL_GAUGE_FUEL_INDICATORS | Specifies a fuel indicators gauge system failure. |
FAIL_GAUGE_GYRO_HEADING | Specifies a gyro heading gauge system failure. |
FAIL_GAUGE_MAGNETIC_COMPASS | Specifies a magnetic compass gauge system failure. |
FAIL_GAUGE_NAVIGATION_VOR1 | Specifies a navigation VOR1 gauge system failure. |
FAIL_GAUGE_NAVIGATION_VOR2 | Specifies a navigation VOR2 gauge system failure. |
FAIL_GAUGE_ TRANSPONDER | Specifies a transponder gauge system failure. |
FAIL_GAUGE_TURN_COORDINATOR | Specifies a turn coordinator gauge system failure. |
FAIL_GAUGE_VERTICAL_SPEED | Specifies a vertical speed indicator gauge system failure. |
FAIL_SYSTEM_ELECTRICAL_PANELS | Specifies a failure of the electrical panel. |
FAIL_SYSTEM_ELECTRICAL_AVIONICS | Specifies a failure of the electrical avionics. |
FAIL_GAUGE_COMMUNICATIONS_COM2 | Specifies a COM2 communication gauge system failure. |
FAILURE_ACTION:可以使用定义的FAILURE_ACTION 枚举中的值,建立一个标准元素来响应失败记录中显示的一个或多个系统故障
FAIL_ACTION_NONE = 0 | Takes no action. This type of failure record is typically used as the background static image for covering a gauge. |
FAIL_ACTION_FREEZE | Freezes the gauge element at its last updated position. The element's MODULE_VAR variable(s) will not be updated. |
FAIL_ACTION_ZERO | Sets the element MODULE_VAR variable(s) to 0. |
FAIL_ACTION_NO_DRAW | Erases the element and doesn't draw it again. |
第四步:Using the Gauge Macros使用仪表所定义的宏
在不同的样本测量器的源处移动一点,你会看到不同的宏被用来传递仪表和面板系统之间的参数。这些宏定义在Gauges.h
Sliders Example
要创建一个滑块使用MAKE_SLIDER宏
#define MAKE_SLIDER( NAME, \
RES_ID, \
NEXT_LIST, \
FAILURE, \
DRAW_FLAGS, \
ASI_FLAGS, \
POSITION_X, POSITION_Y, \
SOURCE_VAR_X, CALLBACK_X, SCALE_X, \
SOURCE_VAR_Y, CALLBACK_Y, SCALE_Y )
使用特定于滑块的信息填充结构,例如以下内容SDK.Control_Surfaces.cpp
MAKE_SLIDER
(
cs_slider_trim,
BMP_CS_SMALL_TRIM,
NULL,
0,
IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,
0,
20,44,
MODULE_VAR_NONE, NULL, 0,
ELEVATOR_TRIM, NULL, -100
)
这个代码在 SDK.control_surfaces.cpp 中包含四个独立的MAKE_SLIDER宏,用于每个不同的滑块使用
PELEMENT_HEADER
PELEMENT_HEADER cs_sliders_list[] =
{
&cs_slider_trim.header,
&cs_slider_ailerons.header,
&cs_slider_elevator.header,
&cs_slider_rudder.header,
NULL
};
MAKE_SLIDER
(
cs_slider_ailerons,
BMP_CS_SMALL_AILERONS,
NULL,
0,
IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,
0,
95, 6, AILERON_DEFLECTION, NULL, 100,
MODULE_VAR_NONE, NULL, 0
)
PELEMENT_HEADER cs_sliders_list1[] =
{
&cs_slider_ailerons.header,
NULL
}; \\ END OF FIRST SLIDER MACRO
MAKE_SLIDER(
cs_slider_elevator,
BMP_CS_SMALL_ELEVATOR,
&cs_sliders_list1,
0,
IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,
0,
98, 46,
MODULE_VAR_NONE, NULL, 0,
ELEVATOR_DEFLECTION, NULL, -70
)
PELEMENT_HEADER cs_sliders_list2[] =
{
&cs_slider_elevator.header,
NULL
}; \\ END OF SECOND SLIDER MACRO
MAKE_SLIDER
(
cs_slider_rudder,
BMP_CS_SMALL_RUDDER,
&cs_sliders_list2,
0,
IMAGE_USE_ERASE | IMAGE_USE_TRANSPARENCY,
0,
94, 83,
RUDDER_DEFLECTION, NULL, 80,
MODULE_VAR_NONE, NULL, 0
)
PELEMENT_HEADER cs_sliders_list3[] =
{
&cs_slider_rudder.header,
NULL
}; \\ END OF THIRD SLIDER MACRO
第5步:Making the Background Image
设置背景图片
设置背景图片为仪表,使用MAKE_STATIC 宏,事例使用的背景图片是是Control_surfaces.cpp
一下是MAKE_STATIC 宏的定义:
#define MAKE_STATIC( NAME, \
RES_ID, \
NEXT_LIST, \
FAILURE, \
DRAW_FLAGS, \
ASI_FLAGS, \
POSITION_X, POSITION_Y )\
一下是Control_surfaces.cpp 使用宏的案例:
MAKE_STATIC
(
cs_background,
BMP_CS_SMALL_BACKGROUND,
&cs_sliders_list,
NULL,
IMAGE_USE_TRANSPARENCY,
0,
0,0
)
PELEMENT_HEADER cs_list = &cs_background.header;
Step 6: Defining Mouse Rectangles
定义鼠标
Step 7: Compiling and Using Your Gauges
完成并且使用你的仪表。