summaryrefslogtreecommitdiffstats
path: root/DOCS/zh/skin.html
blob: 58b7d4aa25d86cbdf39a19894c7f9568f620f7d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=gbk">
  <title>制作Skin -- MPlayer -- Linux下的电影播放器</title>
  <link rel="stylesheet" type="text/css" href="../default.css">
  <style type="text/css">
    em.note {color: green;
             font-style: normal;}
    em.warn {color: red;
             font-style: normal;}
  </style>
</head>

<body>


<h1>附录D - MPlayer skin的格式</h1>
<p>本文件的目的是描述MPlayer的skin的格式。这里所包含的信息可能不对,因为</p>

<ol type="a">
  <li>GUI不是我写的</li>
  <li>GUI还没有完成</li>
  <li>我可能搞错了</li>
</ol>

<p>因此如果某个功能与它在这里被描述的工作方式不一样,不用大惊小怪</p>。

<p>谢谢<em>Zolt醤 Ponekker</em>的帮助。</p>

<p><em>Andr醩 Mohari &lt;mayday@freemail.hu&gt;</em></p>


<h2><a name="overview">D.1 综述</a></h2>

<p>这虽然与skin的格式扯不上什么关系,但是你应该了解MPlayer有<b>没有</b>内建的皮肤,
因此<b>为了能够使用GUI必须安装至少一种皮肤。</b></p>

<h3><a name="dirs">D.1.1 目录</a></h3>

<p>skin的搜索目录(按顺序)是:</p>
<pre>
    $(DATADIR)/Skin/
    $(PREFIX)/share/mplayer/Skin/
    ~/.mplayer/Skin/
</pre>

<p>注意,第一个路径倚赖于MPlayer的安装配置(见<code>configure</code>脚本
的<code>--prefix</code>和<code>--datadir</code>的参数)。</p>

<p>所有的skin被安装到上面列出的一个目录下的自己的目录中,例如:</p>
<pre>
    $(PREFIX)/share/mplayer/Skin/default/
</pre>


<h3><a name="images">D.1.2 图像格式</a></h3>

<p>图像必须是真彩的(24或者32bpp)PNG图片。</p>

<p>在主窗口(见下面)中你能使用包含“透明色”的图像:用颜色#FF00FF(<font color="#FF00FF">深红</font>)
填充的区域在MPlayer看来是完全透明的。这意味着你甚至能改变窗口外形如果你的X服务器有XShape扩展。</p>


<h3><a name="components">D.1.3 Skin的组成部分</a></h3>

<p>Skin的格式是十分自由的(不是像Winamp/XMMS的那种固定格式的皮肤),所以能不能做出些东西取决于你。</p>

<p>目前有三个要被修饰的窗口:<a href="#mainwin">主窗口</a>,<a href="#subwindow">副窗口</a>,<a href="#mainwin">播放条</a>和
<a href="#skinmenu">Skin菜单</a>(右键单击弹出)。</p>

<ul>
  <li><p><b>主窗口</b>和/或者<b>播放条</b>是你控制MPlayer的地方。窗口的背景是图像。各种项目可以(而且必须)被放置在这里:
<em>按钮</em>,<em>滑动条</em>和<em>标签</em>。对于每一个项目,你都必须指定其位置和大小。</p>

    <p>一个<b>按钮</b>有三种状态(按下,释放,禁止),所以按钮图像必须垂直地划分成三部分。
细节参见<a href="#main.button">按钮</a>项目。</p>

    <p><b>滑动条</b>(主要用于搜寻条和音量/平衡控制)可以有任意多的状态只要你把图像分成上下排列的足够多份。
细节参见<a href="#main.hpotmeter">hpotmeter</a>和<a href="#main.potmeter">potmeter</a>。</p>

    <p><b>标签</b>有一点特殊:字符需要从图像文件中绘制,而图像中的字符用<a href="#fonts">字体描述文件</a>描述。
后者一个纯文本文件规定图像中每一字符的x,y坐标和大小(图像文件和他的字体描述文件<em>共同</em>
组成一个字体)。细节参见<a href="#main.dlabel">dlabel</a>和<a href="#main.slabel">slabel</a>。</p>

    <p><em class=note><b>注意:</b>所有图像都能像<a href="#images">图像格式</a>一节中说明的使用透明色。如果X Server不支持
XShape扩展,透明的部分将显示为黑色。如果你想使用这个特性,主窗口背景图像的宽度应该能被8整除。</em></p>
  </li>

  <li><p><b>subwindow</b>是电影显示的地方。如果没有载入电影它将显示一个指定的图像(空的窗口太无聊了:-))
<em class=note><b>注意:</b>在这里<b>不允许</b>使用透明色。</em></p>
  </li>

  <li><p><b>skin菜单</b>仅仅是提供一个通过菜单控制MPlayer的方法。菜单需要两个图像:一个是基础图像
用来显示菜单的正常状态,另一个用来显示被选择的项目。当菜单弹出时,显示第一个图像。如果你把鼠标在
菜单条目上移动,当前选择的项目从第二个图像中复制并覆盖到当前鼠标指针下面的菜单项目上。
(第二个图像从来不作为整体来显示)。</p>

    <p>一个菜单选项用图像中的位置和大小定义(细节参见<a href="#skinmenu">skin菜单</a>)。</p>
  </li>
</ul>

<p>还有一件重要的事情没有提到:为了使按钮,滑动条和菜单项工作,MPlayer必须知道如果他们被点击
的话应该做什么。这是利用<a href="#guimsg">消息</a>(事件)机制完成的。对于这些项目,你必须定义当
他们被点击时将会产生的消息。</p>

<h3><a name="files">D.1.4 文件</a></h3>

<p>你需要制作下列的文件构成一个skin:</p>

<ul>
  <li>一个配置文件称为<a href="#skin">skin</a>,告诉MPlayer如何将skin的不同部分放在一起,
以及如果你在窗口中某处点击的话应该做什么。</li>
  <li>主窗口的背景图像。</li>
  <li>主窗口上代表物件的图像(包括一个或更多字体描述文件用来显示标签)。</li>
  <li>在副窗口中显示的图像(可选)。</li>
  <li>skin菜单的两个图像(仅当你想要创建菜单时才需要他们)。</li>
</ul>

<p>除了skin的配置文件之外,你能给其它文件起随便什么名字(但字体描述文件必须以<code>.fnt</code>为扩展名)。</p>


<h2><a name="skinfile">D.2 skin文件</a></h2>

<p>如上所述,这是skin的配置文件。
它是基于行的;注释行必须以'<code>;</code>'开头(只有空格和tab可以放在'<code>;</code>'之前)。</p>

<p>文件由section组成。每一段描述一个程序的skin,使用下列的形式:</p>

<table border=1 width="100%">
  <tr bgcolor=silver>
    <td>
<pre>
section = <i>section name</i>
.
.
.
end
</pre>
    </td>
  </tr>
</table>

<p>目前只有一个程序,所以你只需要一个section:
它的名称是<b>movieplayer</b>。</p>

<p>这个段中每个窗口用下列形式的块描述:</p>

<table border=1 width="100%">
  <tr bgcolor=silver>
    <td>
<pre>
window = <i>window name</i>
.
.
.
end
</pre>
    </td>
  </tr>
</table>

<p>其中<i>window name</i>可以是下面各字串中的一项:</p>

<ul>
  <li><b>main</b> -- 对于主窗口</li>
  <li><b>sub</b> -- 对于副窗口</li>
  <li><b>menu</b> -- 对于skin菜单</li>
  <li><b>playbar</b> - 播放条</li>
</ul>

<p>(副窗口和skin菜单块是可选的 -- 你不一定要创建菜单或者修饰副窗口 )。</p>

<p>在一个窗口的描述块内,你能用下列形式的一行定义窗口中的每一项目:</p>

<dl>
  <dt><b><code>item = parameter</code></b></dt>
  <dd>其中<code>item</code>是定义GUI项目的类型的字串,<code>parameter</code>是一个数字或者文字值
(或者一组用逗号分开的值的列表)。</dd>
</dl>

<p>把上述的放在一起,整个文件看起来就有点像这样:</p>

<table border=1 width="100%">
  <tr bgcolor=silver>
    <td>
<pre>
section = movieplayer
  window = main
  ; ... items for main window ...
  end

  window = sub
  ; ... items for subwindow ...
  end

  window = menu
  ; ... items for skin menu ...
  end

  window = playbar
  ; ... items for playbar ...
  end
end
</pre>
    </td>
  </tr>
</table>

<p>图像文件的名称必须不带目录名 -- 图像在<code>Skin</code>目录中被搜索。你能(但是并不需要)规定扩展名。
如果文件不存在,MPlayer将试图装载<code>&lt;filename&gt;.&lt;ext&gt;</code>文件,
<code>&lt;ext&gt;</code>可以是<code>png</code>或者<code>PNG</code>(按这个顺序尝试)。第一个匹配文件将被使用。</p>

<p>最后是一些用来定位的语句。主窗口和副窗口可以放置在屏幕的不同的角落,通过给定<code>X</code>和<code>Y</code>坐标。
<code>0</code>代表顶端或左端,<code>-1</code>代表中心然后<code>-2</code>代表右边或底部:</p>

<pre>

(0, 0)----(-1, 0)----(-2, 0)
  |          |          |
  |          |          |
(0,-1)----(-1,-1)----(-2,-1)
  |          |          |
  |          |          |
(0,-2)----(-1,-2)----(-2,-2)

</pre>

<table border=1 cellpadding=5 width="100%">
  <tr bgcolor="#ffffcc">
    <td>这里有个例子可以把这个搞清楚。假设你有个叫<code>main.png</code>的图像用来做主窗口:
      <blockquote>
        <code>base = main, -1, -1</code>
      </blockquote>
      MPlayer将尝试装载<code>main</code>,<code>main.png</code>,<code>main.PNG</code>文件。
    </td>
  </tr>
</table>


<h3><a name="mainwindow">D.2.1 主窗口和播放条</a></h3>

<p>下面是所有能用于'<code>window = main</code>' .&nbsp;.&nbsp;. '<code>end</code>'和'<code>window
= playbar</code>' &nbsp;.&nbsp;. '<code>end</code>'块中的项目的列表。</p>

<dl>
  <dt><a name="main.base"><b><code>base = image, X, Y</code></b></a></dt>
  <dd>指定用于主窗口的背景图像。窗口将显示在屏幕上的<code>X,Y</code>位置,窗口的大小与图像相同。
    <div><em class=warn><b>注意:</b>这些参数目前对显示窗口不起作用。</em></div>
    <div><em class=warn><b>警告:</b>图像中的透明区域(彩色的#FF00FF )在没有XShape扩展的X服务器上是
黑色的。图像的宽度必须能被8整除。</em>    </div>
  </dd>

  <dt><a name="main.button"><b><code>button = image, X, Y, width, height, message</code></b></a></dt>
  <dd>将一个大小为<code>width</code>*<code>height</code>的按钮放置在<code>X</code>,<code>Y</code>的位置。
指定的<code>message</code>将在按钮被点击时产生。被<code>image</code>制定的图像必须有从上到下三个部分
(根据按钮的可能状态),像这样:
<pre>
+------------+
|  pressed   |
+------------+
|  released  |
+------------+
|  disabled  |
+------------+
</pre>
  </dd>

  <dt><a name="main.decoration"><b><code>decoration = enable|disable</code></b></a></dt>
  <dd>允许或禁止window manager修饰主窗口。缺省设定是<b>禁止</b>。<br><br>
    <div><em class="warn"><b>注意:</b>这对显示窗口无效,它们不需要。</em><div>
  </dd>

  <dt><a name="main.hpotmeter"><b><code>hpotmeter = button, bwidth, bheight, phases, numphases, default,
  X, Y, width, height, message</code><br><code>vpotmeter = button, bwidth, bheight, phases, numphases, default,
  X, Y, width, height, message</code></b></a></dt>
  <dd>在<code>X</code>,<code>Y</code>位置放置一个大小为<code>width</code>*<code>height</code>的水平滑动条。
所用的图像可以划分成不同的部分用来显示滑动条的不同状态(例如,你能做一个音量滑动条,当音量从最小变到最大时,
滑动条的颜色从绿色变成红色。)。<code>hpotmeter</code>可以有一个能被水平拖曳的按钮。

    <div>参数是:</div>

    <ul>
      <li><code>button</code> -- 用于按钮的图像(必须有从上到下三部分,跟<a href="#main.button">button</a>中一样)</li>
      <li><code>bwidth</code>,<code>bheight</code> -- 按钮的大小</li>
      <li><code>phases</code> -- 用于hpotmeter的不同的状态的图像。如果你想不要这样的图像可以使用一个特殊的值<code>NULL</code>。
图像必须像这样被垂直划分成<code>numphases</code>个部分:
<pre>
+------------+
|  phase #1  |
+------------+
|  phase #2  |
+------------+
     ...
+------------+
|  phase #n  |
+------------+
</pre>
      </li>
      <li><code>numphases</code> -- <code>phase</code>图像中储存的状态的数量</li>
      <li><code>default</code> -- hpotmeter的缺省值(范围0到100)</li>
      <li><code>X</code>,<code>Y</code> -- hpotmeter的位置</li>
      <li><code>width</code>,<code>height</code> -- <code>hpotmeter</code>的宽度和高度</li>
      <li><code>message</code> -- 当<code>hpotmeter</code>的值改变时产生的消息</li>
    </ul>

  </dd>

  <dt><a name="main.potmeter"><b><code>potmeter = phases, numphases, default, X, Y, width, height, message</code></b></a></dt>
  <dd>没有按钮的<code>hpotmeter</code>。(我猜它是用来旋转,但它只对水平拖拽作出反应)。
描述参数参见<a href="#main.hpotmeter">hpotmeter</a>。<code>phases</code>能设为<code>NULL</code>,
但这实在没什么用处,因为那样你就看不到<code>potmeter</code>在哪里了。</dd>

  <dt><a name="main.font"><b><code>font = fontfile, fontid</code></b></a></dt>
  <dd>定义一个字体。<code>fontfile</code>是以<code>.fnt</code>为扩展名的字体描述文件的名字(<b>不要</b>加上扩展名)。
<code>fontid</code>用来代表这种字体(见<a href="#main.dlabel">dlabel</a>和<a href="#main.slabel">slabel</a>)。
可以定义25个字体。</dd>

  <dt><a name="main.slabel"><b><code>slabel = X, Y, fontid, "text"</code></b></a></dt>
  <dd>在<code>X</code>,<code>Y</code>位置放置一个静态的标签。<code>text</code>将用<code>fontid</code>代表的字体显示。
text只能是无格式文本(<code>$x</code>之类的变量不起作用)而且必须封在一对双引号中(但是<code>"</code>字符不能是text的一部分)。
标签使用由<code>fontid</code>代表的字体显示。</dd>

  <dt><a name="main.dlabel"><b><code>dlabel = X, Y, length, align, fontid, "text"</code></b></a></dt>
  <dd>在<code>X</code>,<code>Y</code>位置放置一个动态的标签。标签被称为动态的,因为它的text周期性地刷新。标签的最大限度长度由
<code>leghth</code>给定(它的高度是字符的高度)。如果将要显示的text比给定的宽度宽,它将滚动显示,否则它将在指定的空间之内按
<code>align</code>参数的值对齐显示:<code>0</code>表示靠右对齐,<code>1</code>表示居中对齐,<code>2</code>表示靠左对齐。<br>
要显示的文本由<code>text</code>给定:text必须封在一对双引号中(但是<code>"</code>字符不能是text的一部分)。标签使用由
<code>fontid</code>代表的字体显示。你能在文本中使用下列变量:

    <table align="center" border="1">
      <tr align=center><th>Variable</th><th align=left>Meaning</th></tr>
      <tr><td align=center><kbd>$1</kbd></td>
        <td><em>hh:mm:ss</em>格式的播放时间</td></tr>
      <tr><td align=center><kbd>$2</kbd></td>
        <td><em>mmmm:ss</em>格式的播放时间</td></tr>
      <tr><td align=center><kbd>$3</kbd></td>
        <td><em>hh</em>(小时)格式的播放时间</td></tr>
      <tr><td align=center><kbd>$4</kbd></td>
        <td><em>mm</em>(分)格式的播放时间</td></tr>
      <tr><td align=center><kbd>$5</kbd></td>
        <td><em>ss</em>(秒)格式的播放时间</td></tr>
      <tr><td align=center><kbd>$6</kbd></td>
        <td><em>hh:mm:ss</em>格式的电影长度</td></tr>
      <tr><td align=center><kbd>$7</kbd></td>
        <td><em>mmmm:ss</em>格式的电影长度</td></tr>
      <tr><td align=center><kbd>$8</kbd></td>
        <td><em>h:mm:ss</em>格式的电影长度</td></tr>
      <tr><td align=center><kbd>$v</kbd></td>
        <td><em>xxx.xx%</em>格式的音量</td></tr>
      <tr><td align=center><kbd>$V</kbd></td>
        <td><em>xxx.x</em>格式的音量</td></tr>
      <tr><td align=center><kbd>$b</kbd></td>
        <td><em>xxx.xx%</em>格式的声道平衡</td></tr>
      <tr><td align=center><kbd>$B</kbd></td>
        <td><em>xxx.x</em>格式的声道平衡</td></tr>
      <tr><td align=center><kbd>$$</kbd></td>
        <td><kbd>$</kbd>字符</td></tr>
      <tr><td align=center><kbd>$a</kbd></td>
        <td>一个代表音频格式的字母(none: <code>n</code>,mono: <code>m</code>,stereo: <code>t</code>)</td></tr>
      <tr><td align=center><kbd>$t</kbd></td>
        <td>track号(在播放列表中)</td></tr>
      <tr><td align=center><kbd>$o</kbd></td>
        <td>文件名</td></tr>
      <tr><td align=center><kbd>$f </kbd></td>
        <td>小写格式文件名</td></tr>
      <tr><td align=center><kbd>$F </kbd></td>
        <td>大写格式文件名</td></tr>
      <tr><td align=center><kbd>$T</kbd></td>
        <td>一个代表媒体流类型的字幕(文件: <code>f</code>,Video CD: <code>v</code>,DVD: <code>d</code>,URL: <code>u</code>)</td></tr>
      <tr><td align=center><kbd>$p</kbd></td>
        <td>"p"字符(如果电影正在播放并且字体中有"p"这个字符)</td></tr>
      <tr><td align=center><kbd>$s </kbd></td>
        <td>"s"字符(如果电影停止播放并且字体中有"s"这个字符)</td></tr>
      <tr><td align=center><kbd>$e</kbd></td>
        <td>"e"字符(如果playback被暂停并且字体中有"e"这个字符)</td></tr>
      <tr><td align=center><kbd>$x</kbd></td>
        <td>电影宽度</td></tr>
      <tr><td align=center><kbd>$y</kbd></td>
        <td>电影高度</td></tr>
      <tr><td align=center><kbd>$C</kbd></td>
        <td>使用的编解码器的名字</td></tr>
    </table>

    <em class="note"><b>注意:</b><kbd>$a</kbd>,<kbd>$T</kbd>,<kbd>$p</kbd>,<kbd>$s</kbd>和<kbd>$e</kbd>变量都返回应该被显示作为特殊的符号
(例如,"e"通常代表像<code>||</code>这样的暂停符号)的字符。你应该有一个正常字符的字体以及另一个用于符号的不同的字体。
更多信息参见<a href="#symbols">符号</a>部分。</em>
  </dd>
</dl>


<h3><a name="subwindow">D.2.2 副窗口</a></h3>

<p>下列的项目能用于'<code>window = sub</code>' .&nbsp;.&nbsp;. '<code>end</code>'块。<p>

<dl>
  <dt><a name="sub.base"> <b><code>base = image, X, Y, width, height</code></b></a></dt>
  <dd>在副窗口中将要显示的图像。窗口将在屏幕给定的<code>X</code>,<code>Y</code>位置出现(<code>0,0</code>是左上角)。
你能用<code>-1</code>指定中心<code>-2</code>指定右边(<code>X</code>)和底部(<code>Y</code>)。窗口将和图像一样大。
<code>width</code>和<code>height</code>指定窗口的大小; 他们是可选的(如果没有他们,窗口是与图像同样的大小)。</dd>

  <dt><a name="sub.background"><b><code>background = R, G, B</code></b></a></dt>
  <dd>让你设置背景颜色。它在图像小于窗口时有用。
<code>R</code>,<code>G</code>和<code>B</code>规定颜色的的红,绿和蓝色的组成部分(它们中每一个都是从0到255的十进制数字)。</dd>
</dl>


<h3><a name="skinmenu">D.2.3 Skin菜单</a></h3>

<p>如前所述,菜单用两个图像显示。
正常的菜单条目从<code>base</code>项指定的图像中获得,当前选择的条目则从<code>selected</code>项指定的图像中获得。
你必须通过<code>menu</code>项定义每个菜单条目的位置和大小。</p>

<p>这些是能用于'<code>window = menu</code>'.&nbsp;.&nbsp;. '<code>end</code>'之间的项目。</p>

<dl>
  <dt><a name="menu.base"><b><code>base = image</code></b></a></dt>
  <dd>正常的菜单条目的图像。</dd>

  <dt><a name="menu.selected"><b><code>selected = image</code></b></a></dt>
  <dd>所有条目都被选择的菜单的图像。</dd>

  <dt><a name="menu.menu"><b><code>menu = X, Y, width, height, essage</code></b></a></dt>
  <dd>定义图像中一个菜单条目的<code>X,Y</code>位置和大小。当鼠标在该条目上被释放时产生<code>message</code>消息。</dd>
</dl>


<h2><a name="fonts">D.3 字体</a></h2>

<p>就象在关于skin的各部分的一节中论及的,字体由一个图像和一个描述文件定义。你能将字符放置在图像中的任何地方,
但是必须确保他们的位置和大小被精确的提交给描述文件。</p>

<p>字体描述文件随着(以<code>.fnt</code>为扩展名)能有以'<code>;</code>'开始的注释行。文件必须有像这样的行</p>

<dl>
  <dt><a name="font.image"><b><code>image = image</code></b></a></dt>
  <dd>其中<code>image</code>是用于字体的图像文件的名字(你不必制定扩展名)。</dd>

  <dt><a name="font.char"><b><code>"char" = X, Y, width, height</code></b></a></dt>
  <dd>这里<code>X</code>和<code>Y</code>指定<code>char</code>字符在图像中的位置(<code>0,0</code>表示左上
角)。<code>width</code>和<code>height</code>是字符的尺寸,以象素为单位。</dd>
</dl>

<p>这个例子中用<code>font.png</code>定义A,B,C三个字符。</p>
<table width="100%" border=1>
  <tr bgcolor=silver>
    <td>
<pre>
; Can be "font" instead of "font.png".
image = font.png

; Three characters are enough for demonstration purposes :-)
"A" =  0,0, 7,13
"B" =  7,0, 7,13
"C" = 14,0, 7,13
</pre>
    </td>
  </tr>
</table>


<h3><a name="symbols">D.3.1 符号</a></h3>

<p><a href="#main.dlabel">dlabel</a>中使用的一些变量返回的一些字符有特殊的意义。这些字符应该被显示为符号,
使得播放DVD时显示一个漂亮的DVD logo而不是字符‘d’。</p>

<p>下列的表格列出所有能被用来显示符号的字符(所以要求另一种字体)。</p>

<table align="center" border="1">
  <tr><th align=center>字符</th><th align=left>符号</th></tr>
  <tr><td align=center><kbd>p</kbd></td>
    <td align=left>播放</td></tr>
  <tr><td align=center><kbd>s</kbd></td>
    <td align=left>停止</td></tr>
  <tr><td align=center><kbd>e</kbd></td>
    <td align=left>暂停</td></tr>
  <tr><td align=center><kbd>n</kbd></td>
    <td align=left>无声</td></tr>
  <tr><td align=center><kbd>m</kbd></td>
    <td align=left>单声道</td></tr>
  <tr><td align=center><kbd>t</kbd></td>
    <td align=left>立体声</td></tr>
  <tr><td align=center><kbd>f</kbd></td>
    <td align=left>媒体流是文件</td></tr>
  <tr><td align=center><kbd>v</kbd></td>
    <td align=left>媒体流是Video CD</td></tr>
  <tr><td align=center><kbd>d</kbd></td>
    <td align=left>媒体流是DVD</td></tr>
  <tr><td align=center><kbd>u</kbd></td>
    <td align=left>媒体流是URL</td></tr>
</table>


<h2><a name="guimsg">D.4: GUI信息</a></h2>

<p>这些是能被按钮,滑动条和菜单项产生的消息。</p>

<p><em class=note><b>注意:</b>一些信息可能不像所预想的那样工作(或者根本不工作)。你也知道,GUI还在开发中。</em></p>


<h3>Playback控制:</h3>
<blockquote>
  <dl>
    <dt><b>evNext</b></dt>
    <dd>跳到播放列表中下一个track。</dd>

    <dt><b>evPause</b></dt>
    <dd>暂停播放。</dd>

    <dt><b>evPauseSwitchToPlay</b></dt>
    <dd>与<code>evPlaySwitchToPause</code>一起形成开关。他们能用来实现普通的播放/暂停按钮。两条信息应该被分配到
窗口中同一位置的两个按钮上。这条信息暂停播放并使<code>evPlaySwitchToPause</code>按钮的图像显示出来(表明点击按钮能继续播放)。</dd>

    <dt><b>evPlay</b></dt>
    <dd>开始播放。</dd>

    <dt><b>evPlaySwitchToPause</b></dt>
    <dd>与<code>evPauseSwitchToPlay</code>对应的消息。这条信息开始播放并使<code>evPauseSwitchToPlay</code>
按钮的图像显示出来(表明点击按钮能暂停播放)。</dd>

    <dt><b>evPrev</b></dt>
    <dd>跳到播放列表中上一个track。</dd>

    <dt><b>evStop</b></dt>
    <dd>停止播放。</dd>
  </dl>
</blockquote>


<h3>搜索:</h3>
<blockquote>
  <dl>
    <dt><b>evBackward10sec </b></dt>
    <dt><b>evBackward1min </b></dt>
    <dt><b>evBackward10min </b></dt>
    <dd>向后搜索10秒/1分钟/10分钟。</dd>

    <dt><b>evForward10sec</b></dt>
    <dt><b>evForward1min</b></dt>
    <dt><b>evForward10min</b></dt>
    <dd>向前搜索10秒/1分钟/10分钟。</dd>

    <dt><b>evSetMoviePosition </b></dt>
    <dd>搜索到制定位置(能被滑动条使用;使用与滑动条相关的值( 0-100% ))。</dd>
  </dl>
</blockquote>


<h3>视频控制:</h3>
<blockquote>
  <dl>
    <dt><b>evDoubleSize化</b></dt>
    <dd>把电影窗口置为双倍大小。</dd>

    <dt><b>evFullScreen </b></dt>
    <dd>切换全屏方式。</dd>

    <dt><b>evNormalSize化</b></dt>
    <dd>把电影窗口置为正常大小。</dd>
  </dl>
</blockquote>


<h3>音频控制:</h3>
<blockquote>
  <dl>
    <dt><b>evDecAudioBufDelay</b></dt>
    <dd>减少音频缓冲延迟。</dd>

    <dt><b>evDecBalance</b></dt>
    <dd>减少声道平衡。</dd>

    <dt><b>evDecVolume</b></dt>
    <dd>减少音量。</dd>

    <dt><b>evIncAudioBufDelay</b></dt>
    <dd>增加音频缓冲延迟。</dd>

    <dt><b>evIncBalance</b></dt>
    <dd>增加声道平衡。</dd>

    <dt><b>evIncVolume</b></dt>
    <dd>增加音量。</dd>

    <dt><b>evMute</b></dt>
    <dd>禁音/取消禁音。</dd>

    <dt><b>evSetBalance</b></dt>
    <dd>设置声道平衡(能被滑动条使用;使用与滑动条相关的值( 0-100% ))。</dd>

    <dt><b>evSetVolume</b></dt>
    <dd>设置音量(能被滑动条使用;使用与滑动条相关的值( 0-100% ))。</dd>
  </dl>
</blockquote>


<h3>其他:</h3>
<blockquote>
  <dl>
    <dt><b>evAbout</b></dt>
    <dd>打开关于窗口。</dt>

    <dt><b>evEqualizer</b></dt>
    <dd>打开/关闭均衡器。</dd>

    <dt><b>evExit</b></dt>
    <dd>退出程序。</dd>

    <dt><b>evIconify</b></dt>
    <dd>窗口图标化。</dd>

    <dt><b>evLoad</b></dt>
    <dd>装载文件(打开一个文件浏览窗口,你能在其中选择文件)。</dd>

    <dt><b>evLoadPlay</b></dt>
    <dd>功能与<code>evLoad</code>一样,但是它在文件之后装载自动地开始播放。</dd>

    <dt><b>evNone</b></dt>
    <dd>空信息,它没有效果(也许CVS版本除外:-))。</dd>

    <dt><b>evPlayList</b></dt>
    <dd>打开/关闭播放列表窗口。</dd>

    <dt><b>evPlayDVD</b></dt>
    <dd>尝试打开指定的DVD-ROM驱动器中的碟片。</dd>

    <dt><b>evPlayVCD</b></dt>
    <dd>尝试打开指定的CD-ROM驱动器中的碟片。</dd>

    <dt><b>evPreferences</b></dt>
    <dd>打开选项设置窗口。</dd>

    <dt><b>evSetAspect</b></dt>
    <dd>设置显示图像的屏幕高宽比。</dd>

    <dt><b>evSetURL</b></dt>
    <dd>显示URL对话窗口。</dd>


    <dt><b>evSkinBrowser</b></dt>
    <dd>打开skin浏览器窗口。</dd>
  </dl>
</blockquote>

</body>
</html>