2004年09月18日

 

在C#中用DirectShow做的媒体播放机

概述:
我的这个程序仅仅只是告诉大家如何用DirectShow 在C#中做一个播放机,世上并不能
有太多的功能.也许你只要花上五分种就可以解决问题.是的如果你用的是IDE,我感保证
一切都只是用你的鼠标在你的设计器中点点属性设置一些东西就可以简单的完成了.当然
了还是要那么一点点编码的.至少是关于DirectShow 接口的.例如,视屏和声音.

程序中的小问题:
1.如何从你的磁盘上打开媒体文件
2.如何让工具条上的按钮起用和禁用
3.如何设置状态栏的显示文字
4.如何控制时间
5.如何使用时间控件的事件
6.如何用DirectShow来播放媒体文件
7.如何确定播放状态等等…

用户界面如下图:
很简单是吗?是的,我说了是个简单的程序,我只是让它具备了基本功能而已.工具栏上
的三个button控制播放,停止和暂停.一个文件菜单用来打开媒体文件和关闭程序.当然
还有一个介绍程序的Info毫无疑问这是最基本的界面配置.

下面介绍DirectShow 接口

播放视屏和声音文件我们要用到DiectX为我们提供的DirectShow组件.使用这个接口
可以让你方便的播放那些共用的影像和声音文件.你要做的仅仅只是安装DirectShow接口
和使用它的功能函数和配置正确的接口参数而已.

不幸的是.NET并不正式支持DirectX.是的也许你听说DirectX9支持是吗?是的,不过在
最终版敲定的那一天还没来,我们都得不到最好的效果.但无论如何我们还是要用的不是吗?
要不这篇文章得作废了.是的,也许你用过VB,对了,就是它,我们正是要用到那个.

好了,在此之前我们还必须要做件事情.我想你已经猜到了,引用对吗?还记得XCopy吗?是的
.NET的优势.来吧,快点把这个”Interop.QuartzTypeLib.dll”DLL引用进来,就象这样
看见下面的图示了吗?很简单.

最后别忘了看看你的代码中是否有那么一句
using QuartzTypeLib;
有是吗?编译器为你加的,如果没有自己加上好了.

准备工作结束了,该是代码部分了,这可是程序员无法推卸的责任.否则我们都得下岗了.

程序实现部分:

如何打开你想要媒体文件?

还记得吗?”File -> Open…” 是的几乎每个使用windows的人都会这样操作.如何实现?
很简单看看下面的代码:

OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Filter = “Media Files|*.mpg;*.avi;*.wma;*.mov;*.wav;*.mp2;*.mp3|All Files|*.*”;

if (DialogResult.OK == openFileDialog.ShowDialog())
{
    .
    .
    .
看吧很简单是吗?记得写一个函数把它放进去.当你点击OK按钮的时候.DirectShow接口就会
得到你想要播放的文件.
看下面的图你就知道它是如何工作的.

DirectShow为多媒体流回放提供最基本的服务,这些多媒体流可以是本地文件,还可以是服务器传输过来的。特别的,DirectShow可以支持视频回放,支持以不同的文件和流格式压缩视频内容,包括Windows Media、MPEG、AVI和WAV。

在DirectShow的核心处,服务是组件的模块化集合,称为过滤器,可以根据媒体类型排列成过滤器图。过滤器可以操作数据流,如读入、分析、解码、格式化或渲染。

过滤器以树型进行排列,这棵树称为过滤器树,通过过滤器树管理器(Filter Graph Manager,简称FGM)进行管理。使用FGM应用程序可以通过使用Microsoft Windows Media Player控件间接控制过滤器树,还可以通过调用COM接口方法直接控制。DirectShow过滤器树(参阅图1)由从源到目标渲染器的有向过滤器序列组成,所有这些通过输入和输出过滤器引脚连接。过滤器引脚协商它们将支持哪些媒体类型。FGM控制树过滤器之间的多媒体数据流。因为DirectShow有一个灵活的、可重配置的过滤器树体系结构,因此DirectShow可以使用同样的软件成分支持多种媒体类型的回放和分流。开发人员还可以通过编写自己的过滤器扩展DirectShow多媒体支持。

图1. DirectShow过滤器树

过滤器
过滤器是注册的DirectShow类,它执行许多媒体信息处理任务。这些任务包括:

获得源信息(例如,获得媒体流)
分析(例如,在流上执行包读入、分离和格式化)
转换(例如,解码WMA和MPEG-4音频和视频流)
渲染(例如,在适当的时候产生音频PCM或者视频RGB/YUV输出,将数据传给DirectSound和DirectDraw)
过滤器使用几种类型的接口,例如引脚、计数器、传送器和时钟接口,来执行它们的任务。过滤器实现和开放了许多接口。FGM可以使用这些接口创建、连接和控制树。过滤器经常实现包含下列方法的IBaseFilter接口:

运行、停止和暂停过滤器状态。
恢复过滤器和厂商信息。
得到和设置参考时钟。
恢复过滤器状态信息。
枚举过滤器引线。
重建过滤器树时定位引脚

好了介绍了这么多,你的手也许已经闲不住了.看看下面的代码是如何实现的

CleanUp();

m_objFilterGraph = new FilgraphManager();
m_objFilterGraph.RenderFile(openFileDialog.FileName);

m_objBasicAudio = m_objFilterGraph as IBasicAudio;

try
{
 m_objVideoWindow = m_objFilterGraph as IVideoWindow;
 m_objVideoWindow.Owner = (int) panel1.Handle;
 m_objVideoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
 m_objVideoWindow.SetWindowPosition(panel1.ClientRectangle.Left,
  panel1.ClientRectangle.Top,
  panel1.ClientRectangle.Width,
  panel1.ClientRectangle.Height);
}
catch (Exception ex)
{
 m_objVideoWindow = null;
}

m_objMediaEvent = m_objFilterGraph as IMediaEvent;

m_objMediaEventEx = m_objFilterGraph as IMediaEventEx;
m_objMediaEventEx.SetNotifyWindow((int) this.Handle, WM_GRAPHNOTIFY, 0);

m_objMediaPosition = m_objFilterGraph as IMediaPosition;

m_objMediaControl = m_objFilterGraph as IMediaControl;

//

如何来播放,暂停,停止?
简单这些函数看字面也知道.

m_objMediaControl.Run();//播放

m_objMediaControl.Pause();//暂停

m_objMediaControl.Stop();//停止

 

OK,在来看我们是如何控制时间进度的?
//
private void timer1_Tick(object sender, System.EventArgs e)
{
    if (m_CurrentStatus == MediaStatus.Running)
    {
        UpdateStatusBar();
    }
}

看见上面那个 UpdateStatusBar();这里是让它没100ms更新一次状态栏.
代码如下:
private void UpdateStatusBar()
{
    switch (m_CurrentStatus)
    {
        case MediaStatus.None   : statusBarPanel1.Text = “Stopped”; break;
        case MediaStatus.Paused : statusBarPanel1.Text = “Paused “; break;
        case MediaStatus.Running: statusBarPanel1.Text = “Running”; break;
        case MediaStatus.Stopped: statusBarPanel1.Text = “Stopped”; break;
    }

    if (m_objMediaPosition != null)
    {
        int s = (int) m_objMediaPosition.Duration;
        int h = s / 3600;
        int m = (s  – (h * 3600)) / 60;
        s = s – (h * 3600 + m * 60);

        statusBarPanel2.Text = String.Format(“{0:D2}:{1:D2}:{2:D2}”, h, m, s);

        s = (int) m_objMediaPosition.CurrentPosition;
        h = s / 3600;
        m = (s  – (h * 3600)) / 60;
        s = s – (h * 3600 + m * 60);

        statusBarPanel3.Text = String.Format(“{0:D2}:{1:D2}:{2:D2}”, h, m, s);
    }
    else
    {
        statusBarPanel2.Text = “00:00:00″;
        statusBarPanel3.Text = “00:00:00″;
    }
}

还有一个问题程序怎么能够知道它播放完了????
这会有点麻烦了.好了,想想看有什么办法呢?对了,windows是消息驱动的.那找找看有什么消息
好了.有的就EC_COMPLETE 这个.还记得”WndProc” 它吗??是的,我的老朋友.这次我们必须
要改写它来捕获EC_COMPLETE消息.这个消息是DirectShow通知父窗体,播放结束了.

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_GRAPHNOTIFY)
    {
        int lEventCode;
        int lParam1, lParam2;

        while (true)
        {
            try
            {
                m_objMediaEventEx.GetEvent(out lEventCode,
                    out lParam1,
                    out lParam2,
                    0);

                m_objMediaEventEx.FreeEventParams(lEventCode, lParam1, lParam2);

                if (lEventCode == EC_COMPLETE)
                {
                    m_objMediaControl.Stop();
                    m_objMediaPosition.CurrentPosition = 0;
                    m_CurrentStatus = MediaStatus.Stopped;
                    UpdateStatusBar();
                    UpdateToolBar();
                }
            }
            catch (Exception)
            {
                break;
            }
        }
    }

    base.WndProc(ref m);
}
好了,一切都结束了,现在要做的事就是做些来找一部影片来享受一下自己的成果了.

2004年09月07日

‘        VB关机心得笔记


‘原创:     小许; qq:19030300 主页:http://hot1kang1.126.com
‘    原代码来源网络
‘——————————————————————————————————

‘Windows 95 重新开机十分简单,只要呼叫 ExitWindowsEx API 函数就可以了

‘Private Declare Function ExitWindowsEx Lib “user32″ (ByVal uFlags As Long, _
‘                 ByVal dwReserved As Long) As Long

‘ Private Enum HowExitConst
‘               EWX_LOGOFF = 0 ‘ 注销
‘               EWX_REBOOT = 2 ‘ 重开机
‘               EWX_SHUTDOWN = 1 ‘ 关机
‘               EWX_FORCE = 4 ‘ 强制结束进程关机
‘ End Enum
‘用
‘Call ExitWindowsEx(how, 0)
‘     ‘ how 等於 EWX_LOGOFF 、 EWX_REBOOT 、EWX_SHUTDOWN 、 或EWX_FORCE
‘——————————————————————————————————
‘在2000下以上的函数就只能注销机器~~

‘因为 NT 关机或重新开机, 原因是 NT 比较着重安全性(Security),
‘而为了让 NT 关机或重新开机, 则必须在呼叫 ExitWindowsEx 之前, 呼叫
‘AdjustToken 副程式就对了?

‘以下是小菜收集的可以关闭2000的具体原码!
‘希望能给VB新手带来一点帮助!
‘——————————————————————————————————

   Private Declare Function ExitWindowsEx Lib “user32″ (ByVal uFlags As Long, _
                 ByVal dwReserved As Long) As Long
  Enum HowExitConst
               EWX_FORCE = 4 ‘ 强制关机
               EWX_LOGOFF = 0 ‘ 注销
               EWX_REBOOT = 2 ‘ 重开机
               EWX_SHUTDOWN = 1 ‘ 可关机98 在2000下关机最后出现 现在可以安全关机问题
               EWX_POWEROFF = 8 ‘是用来关闭Windows NT/2000/XP:计算机的:
‘EWX_POWEROFF:
‘Shuts down the system and turns off the power. The system must support the power-off feature.
‘Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.

  End Enum
  Const TOKEN_ADJUST_PRIVILEGES = &H20
  Const TOKEN_QUERY = &H8
  Const SE_PRIVILEGE_ENABLED = &H2
  Const ANYSIZE_ARRAY = 1
  Private Type LUID
               lowpart As Long
               highpart As Long
  End Type

 Private Type LUID_AND_ATTRIBUTES
        pLuid As LUID
        Attributes As Long
 End Type

 Private Type TOKEN_PRIVILEGES
              PrivilegeCount As Long
              Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
 End Type

 Private Declare Function GetCurrentProcess Lib “kernel32″ () As Long
 Private Declare Function LookupPrivilegeValue Lib “advapi32.dll” Alias _
         “LookupPrivilegeValueA” (ByVal lpSystemName As String, _
         ByVal lpName As String, lpLuid As LUID) As Long
 Private Declare Function AdjustTokenPrivileges Lib “advapi32.dll” _
         (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, _
         NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
         PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
 Private Declare Function OpenProcessToken Lib “advapi32.dll” _
         (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
          TokenHandle As Long) As Long
Private Sub AdjustToken()
 Dim hdlProcessHandle As Long
 Dim hdlTokenHandle As Long
 Dim tmpLuid As LUID
 Dim tkp As TOKEN_PRIVILEGES
 Dim tkpNewButIgnored As TOKEN_PRIVILEGES
 Dim lBufferNeeded As Long
 hdlProcessHandle = GetCurrentProcess()
 OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), _
        hdlTokenHandle
 ’Get the LUID for shutdown privilege.
 LookupPrivilegeValue “”, “SeShutdownPrivilege”, tmpLuid
 tkp.PrivilegeCount = 1 ‘ One privilege to set
 tkp.Privileges(0).pLuid = tmpLuid
 tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
 ’Enable the shutdown privilege in the access token of this process.
 AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), _
                       tkpNewButIgnored, lBufferNeeded
End Sub

Private Sub command1_Click()
If MsgBox(“确定要注销吗?”, 32 + vbOKCancel, “提醒!”) = vbOK Then

AdjustToken
 Call ExitWindowsEx(EWX_LOGOFF, 0)
End If
End Sub

Private Sub command2_Click()
If MsgBox(“确定要关机吗?”, 32 + vbOKCancel, “提醒!”) = vbOK Then

 AdjustToken
  Call ExitWindowsEx(EWX_POWEROFF, 0) ‘只能注销98可正常关闭2000
 Call ExitWindowsEx(EWX_SHUTDOWN, 0) ‘在2000下该关机有问题!出现现在可以正常关机的提示
End If
End Sub

Private Sub command3_Click()
If MsgBox(“确定要重启吗?”, 32 + vbOKCancel, “提醒!”) = vbOK Then
AdjustToken
 Call ExitWindowsEx(EWX_REBOOT, 0)
End If
End Sub

2004年08月23日

    虽然这段时间天天在上海写成学,可是总要为自己的大三生活做点打算。想来想去,也没有想好自己的大三生活应该怎么过。
    这几天突然对手机游戏发生的很大的兴趣,打算开学后研究一下Java.好好的学学J2ME,写个游戏出来玩玩。要是做出来的话,也算给是给朋友们一个小礼物。

2004年08月16日

1、定位你的网站主题和名称
2、定位你的网站CI形象
3、确定网站的栏目和版块
4、确定网站的目录结构和链接结构
5、确定网站的整体风格和创意设计
6、首页的设计
7、版面布局的原理
8、网页色彩搭配的原理
9、字体的设定
10、网页中表格的运用

  很荣幸,能在这里和大家一起探讨关于网站设计的问题。目前,网络上有关网页制作的各种教程已经相当多,可以方便地学习到最新的技术和技巧。可是,有关网页的设计,比如设计灵感的实现,风格的确定,发展策略,技术的筛选等的文章却比较少,许多网友往往有好的材料,却苦恼没有好的具有表现力的设计。受到索易主持人的鼓励,阿捷整理了一些网页的设计心得,在这里和大家交流一下,也算抛砖引玉了,希望得到您的指正,如果您有好的建议和心得,也请发稿给我ajie@soim.com,在此先道一声谢谢!

  网站设计,包含的内容非常多。大体分两个方面:

  一方面是纯网站本身的设计比如文字排版,图片制作,平面设计,三维立体设计,静态无声图文,动态有声影像等;

  另一方面是网站的延伸设计,包括网站的主题定位和浏览群的定位,智能交互,制作策划,形象包装,宣传营销等等。

  这两方面相辅相成(感觉有点象写辨证论文:),加之网络技术的飞速发展,要提出一个绝对正确和权威的设计思路是不可能的,要想在一篇文章中概括出来也很难,所以阿捷根据建设一个网站的思路,将自己几年来网站设计制作的心得整理成一个系列“讲座”,告诉给大家(注意:我并不会非常具体地讲某一个技术或制作技巧,重点在于思路)希望能给您一些帮助。下面是大致的提纲

  1.定位你的网站主题和名称;
   2.定位你的网站CI形象;
   3.确定你的栏目和版块;
   4.网站的整体风格创意设计
   5.网站的层次结构和链接结构
   6.首页的设计
   7.版面布局的窍门
   8.色彩的搭配
   9.效果与速度
   10.替浏览者考虑
   11.细微之处见功力
   12.建设完成度与推出时间
   13.交互性与亲和度
   14.考虑不同的浏览器和分辨率
   15.字体的设置和表格的嵌套
   16.新技术的运用取舍
   17.设计好你的banner和位置
   18.语句文字–融入感情
   19.对网站设计初学者的建议

  以上是本“系列”文章的提纲,会根据实际撰写情况作些变动。每星期一篇。我们开始之前,首先明确几个前提:

  一.网站设计与网站制作。我们说网站“设计”而不是网站“制作”,它们的区别在于设计是一个思考的过程,而制作只是将思考的结果表现出来。一个成功的网站首先需要一个优秀的设计,然后辅之优秀的制作。设计是网站的核心和灵魂,一个相同的设计可以有多种制作表现的方式。

  二.我们说的“网站”是指有确定主题和明确目的的实用性站点,不包括纯表现类或者纯文字类网站。

  三.在文章中,可能举例说明或点评到某些具体站点。首先申明,阿捷不存在为任何站点作广告的“嫌疑“。

  好了,废话少说,我们进入正题:

定位你的网站主题和名称

  设计一个站点,首先遇到的问题就是定位网站主题。

  所谓主题也就是你的网站的题材。网络上的网站题材千奇百怪,琳琅满目。只要你想的到,就可以把它制作出来。下面是美国《个人电脑》杂志(PC Magazine)评出的99年度排名前100位的全美知名网站的十类题材,对我们有一些参考价值。

  第1类:网上求职
   第2类:网上聊天/即时信息/ ICQ
   第3类:网上社区/讨论 / 邮件列表
   第4类:计算机技术
   第5类:网页/ 网站开发
   第6类:娱乐网站
   第7类:旅行
   第8类:参考 /资讯
   第9类:家庭/教育
   第10类:生活/时尚

  每个大类都可以继续细分,比如娱乐类再分为体育 /电影/ 音乐大类,音乐又可以按格式分为MP3,VQF,Ra,按表现形式分古典,现代,摇滚等。以上都只是最常见的题材,还有许多专业的,另类的,独特的题材可以选择,比如中医,热带鱼,天气预报等等,同时,各个题材相联系和交叉结合可以产生新得题材,例如旅游论坛(旅游+讨论),经典入球播放(足球+影视)按这样分下去,题材可以有成千上万个,你不会再为题材重复,难以选择而烦恼了吧:)

  对于题材的选择,我的建议是:

  1.主题要小而精。定位要小,内容要精。如果你想制作一个包罗万象的站点,把所有您认为精彩的东西都放在上面,那么往往会事与愿违,给人的感觉是没有主题,没有特色,样样有却样样都很肤浅,因为您不可能有那么多的精力去维护它。网络的最大特点就是新和快,目前最热门的个人主页都是天天更新甚至几小时更新一次。最新的调查结果也显示,网络上的“主题站”比“万全站”更受人们喜爱,就好比专卖店和百货商店,如果我需要买某方面的东西,肯定会选择专买店。再举个例子,我的一位网友KK希望制作文学方面的题材,但是文学也包括许多许多内容,有小说,诗歌,散文;有科幻,武侠,推理;阿捷仔细了解了他的擅长和想要提供的主要内容,最后将题材定位在网络文学上,删除了原有的一些无关的文学作品,集中扩大和整理网络文学作品。网站推出后,很快受到大家的喜爱。

  2.题材最好是你自己擅长或者喜爱的内容。比如:您对擅长编程,就可以建立一个编程爱好者网站;对足球感兴趣,可以报道最新的战况,球星动态等。这样在制作时,才不会觉得无聊或者力不从心。兴趣是制作网站的动力,没有热情,很难设计制作出杰出的作品。

  3.题材不要太滥或者目标太高。“太滥”是指到处可见,人人都有的题材;比如软件下载,免费信息。“目标太高”是指在这一题材上已经有非常优秀,知名度很高的站点,你要超过它是很困难的。除非你下决心和有实力竞争并超过它,记住,在互联网上只有第一,人们往往只记得最好的网站,第二第三名的印象则会浅得多。

  OK,如果你已经有一个绝妙的主意了,那我们开始为网站起名字。(哎呀,别踢我!)您可能认为起名字与网站设计无关,阿捷在这里浪费时间。其实网站名称也是网站设计的一部分,而且是很关键的一个要素。你来看,“电脑学习室”和“电脑之家”显然是后者简练;“迷笛乐园”和“MIDI乐园”显然是后者明晰;“儿童天地”和“中国幼儿园”显然是后者大气。我们都知道PIIICUP的中文名称“奔腾”,如果改为“奔跑”,可能就没有今天这么“火”了:)。和现实生活中一样,网站名称是否正气,响亮,易记,对网站的形象和宣传推广也有很大影响。一般的建议是:

  1. 名称要正。这个“正”是阿捷自己的说法,其实就是要合法,和理,和情。不能用反动的,色情的,迷信的,危害社会安全的名词语句。

  2. 名称要易记。根据中文网站浏览者的特点,除非特定需要,网站名称最好用中文名称,不要使用英文或者中英文混合型名称。例如:beyond studio和超越工作室,后者更亲切好记。另外,网站名称的字数应该控制在六个字(最好四个字)以内,比如“XX阁”“XX设计室”,四个字的可以用成语,如“一网打进”。字数少还有个好处,一般友情链接的小logo尺寸是88X31,而六个字的宽度是78左右,适合于其他站点的链接排版。

  3. 名称要有特色。名称平实就可以接受,如果能体现一定的内涵,给浏览者更多的视觉冲击和空间想象力,则为上品。这里举几个阿捷认为很好的名称:音乐前卫,网页陶吧,天籁绝音。在体现出网站主题的同时,能点出特色之处。

  总之,定位题材和名称是设计一个网站的第一步,也是很重要的一部分。如果能找到一个满意的名称,花一天时间翻字典也是值得的:)

定位你的网站CI形象

  所谓CI,是借用的广告术语。(CI是英文corporate identity的缩写),意思是通过视觉来统一企业的形象。现实生活中的CI策划比比皆是,杰出的例子如:可口可乐公 司,全球统一的标志,色彩和产品包装,给我们的印象极为深刻。更多的例子如SONY,三菱,麦当劳等等。

  一个杰出的网站,和实体公司一样,也需要整体的形象包装和设计。准确的,有创意的CI 设计,对网站的宣传推广有事半功倍的效果。在您的网站主题和名称定下来之后,需要思考的就是网站的CI形象。

  有网友要问了:我不是学广告专业的,CI对我来说可能太难了吧:( 不用担心,阿捷自己也没有学过设计专业哦。大家只要参考我的一些具体做法和经验,很容易将自己网站的CI搞定:)

  1.设计网站的标志(logo).首先你需要设计制作一个网站的标志(logo)。就如同商标一样,logo是你站点特色和内涵的集中体现,看见logo就让大家联想起你的站点。注意:这里的logo不是指88X31的小图标banner,而是网站的标志。

  标志可以是中文,英文字母,可以是符号,图案,可以是动物或者人物等等。比如:soim是用soim的英文作为标志,新浪用字母sina+眼睛作为标志。标志的设计创意来自你网站的名称和内容。

  (1).网站有代表性的人物,动物,花草,可以用它们作为设计的蓝本,加以卡通化和艺术化,例如迪斯尼的米老鼠,搜狐的卡通狐狸,鲨威体坛的篮球鲨鱼。

  (2).网站有专业性的,可以以本专业有代表的物品作为标志。比如中国银行的铜板标志,奔驰汽车的方向盘标志。

  (3).最常用和最简单的方式是用自己网站的英文名称作标志。采用不同的字体, 字母的变形,字母的组合可以很容易制作好自己的标志。

  2.设计网站的标准色彩。网站给人的第一印象来自视觉冲击,确定网站的标准色彩是相当重要的一步。不同的色彩搭配产生不同的效果,并可能影响到访问者的情绪。

  “标准色彩”是指能体现网站型象和延伸内涵的色彩。举个实际的例子就明白了:IBM的深蓝色,肯得基的红色条型,windows视窗标志上的红蓝黄绿色块,都使我们觉得很贴切,很和谐。如果将IBM改用绿色或金黄色,我们会有什么感觉?

  一般来说,一个网站的标准色彩不超过3种,太多则让人眼花缭乱。标准色彩要用于网站的标志,标题,主菜单和主色块。给人以整体统一的感觉。至于其它色彩也可以使用,只是作为点缀和衬托,绝不能喧宾夺主。

  一般来说,适合于网页标准色的颜色有:蓝色,黄/橙色,黑/灰/白色三大系列色。(注:关于色彩搭配的具体方法,我们会在本系列文章的第八篇介绍)。

  3.设计网站的标准字体。和标准色彩一样,标准字体是指用于标志,标题,主菜单的特有字体。一般我们网页默认的字体是宋体。为了体现站点的“与众不同”和特有风格,我们可以根据需要选择一些特别字体。例如,为了体现专业可以使用粗仿宋体,体现设计精美可以用广告体,体现亲切随意可以用手写体等等。当然这些都是阿捷的个人看法,你可以根据自己网站所表达的内涵,选择更贴切的字体。目前常见的中文字体有二三十种,常见的英文字体有近百种,网络上还有许多专用英文艺术字体下载,要寻找一款满意的字体并不算困难:)

  需要说明的是:使用非默认字体只能用图片的形式,因为很可能浏览者的PC里没有安装你的特别字体,那么您的辛苦设计制作便付之东流啦!

  4.设计网站的宣传标语。也可以说是网站的精神,网站的目标。用一句话甚至一个词来高度概括。类似实际生活中的广告金句。例如:鹊巢的“味道好极了”;麦斯威尔的“好东西和好朋友一起分享”;Intel的“给你一个奔腾的心”。

  以上四方面:标志,色彩,字体,标语,是一个网站树立CI形象的关键,确切的说是网站的表面文章,设计并完成这几步,你的网站将脱胎换骨,整体形象有一个提高。形象地说:你从一个土气的农民转变为一位西装革履的白领人士。(注意:我们只是以平面静态来设计CI,还没有引入声音,三维立体等因素。)

  好了,看了以上的介绍,你应该对网站CI有了一个初步的概念。也许不是很明白,因为那些道理太抽象了,你可能需要一些实际的,更生动的例子。阿捷会在自己的主页上同时修改补充一些实例。下一节,我们来讨论“确定网站的栏目版块”,欢迎您参与,谢谢!

确定网站的栏目和版块

  《设计的思考》系列文章,今天开始写第三篇。阿捷不是专业的网页设计师,但阿捷将尽自己所能把这个系列文章写好,尽可能将自己实践过程中总结的经验和心得告诉给大家,希望能给您一点收获,一点启发。文章中所列观点如有不同意见,欢迎您来信讨论,来信寄ajie@soim.com,谢谢。

  我们在前二篇文章里学习了定位网站主题和确立网站的CI形象。下面是否该进入实质性的设计制作阶段呢?答案是:不能。经验告诉我们,建立一个网站好比写一篇文章,首先要拟好提纲,文章才能主题明确,层次清晰;也好比造一座高楼,首先要设计好框架图纸,才能使楼房结构合理。

  初学者(包括我自己:-),最容易犯的错误就是:确定题材后立刻开始制作。当你一页一页制作完毕后才发现:网站结构不清晰,目录庞杂,内容东一块西一块。结果不但浏览者看得糊涂,自己扩充和维护网站也相当困难,您的网站或许就此半途而废,更糟糕的是:你因此失去了制作主页的信心和兴趣!

  所以,我们在动手制作网页前,一定要考虑好以下三方面:

  1.确定栏目和版块;
   2.确定网站的目录结构和链接结构
   3.确定网站的整体风格创意设计

  今天我们首先来讨论“确定网站的栏目和版块”。

  网站的题材确定后,相信你已经收集和组织了许多相关的资料内容。你一定认为这些都是最好的,肯定能吸引网友们来浏览网站。但是你有没有将最好的,最吸引人的内容放在最突出的位置呢?有没有让好东西在版面分布上占绝对优势呢?

  我看见许多个人主页的栏目(主菜单)并不是这样的。举个例子:有一个以提供动画素材为主题的站点,它的主栏目是:关于站长,本站导航,动画宝库,本站论坛,本站留言本,联系站长。首页上写着本站网址和版权申明(居然还有将本站设为首页字样)。最主要的,最吸引人的动画素材在主栏目里占1/6,在首页上一字没提。我想即使这个站点的确有大量的,精美的动画素材,也很难吸引浏览者继续挖掘。

  栏目的实质是一个网站的大纲索引,索引应该将网站的主体明确显示出来。在制定栏目的时候,要仔细考虑,合理安排。一般的网站栏目安排要注意以下几方面:

  1.一定记住要紧扣你的主题!

  一般的做法是:将你的主题按一定的方法分类并将它们作为网站的主栏目。例如上面的例子,可以将栏目分为动物动画,标志动画,三维动画,卡通动画等,在首页上标明最近更新的动画。记住:主题栏目个数在总栏目中要占绝对优势,这样的网站显的专业,主题突出,容易给人留下深刻印象。

  2.设一个最近更新或网站指南栏目

  如果你的首页没有安排版面放置最近更新内容信息,就有必要设立一个“最近更新”的栏目。这样做是为了照顾常来的访客,让你的主页更有人性化。

  如果你的主页内容庞大(超过15MB),层次较多,而又没有站内的搜索引擎,建议您设置“本站指南”栏目。可以帮助初访者快速找到他们想要的内容。

  3.设定一个可以双向交流的栏目

  不需要很多,但一定要有。比如论坛,留言本,邮件列表等,可以让浏览者留下他们的信息。有调查表明,提供双向交流的站点比简单的留一个”Email me”的站点更具有亲和力。

  4.设一个下载或常见问题回答栏目

  网络的特点是信息共享。如果你看到一个站点有大量的优秀的有价值的资料,你肯定希望能一次性下载,而不是一页一页浏览存盘。“将心比心”在你自己的主页上设置一个资料下载栏目,会得到大家的喜欢。有些站点为了广告显示量,一篇文章还要分几页显示,我觉得迟早会因访问量下降而淘汰(个人意见:)。另外,如果您的站点经常收到网友关于某方面的问题来信,你最好设立一个常见问题回答的栏目,既方便了网友,也可以节约自己更多时间用以学习。

  至于其他的辅助内容,如关于本站,版权信息等可以不放在主栏目里,以免冲淡主题。总结以上几点,我们得出划分栏目需要注意的是:

   ●尽可能删除与主题无关的栏目
   ●尽可能将网站最有价值的内容列在栏目上
   ●尽可能方便访问者的浏览和查询

  上面说的是栏目,我们再看看版块设置。版块比栏目的概念要大一些,每个版块都有自己的栏目。举个例子:网易的站点分新闻,体育,财经,娱乐,教育等版块,每个版块下面有各有自己的主栏目。一般的个人站点内容少,只有主栏目(主菜单)就够了,不需要设置版块。如果你觉得的确有必要设置版块的,应该注意1.各版块要有相对独立性。2.各版块要有相互关联。3.版块的内容要围绕站点主题。关于版块方面,主要是门户站点等较大ICP需要考虑的问题,阿捷在此不再作展开讨论。

确定网站的目录结构和链接结构

  上篇讲到:我们在动手制作网页前,一定要考虑好以下三方面:

  1.确定栏目和版块;
   2.确定网站的目录结构和链接结构
   3.确定网站的整体风格创意设计
   今天我们继续来讨论“确定网站的目录结构和链接结构”。

  一.网站的目录结构

  网站的目录是指你建立网站时创建的目录。例如:在用frontpage98建立网站时都默认建立了根目录和images子目录。目录的结构是一个容易忽略的问题,大多数站长都是未经规划,随意创建子目录。目录结构的好坏,对浏览者来说并没有什么太大的感觉,但是对于站点本身的上传维护,内容未来的扩充和移植有着重要的影响。下面是建立目录结构的一些建议:

  ●不要将所有文件都存放在根目录下。

  有网友为了方便,将所有文件都放在根目录下。这样做造成的不利影响在于:

  1.文件管理混乱。你常常搞不清哪些文件需要编辑和更新,哪些无用的文件可以删除,哪些是相关联的文件,影响工作效率。

  2.上传速度慢。服务器一般都会为根目录建立一个文件索引。当您将所有文件都放在根目录下,那么即使你只上传更新一个文件,服务器也需要将所有文件再检索一遍,建立新的索引文件。很明显,文件量越大,等待的时间也将越长。所以,给您的建议是:尽可能减少根目录的文件存放数。

  ●按栏目内容建立子目录。

  子目录的建立,首先按主菜单栏目建立。例如:网页教程类站点可以根据技术类别分别建立相应的目录,象Flash,Dhtml,Javascript等;企业站点可以按公司简介,产品介绍,价格,在线定单,反馈联系等建立相应目录。

其他的次要栏目,类似what’s new,友情连接内容较多,需要经常更新的可以建立独立的子目录。而一些相关性强,不需要经常更新的栏目,例如:关于本站,关于站长,站点经历等可以合并放在一个统一目录下。

所有程序一般都存放在特定目录。例如:CGI程序放在cgi-bin目录。便于维护管理。所有需要下载的内容也最好放在一个目录下。

  ●在每个主目录下都建立独立的images目录。

  默认的,一个站点根目录下都有一个images目录。刚开始学习主页制作时,阿捷习惯将所有图片都存放在这个目录里。可是后来发现很不方便,当我需要将某个主栏目打包供网友下载,或者将某个栏目删除时,图片的管理相当麻烦。经过实践发现:为每个主栏目建立一个独立的images目录是最方便管理的。而根目录下的images目录只是用来放首页和一些次要栏目的图片。

  ●目录的层次不要太深。

  目录的层次建议不要超过3层。原因很简单,维护管理方便。

  其它需要注意的还有:

  1.不要使用中文目录;网络无国界,使用中文目录可能对网址的正确显示造成困难。

  2.不要使用过长的目录;尽管服务器支持长文件名,但是太长的目录名不便于记忆。

  3.尽量使用意义明确的目录;上面的例子中,你可以用Flash,Dhtml,Javascript来建立目录,也可以用1,2,3建立目录,但是哪一个更明确,更便于记忆和管理呢?显然是前者!

  随着网页技术的不断发展,利用数据库或者其他后台程序自动生成网页越来越普遍,网站的目录结构也必将飞跃到一个新的结构层次。

  二.网站的链接结构

  网站的链接结构是指页面之间相互链接的拓扑结构。它建立在目录结构基础之上,但可以跨越目录。形象的说:每个页面都是一个固定点,链接则是在两个固定点之间的连线。一个点可以和一个点连接,也可以和多个点连接。更重要的是,这些点并不是分布在一个平面上,而是存在于一个立体的空间中。

  ●我们研究网站的链接结构的目的在于:用最少的链接,使得浏览最有效率。

  一般的,建立网站的链接结构有两种基本方式:

  1.树状链接结构(一对一)。类似DOS的目录结构,首页链接指向一级页面,一级页面链接指向二级页面。立体结构看起来就象蒲公英。这样的链接结构浏览时,一级级进入,一级级退出。优点是条理清晰,访问者明确知道自己在什么位置,不会”迷”路。缺点是浏览效率低,一个栏目下的子页面到另一个栏目下的子页面,必须绕经首页。

  2.星状链接结构(一对多)。类似网络服务器的链接,每个页面相互之间都建立有链接。立体结构象东方明珠电视塔上的钢球。这种链接结构的优点是浏览方便,随时可以到达自己喜欢的页面。缺点是链接太多,容易使浏览者迷路,搞不清自己在什么位置,看了多少内容。

  这两种基本结构都只是理想方式,在实际的网站设计中,总是将这两种结构混合起来使用。我们希望浏览者既可以方便快速的达到自己需要的页面,又可以清晰的知道自己的位置。所以,最好的办法是:

  ●首页和一级页面之间用星状链接结构,一级和二级页面之间用树状链接结构。

  举个例子。一个新闻站点的页面结构如下:

—————————————————

一级页面 二级页面

财经新闻页 — [财经新闻1,财经新闻2...]
/ |
首页 — 娱乐新闻页 — [娱乐新闻1,娱乐新闻2...]
\ |
IT新闻页 — [IT新闻1,IT新闻2...]

—————————————————-

  其中,首页,财经新闻页,娱乐新闻页,IT新闻页之间是星状链接,可以互相点击,直接到达。而财经新闻页和它的子页面之间是树状连接,浏览财经新闻1后,你必须回到财经新闻页,才能浏览IT新闻2。所以,有站点为了免去返回一级页面的麻烦,将二级页面直接用新开窗口(POP up windows)打开,浏览结束后关闭即可。

  注意:以上我们都是用的三级页面举例。如果您的站点内容庞大,分类明细,需要超过三级页面,那么建议你在页面里显示导航条,可以帮助浏览者明确自己所处的位置。就是您经常看到许多网站页面顶部的,类似这样:“您现在的位置是:首页->财经新闻->股市信息->深圳股->深发展”

  关于链接结构的设计,在实际的网页制作中是非常重要一环。采用什么样的链接结构直接影响到版面的布局。例如你的主菜单放在什么位置,是否每页都需要放置,是否需要用分帧框架,是否需要加入返回首页的链接。在连接结构确定后,再开始考虑链接的效果和形式,是采用下拉表单,还是用DHTML动态菜单等等。

  随着电子商务的推广,网站竞争的越来越激烈,对链接结构设计的要求已经不仅仅局限于可以方便快速的浏览,更加注重个性化和相关性。例如,一个爱婴主题网站里,在8个月婴儿的营养问题页面上,你需要加入8个月婴儿的健康问题链接,智力培养链接,或者是有关奶粉宣传的链接,一本图书,一个玩具的链接。因为父母不可能到每个栏目下去寻找关于8个月婴儿的信息,他们可能在找到需要的问题后就离开网站了。如何尽可能留住访问者,是网站设计者未来必须考虑的问题。

  讲到这里,阿捷忽然觉得自己很厉害,居然会总结出这么大一套理论:)什么,皮厚?可能吧,这么多高手都没发言呢!有意见请来信ajie@soim.com

  下次我们继续讨论“确定网站的整体风格创意设计”。

确定网站的整体风格和创意设计

  网站的整体风格及其创意设计是站长们最希望掌握,也是最难以学习的。难就难在没有一个固定的程式可以参照和模仿。给你一个主题,任何两人都不可能设计出完全一样的网站。当我们说:”这个站点很cool,很有个性!”那么,是什么让你觉得很cool呢?它到底和一般的网站有什么区别呢?本文试图用最简明的语言来说明:

  1.风格是什么,如何树立网站风格?
   2.创意是什么,如何产生创意?

  ●风格(style)是抽象的。是指站点的整体形象给浏览者的综合感受。

  这个“整体形象”包括站点的CI(标志,色彩,字体,标语),版面布局,浏览方式,交互性,文字,语气,内容价值,存在意义,站点荣誉等等诸多因素。举个例子:我们觉得网易是平易近人的,迪斯尼是生动活泼的,IBM是专业严肃的。这些都是网站给人们留下的不同感受。

  风格是独特的,是站点不同与其他网站的地方。或者色彩,或者技术,或者是交互方式,能让浏览者明确分辨出这是你的网站独有的。例如新世纪网络(www.century.2000c.net)的黑白色,网易壁纸站的特有框架,即使你只看到其中一页,也可以分辨出是哪个网站的。

  风格是有人性的。通过网站的外表,内容,文字,交流可以概括出一个站点的个性,情绪。是温文儒雅,是执著热情,是活泼易变,是放任不羁。象诗词中的“豪放派”和“婉约派”,你可以用人的性格来比喻站点。

  有风格的网站与普通网站的区别在于:普通网站你看到的只是堆砌在一起的信息,你只能用理性的感受来描述,比如信息量大小,浏览速度快慢。但你浏览过有风格的网站后你能有更深一层的感性认识,比如站点有品位,和蔼可亲,是老师,是朋友。

  看了以上描述,你可能对风格是什么可能依然模糊。其实风格就是一句话:与众不同!

  如何树立网站风格呢?我们可以分这样几个步骤:

  第一,确信风格是建立在有价值内容之上的。一个网站有风格而没有内容,就好比绣花枕头一包草,好比一个性格傲慢但却目不识丁的人。你首先必须保证内容的质量和价值性。这是最基本的,无须置疑。

  第二,你需要彻底搞清楚自己希望站点给人的印象是什么。可以从这几方面来理清思路:

  1.如果只用一句话来描述你的站点,应该是:_____________

  参考答案:
   有创意,专业,有(技术)实力,有美感,有冲击力

  2.想到你的站点,可以联想到的色彩是:________________

  参考答案:
   热情的红色,幻想的天兰色,聪明的金黄色

  3.想到你的站点,可以联想到的画面是:________________

  参考答案:
   一份早报,一辆法拉利跑车,人群拥挤的广场,杂货店

  4.如果网站是一个人,他拥有的个性是:________________

  参考答案:
   思想成熟的中年人,狂野奔放的牛仔,自信憨厚的创业者

  5.作为站长,你希望给人的印象是:____________________

  参考答案:
   敬业,认真投入,有深度,负责,纯真,直爽,淑女

  6.用一种动物来比喻,你的网站最象:__________________

  参考答案:
   猫(神秘高贵),鹰(目光锐利),兔子(聪明敏感),狮子(自信威信)

  7.浏览者觉得你和其他网站的不同是:__________________

  参考答案:
   可以信赖,信息最快,交流方便,

  8.浏览者和你交流合作的感受是:______________________

  参考答案:
   师生,同事,朋友,长幼。

  你可以自己先填写一份答案,然后让其他网友填写。比较后的结果会告诉你:你网站现在的差距,弱点及需要改进的地方。

  第三,在明确自己的网站印象后,开始努力建立和加强这种印象。

  经过第二步印象的的”量化”后,你需要进一步找出其中最有特色特点的东西,就是最能体现网站风格的东西。并以它作为网站的特色加以重点强化,宣传。例如:再次审查网站名称,域名,栏目名称是否符合这种个性,是否易记。审查网站标准色彩是否容易联想到这种特色,是否能体现网站的性格等等。具体的做法,没有定式。我这里提供一些参考:

  1.将你的标志logo,尽可能的出现在每个页面上。或者页眉,或者页脚,或则背景。

  2.突出你的标准色彩。文字的链接色彩,图片的主色彩,背景色,边框等色彩尽量使用与标准色彩一致的色彩。

  3.突出你的标准字体。在关键的标题,菜单,图片里使用统一的标准字体。

  4.想一条朗朗上口宣传标语。把它做在你的banner里,或者放在醒目的位置,告诉大家你的网站的特色是…

  5.使用统一的语气和人称。即使是多个人合作维护,也要让读者觉得是同一个人写的。

  6.使用统一的图片处理效果。比如,阴影效果的方向,厚度,模糊度都必须一样。

  7.创造一个你的站点特有的符号或图标。比如在一句链接前的一个点,可以使用,.。☆※○◇□△→(区位码里自己参看)等等。虽然很简单的一个变化,却给人与众不同的感觉,(为什么我没有想到呢?)

  8.用自己设计的花边,线条,点

  9.展示你网站的荣誉和成功作品。

  10.告诉网友关于你的真实的故事和想法。

  风格的形成不是一次定位的,你可以在实践中不断强化,调整,修饰,直到有一天,网友们写信告诉你:”我喜欢你的站点,因为它很有风格!”

  ● 创意(idea)是网站生存的关键。这一点相信大家都已经认同。然而作为网页设计师,最苦恼的就是没有好的创意来源。

  注意,这里说的创意是指站点的整体创意,(因为这个创意而产生这个站点,或者相同的内容,推出的创意不同),网页的平面设计创意我将在后面的版面布局窍门里介绍。

  创意到底是什么,如何产生创意呢?

  创意是引人入胜,精彩万分,出奇不意的;
   创意是捕捉出来的点子,是创作出来的奇招….
   这些讲法都说出了创意的一些特点,实质上,

  创意是传达信息的一种特别方式。

  比如Webdesigner(网页设计师),我们将其中的E字母大写一下: wEbdEsigEr,感觉怎么样,这其实就是一种创意!

  创意并不是天才者的灵感,而是思考的结果。根据美国广告学教授詹姆斯的研究,创意思考的过程分五阶段

  1.准备期–研究所搜集的资料,根据旧经验,启发新创意;
   2.孵化期–将资料咀嚼消化,使意识自由发展,任意结合;
   3.启示期–意识发展并结合,产生创意;
   4.验证期–将产生的创意讨论修正;
   5.形成期–设计制作网页,将创意具体化。

  创意是将现有的要素重新组合。

  比如,网络与电话结合,产生IP电话。从这一点上出发,任何人,包括你和我,都可以创造出不同凡响的创意。而且,资料越丰富,越容易产生创意。就好比万花筒,筒内的玻璃片越多,所呈现的图案越多。你如果有心可以发现,网络上的最多的创意来自与现实生活的结合(或者虚拟现实),例如在线书店,电子社区,在线拍卖。你是否想到了一种更好的创意呢?

  创意思考的途径最常用的是联想,这里提供了网站创意的25种联想线索:

  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.以上各项延伸组合
   ————-(转载自樊志育《广告制作》)

  需要一提的是:创意的目的是更好的宣传推广网站。如果创意很好,却对网站发展毫无意义,好比给奶牛穿高跟鞋,那么,我们宁可放弃这个创意!

  关于风格和创意,可以讲得还有许多。感兴趣的网友可以自己找一些广告设计方面的书阅读。希望本文能帮助您对网站的设计有一个更新的认识和提高。谢谢!

首页的设计

  在我们全面考虑好网站的栏目,链接结构和整体风格之后,我们就可以正式动手制作首页了。

  有这么一句俗语:”良好的开端是成功的一半”。

  在网站设计上也是如此,首页的设计是一个网站成功与否的关键。人们往往看到第一页就已经对你的站点有一个整体的感觉。是不是能够促使浏览者继续点击进入,是否能够吸引浏览者留在站点上,全凭首页设计的”功力”了。

  所以,首页的设计和制作是绝对要重视和花心思的。阿捷的经验是:一般首页设计和制作占整个制作时间的40%。你宁可多花些时间在早期,以免出现全部做好以后再修改,那将是最浪费精力的事。

  这里,先插一个“封面”的问题。封面是指没有具体内容,只放一个logo点击进入或者只有简单的图形菜单的首页。

  是否需要为站点设计一个“封面”?阿捷的个人观点是:没必要!

  除非你是很艺术类的站点,或者可以确信内容独特,可以吸引浏览者进一步点击进入的站点,否则的话,封面式的首页并不会给你的站点带来什么好处。我们上网浏览需要的是快速,有价值的信息,如果等待xx分钟,只显示出一个粗劣的“ENTER”图标,那么相信没有人会再耐心等待进入下一页。

  因为首页的重要性,阿捷将着重用8篇文章来仔细讨论有关首页设计的方方面面,大致提纲如下:

  ○版面布局的窍门
   ○色彩的搭配
   ○字体的设置和表格的嵌套
   ○细微之处见功力
   ○考虑不同的浏览器和分辨率
   ○设计好你的banner和位置
   ○meta标签的重要性
   ○首页设计的小建议

  今天,只是关于首页设计的一个引子。让我们来大致了解一下首页设计的步骤。

  首页,从根本上说就是全站内容的目录,是一个索引。但只是罗列目录显然是不够的,如何设计好一个首页呢?一般的步骤是:

  ●确定首页的功能模块
   ●设计首页的版面
   ●处理技术上的细节  

  一).确定首页的功能模块。

  首页的内容模块是指你需要在首页上实现的主要内容和功能。一般的站点都需要这样一些模块:

  网站名称(logo), 广告条(banner), 主菜单(menu),
   新闻(what’s new), 搜索(search), 友情链接(links),
   邮件列表(maillist),计数器(count), 版权(copyright).

  选择哪些模块,实现哪些功能,是否需要添加其他模块都是首页设计首先需要确定的。

  二).设计首页的版面

  在功能模块确定后,开始设计首页的版面。就象搭积木,每个模块是一个单位积木,如何拼搭出一座漂亮的房子,就看你的创意和想象力了。

  设计版面的最好方法是:找一张白纸,一支笔,先将你理想中的草图勾勒出来,然后再用网页制作软件实现。

  三).处理技术上的细节 

  阿捷经常收到的来信问题就是:我制作的主页如何能在不同分辨率下保持不变形,如何能在IE和NC下看起来都不至于太丑陋,如何设置字体和链接颜色….等等,阿捷将在下面几篇文章里为大家详细介绍。

  首页设计是整个网站设计的难点和关键,阿捷希望能够通过和大家的交流,总结出一套较为合理易学的设计方法,从而举一反三,使我们能够更加轻松的完成整个站点的设计制作。如果你愿意将你的心得体会和大家分享,请来信ajie@soim.com,谢谢!

版面布局的原理

  设计首页的第一步是设计版面布局。

  就象传统的报刊杂志编辑一样,我们将网页看作一张报纸,一本杂志来进行排版布局。虽然动态网页技术的发展使得我们开始趋向于学习场景编剧,但是固定的网页版面设计基础依然是必须学习和掌握的。它们的基本原理是共通的,你可以领会要点,举一反三。

  版面指的是浏览器看到的完整的一个页面(可以包含框架和层)。因为每个人的显示器分辨率不同,所以同一个页面的大小可能出现640*480像素,800*600像素,1024*768像素等不同尺寸。

  布局,就是以最适合浏览的方式将图片和文字排放在页面的不同位置。你可能注意到:“最适合”是一个不确定的形容词,什么才是最适合的呢?抱歉的是阿捷不能也不可能给您一个完整的正确的答案。就好比有人希望知道成功的秘诀是什么,成功者只能建议您用什么方法,什么途径才能最容易获得成功,而不可能有一步成功的”秘诀”告诉您。

  我们在设计思考系列文章第四篇讲过站点整体的创意,版面布局也是一个创意的问题,但要比站点整体的创意容易,有规律的多。让我们先来了解一下版面布局的步骤:

一.草案

  新建页面就象一张白纸,没有任何表格,框架和约定俗成的东西,你可以尽可能的发挥你的想象力,将你想到的”景象”画上去(我们建议您用一张白纸和一支铅笔,当然用作图软件photoshop等也可以)。这属于创造阶段,不讲究细腻工整,不必考虑细节功能,只以粗陋的线条勾画出创意的轮廓即可。尽你的可能多画几张,最后选定一个满意的作为继续创作的脚本。

二.粗略布局

  在草案的基础上,将你确定需要放置的功能模块安排到页面上。(注:功能模块我们在”首页设计-引子”中提过,主要包含网站标志,主菜单,新闻,搜索,友情链接,广告条,邮件列表,计数器,版权信息等)。注意,这里我们必须遵循突出重点、平衡谐调的原则,将网站标志,主菜单等最重要的模块放在最显眼,最突出的位置,然后在考虑次要模块的排放。

三.定案

  将粗略布局精细化,具体化。(靠你的智慧和经验,旁敲侧击多方联想,才能作出具有创意的布局。)

  在布局过程中,我们可以遵循的原则有:

  1、正常平衡—亦称”匀称”。多指左右、上下对照形式,主要强调秩序,能达到安定诚实、信赖的效果。
   2、异常平衡—即非对照形式,但也要平衡和韵律,当然都是不均整的,此种布局能达到强调性、不安性、高注目性的效果。
   3、对比—所谓对比,不仅利用色彩、色调等技巧来作表现,在内容上也可涉及古与今、新与旧、贫与富等对比。
   4、凝视—所谓凝视是利用页面中人物视线,使浏览者仿照跟随的心理,以达到注视页面的效果,一般多用明星凝视状。
   5、空白—空白有两种作用,一方面对其他网站表示突出卓越,另一方面也表示网页品位的优越感,这种表现方法对体显网页的格调十分有效。
   6、尽量用图片解说—此法对不能用语言说服、或用语言无法表达的情感,特别有效。图片解说的内容,可以传达给浏览者的更多的心理因素。
   ————(转载自广告大师樊志育《广告制作》)

  以上的设计原则,虽然枯燥,但是我们如果能领会并活用到页面布局里,效果就大不一样了。比如:

  ○网页的白色背景太虚,则可以加些色快;
   ○版面零散,可以用线条和符号串联;
   ○左面文字过多,右面则可以插一张图片保持平衡;
   ○表格太规矩,可以改用导角试试。

  经过不断的尝试和推敲,你的网页一定会亮丽起来的哦:)

  看看我们经常用到的版面布局形式:

  1.”T”结构布局。所谓”T”结构。就是指页面顶部为横条网站标志+广告条,下方左面为主菜单,右面显示内容的布局,因为菜单条背景教深,整体效果类似英文字母”T”,所以我们称之为”T”形布局。这是网页设计中用的最广返的一种布局方式。(图略)

这种布局的优点是页面结构清晰,主次分明。是初学者最容易上手的布局方法。缺点是规矩呆板,如果细节色彩上不注意,很容易让人”看之无味”。

  2.”口”型布局。这是一个象形的说法,就是页面一般上下各有一个广告条,左面是主菜单,右面放友情连接等,中间是主要内容。(图略)

这种布局的优点是充分利用版面,信息量大(我的主页首页即属于这种布局)。缺点是页面拥挤,不够灵活。也有将四边空出,只用中间的窗口型设计,例如网易壁纸站。

  3.”三”型布局。这种布局多用于国外站点,国内用的不多。特点是页面上横向两条色块,将页面整体分割为四部分,色块中大多放广告条。

  4.对称对比布局。顾名思义,采取左右或者上下对称的布局,一半深色,一半浅色,一般用于设计型站点。优点是视觉冲击力强,缺点是将两部分有机的结合比较困难。

  5.POP布局。POP引自广告术语,就是指页面布局象一张宣传海报,以一张精美图片作为页面的设计中心。常用于时尚类站点,比如ELLE.com。优点显而易见:漂亮吸引人。缺点就是速度慢。作为版面布局还是值得借鉴的。

  以上总结了目前网络上常见的布局,其实还有许许多多别具一格的布局,关键在于你的创意和设计了。对于版面布局的技巧,这里提供四个建议,您可以自己推敲:

  1.加强视觉效果
   2.加强文案的可视度和可读性
   3.统一感的视觉
   4.新鲜和个性是布局的最高境界

 网页的色彩是树立网站形象的关键之一,色彩搭配却是网友们感到头疼的问题。网页的背景,文字,图标,边框,超链接…,应该采用什么样的色彩,应该搭配什么色彩才能最好的表达出预想的内涵呢?阿捷这里谈一些心得,希望对你有所启发。

网页色彩搭配的原理

首先我们先来了解一些色彩的基本知识:

  1.颜色是因为光的折射而产生的。

  2.红,黄,蓝是三原色,其它的色彩都可以用这三种色彩调和而成。
    网页html语言中的色彩表达即是用这三种颜色的数值表示
    例如:红色是color(255,0,0)十六进制的表示方法为(FF0000)
    白色为(FFFFFF), 我们经常看到的”bgColor=#FFFFFF”就是指背景色为白色。

  3.颜色分非彩色和彩色两类。
    非彩色是指黑,白,灰系统色。
    彩色是指除了非彩色以外的所有色彩。

  4.任何色彩都有饱和度和透明度的属性,属性的变化产生不同的色相,所以至少可以制作几百万种色彩。

  网页制作用彩色还是非彩色好呢?根据专业的研究机构研究表明:彩色的记忆效果是黑白的3.5倍。也就是说,在一般情况下,彩色页面较完全黑白页面更加吸引人。我们通常的做法是:主要内容文字用非彩色(黑色),边框,背景,图片用彩色。这样页面整体不单调,看主要内容也不会眼花。

  ●非彩色的搭配

  黑白是最基本和最简单的搭配,白字黑底,黑底白字都非常清晰明了。灰色是万能色,可以和任何彩色搭配,也可以帮助两种对立的色彩和谐过渡。如果你实在找不出合适的色彩,那么用灰色试试,效果绝对不会太差。

  ●彩色的搭配

  色彩千变万化,彩色的搭配是我们研究的重点。我们依然需要进一步学习一些色彩的知识。

  一.色环。

  我们将色彩按”红->黄->绿->蓝->红”依次过度渐变,就可以得到一个色彩环。

  色环的两端是暖色和寒色,当中是中型色。(如下图)

红.橙.橙黄.黄.黄绿.绿.青绿.蓝绿.蓝.蓝紫.紫.紫红.红
|___________| |____| |_________| |_________|
| | | |
暖色系 中性系 寒色系 中性系

  二.色彩的心理感觉。不同的颜色会给浏览者不同的心理感受。

  红色—是一种激奋的色彩。刺激效果,能使人产生冲动,愤怒,热情,活力的感觉。
   绿色—介于冷暖两中色彩的中间,显得和睦,宁静,健康,安全的感觉。
   它和金黄,淡白搭配,可以产生优雅,舒适的气氛。
   橙色—也是一种激奋的色彩,具有轻快,欢欣,热烈,温馨,时尚的效果。
   黄色—具有快乐,希望,智慧和轻快的个性,它的明度最高。
   蓝色—是最具凉爽,清新,专业的色彩。
   它和白色混合,能体现柔顺,淡雅,浪漫的气氛(象天空的色彩:)
   白色—具有洁白,明快,纯真,清洁的感受。
   黑色—具有深沉,神秘,寂静,悲哀,压抑的感受。
   灰色—具有中庸,平凡,温和,谦让,中立和高雅的感觉。

  每种色彩在饱和度,透明度上略微变化就会产生不同的感觉。以绿色为例,黄绿色有青春,旺盛的视觉意境,而蓝绿色则显得幽宁,阴深。

  网页色彩搭配的原理

  1.色彩的鲜明性。网页的色彩要鲜艳,容易引人注目。

  2.色彩的独特性。要有与众不同的色彩,使得大家对你的印象强烈。(参考设计思考第二篇网站CI的标准色彩一节)

  3.色彩的合适性。就是说色彩和你表达的内容气氛相适合。如用粉色体现女性站点的柔性。

  4.色彩的联想性。不同色彩会产生不同的联想,蓝色想到天空,黑色想到黑夜,红色想到喜事等,选择色彩要和你网页的内涵相关联。

  网页色彩掌握的过程

  随着网页制作经验的积累,我们用色有这样的一个趋势:单色->五彩缤纷->标准色->单色。一开始因为技术和知识缺乏,只能制作出简单的网页,色彩单一;在有一定基础和材料后,希望制作一个漂亮的网页,将自己收集的最好的图片,最满意色彩堆砌在页面上;但是时间一长,却发现色彩杂乱,没有个性和风格;第三次重新定位自己的网站,选择好切合自己的色彩,推出的站点往往比较成功;当最后设计理念和技术达到顶峰时,则又返朴归真,用单一色彩甚至非彩色就可以设计出简洁精美的站点。

  网页色彩搭配的技巧

  文章写到这里,有心急的网友要问了:“到底用什么色彩搭配好看呢?你能不能推荐几种配色方案?”别急,这里有一点技巧,可以帮助你迅速成为调色大师:)

  1.用一种色彩。这里是指先选定一种色彩,然后调整透明度或者饱和度,(说得通俗些就是将色彩变淡或则加深),产生新的色彩,用于网页。这样的页面看起来色彩统一,有层次感。

  2.用两种色彩。先选定一种色彩,然后选择它的对比色(在photoshop里按ctrl+shift+I)。我的主页用蓝色和黄色就是这样确定的。整个页面色彩丰富但不花稍。

  3.用一个色系。简单的说就是用一个感觉的色彩,例如淡蓝,淡黄,淡绿;或者土黄,土灰,土蓝。确定色彩的方法各人不同,我是在photoshop里按前景色方框,在跳出的拾色器窗中选择”自定义”,然后在”色库”中选就可以了:)

  4.用黑色和一种彩色。比如大红的字体配黑色的边框感觉很”跳”。

  在网页配色中,忌讳的是:

  1.不要将所有颜色都用到,尽量控制在三种色彩以内。
   2.背景和前文的对比尽量要大,(绝对不要用花纹繁复的图案作背景),以便突出主要文字内容。

  好了,今天阿捷就为大家讲到这里了。

字体的设定

大家好,网页设计思考栏目今天继续第八讲。我们上次讨论了首页设计的版面布局和色彩的搭配,今天我们来谈谈字体。

  ●字体(Font)的设置是网页制作新手遇到的第一个难点。如何控制字体大小,如何取消超链接字体的下划线是网友来信问得最多的。好,我们来彻底研究一下字体的各个方面:

  字符集的设定。

  在查看html文件原代码时,我们经常可以在文件头和之间看到这么一句代码:
  
   这段代码的作用是什么呢?是否可以删除呢?
   其实这是meta标签的设定语句,是给浏览器看的。它的作用就是告诉浏览器:这个HTML文件是采用gb2312字符集制作的。当浏览器读到这一代码,便以gb2312字符集来解释和翻译网页原代码,然后我们就可以看到正确的网页。所以这个meta语句是非常重要的,尽量不要删除。

  gb2312就是我们最熟悉的GB简体码,英文是iso-8859-1字符集。其它还有BIG5,UTF-8,Shift-JIS,EUC,KOI8-2等字符集,分别用于不同的字体显示。

  字体的使用。

  在网页里,字体的定义语句是:显示文字
   其中Arial就是一种字体的名称。

  默认的浏览器定义的标准字体是中文宋体和英文times new Roma字体。也就是说,如果你没有设置任何字体,网页将以这两种标准字体显示。同时,着两种字体也可以在任何操作系统和浏览器里正确显示。

  windows另外自带了40多种英文字体和5种中文字体。这些字体,你也可以在网页里自由使用和设置。凡是使用windows操作系统的浏览器都可以正确显示这些字体,但在其它操作系统里,如unix 则不能完全正确显示。

  如果你需要用一种特殊的字体来体现你的风格,那么如何让大家可以真正看到你的设计页面呢?解决的办法是:用图片。

  将需要用这种字体的地方用图片代替,以保证所有人看到的页面是同一效果。   

  字体的样式(style)。

字体的样式有四种:正常体(regular),斜体(Italic),粗体(Bold),粗斜体(Bold Italic)。设置方法很简单,阿捷就不多罗嗦了。

  字体的效果。

  这里指通过html语言设定可以直接显示的效果,在html里的语句设定为:
   显示文字
   其中,overline是指上划线效果。其它常用的效果还有:underline(下划线),uppercase(大写)等等。

  字体大小的控制。

  字体大小的控制是本节的重点。

  一般字体默认的大小是12pt(镑).用语句可以将文字增大2pt。这种方法我们都已经掌握了。而现在网络上最流行的小中文字体大小为9pt,是如何设定的呢?有三种方法:

  1.用”显示文字“语句来设定。
   显然这种方法非常麻烦,你必须为每段文字都设定大小。

  2.用CSS层叠样式表。CSS是DHTML的一个组成部分,它可以定义整个页面的字体显示风格和大小。是较为简便的方法。比如,这里需要设定整个页面文字大小为9pt,只要将下面这段代码加入html代码的和之间:

  其中FONT-SIZE:9pt指字体的大小为9镑

  3.第二种方法已经简化了许多步骤,但是仍然不是最理想的方法,因为你必须在每个页面的head区都放置这么一段代码,扩大了文件的字节。另外这样的做法还有一个重大缺点,就是如果我需要修改整个站点的字体大小,就必须一页一页的改!

  所以推荐给你最终也是目前最好的方法—外部摸板文件调用法。

  “外部摸板调用”就是说你将css的设定作成一个单独的文件,在每个页面里都调用它。一旦你需要修改字体大小,只要修改一个.css文件,几百个页面就同时修改了。(这种方法类似子程序调用编写过程序的网友很容易理解:)

  调用的具体方法如下:

  (1)将上面的css代码copy成一个mycss.txt文件,然后修改后缀名为mycss.css
   (2)在html文件的之间插入
语句调用mycss.css(注意有关路径的设置正确)OK!

  字体超链接样式的设定。

  通常在网页的中设置连接的颜色,如:
   其中:link — Hyperlink(连接)的颜色
   vlink– visited Hyperlink(已访问过的连接)颜色
   alink– active Hyperlink (当前活动的连接)颜色
   颜色用rgb的16进制码表示如红色是#FF0000。

  同样用CSS可以更简便的设定网页超连接的样式,看下面这段代码

  将它插入html文件的head区就可以了。其中link设定的是有超链接的颜色;visited是访问过的超链接颜色;active是鼠标移上去的颜色;hover是鼠标点击时的颜色。而”text-decoration:none”是指取消超链接的下划线显示。

 关于CSS的设定还有更多的用法和技巧,比如在同一页中设定不同的字体大小和超链接颜色,请学习有关CSS的专门知识(可以到阿捷的主页http://pageone.yeah.net查阅)在这里我们不在冗述。

  ●上面已经介绍了字体在技术上的各个方面。有关字体的设计使用,目前还没有一个成熟的理论,下面是几条网页设计中字体的使用原则,仅供参考:

  1.不要使用超过3种以上的字体。字体太多则显得杂乱,没有主题。
   2.不要用太大的字。因为版面是宝贵,有限的,粗陋的大字体不能带给访问者更多信息。
   3.不要使用不停闪烁的文字。想让浏览者多停留一会儿的话,就不要使用闪烁的文字。
   4.原则上标题的字体较正文大,颜色也应有所区别。

  ●附:英文字体资源
   http://www.pambytes.com
   http://www.freestuff101.com/Fonts
   http://www.typearound.com/mainfont.html
   http://205.177.231.33/sofontes/us/pc_us.htm

  关于字体,今天就写到这里,您有好的建议或意见,请来信ajie@soim.com。下章我们继续关于表格的设计探讨。

网页中表格的运用

  表格(table)是页面的重要元素,是页面排版的主要手段。尽管DHTML中的层(layer)也可以实现网页元素的自由定位,但是表格显然更加方便编辑与修改。熟练掌握和运用表格的各种属性,可以让您的页面看起来赏心悦目。

  本文将分两部分详细介绍表格在网页设计中的运用。包括表格的基本用法和表格运用的注意点。

  一.表格的基本用法。

  表格的基本用法相信您已经非常熟悉了。但为了保证文章的完整性,阿捷在这里还是再罗列一遍。

  ●表格的HTML基本语法


- 定义表格
- 定义表行 - 定义表头 - 定义表元(表格的具体数据)

例如:




1 2 3
A B C

1 2 3
A B C

  ●table标签的参数。table标签可以含下列参数。

border 表格边框
cellspacing 表元之间的空白距离
cellpadding 表元内部的空白距离
width 表格宽度(可以用%或者具体数据表示)
height 表格高度

例如:




1 2 3
A B C

1 2 3
A B C

  ●表格的对齐方式

  1.表格内的文字对齐。

  语法: 其中#可以设定的参数有:

left 横向居左
center 横向居中
right 横向居右
top 纵向居顶
middle 纵向居中
bottom 纵向居底

例如:


A B C

A B C

  2.表格在页面内的对齐。

  如果你需要与表格并排放一段文字,就需要用到table标签的另一个个参数:

  

其中#可以设定为left(居左),right(居右)

  例如:



1 2 3
A B C

这里的文字

是和表格并排排放的

1 2 3
A B C

这里的文字是和表格并排排放的

●表格的嵌套

  表格嵌套就是在表格里插入表格,嵌套的排版方法就是将要插入的表格当做文字来处理同样使用 语句。

  例如:





  ●表格的色彩

  表格的色彩也在

标签里设置,参数有:

bgcolor 背景颜色
bordercolor 边框颜色
bordercolorlight 立体边框亮色
bordercolordark 立体边框暗色

  语法为:

其中RRGGBB分别为RGB三色的16进制数值

  例如:

borderColorDark=#ffffff borderColorLight=#000000 cellPadding=5
cellSpacing=0 bordercolorlight=”#000000″>

  以上是表格的基本用法。现在frngtpage,dreamweaver等所见即所得的网页编辑软件都不用编写代码,就可以轻松的实现表格的排版和嵌套,但是掌握一些基本语法,关键时刻还是很有用处的。

  .表格运用的注意点

  表格的嵌套并不是表格处理最困难的地方,无论多复杂的版面,悉心琢磨一番总能找到解决的办法。我们需要考虑的是:

  ○用什么样的嵌套排版方式使网页的下载速度达到最快。

  我们知道:浏览器在读取网页html原代码时,是读完整一个table再将它显示出来。也就是说从

标签开始,要读到

标签时,才将表格中的内容显示在屏幕上。而且显示也有优先级,先读到的先显示。这样的话,如果一个大表格中含有多个子表格,必须等大表格读完,才能将子表格一起显示出来。

  我们在访问一些站点时,等待多时无结果,按”停止”按钮却一下显示出页面就是这个原因。

  因此,我们在设计页面表格的时候,应该做到:

  1.整个页面不要都套在一个表格里,尽量拆分成多个表格;

  2.单一表格的结构尽量整齐;

  3.表格嵌套层次尽量要少.

  实验证明:越复杂,嵌套层次越多的表格下载速度越慢。

   关于网页的表格设计今天就写到这里。阿捷没有很多的技巧提供,关键在于您自己的实践和运用,还是那句古话:“熟能生巧”。

2004年08月15日

一、命名

 

1.pascal规则来命名方法和类型.

public class TextBox

{

     public void DataBind() 

     {

     }

}

 

2.camel规则来命名局部变量和方法的参数.

string userName;

public AddUser(string userId, byte[] password);

 

3.所有的成员变量前加前缀 m_

public class Database

{

     public string m_connectionString;

}

 

4.接口的名称加前缀 I.

interface ICompare

{

     int compare();

}

 

5.自定义的属性以Attribute结尾

public class AuthorAttribute : Attribute

{

}

 

6.自定义的异常以Exception结尾

public class AppException : Exception

{

}

 

7.方法的命名.一般将其命名为动宾短语.

ShowDialog()

CreateFile()

GetPath()

 

8.代码的缩进.要用Tab,而不要用space.

 

9.局部变量的名称要有意义.不要用xyz等等.

string userName

 

10.所有的成员变量声明在类的顶端,用一个换行把它和方法分开.

 

11.用有意义的名字命名namespace,如:产品名、公司名.

 

12.建议局部变量在最接近使用它时再声明.

 

13.使用某个控件的值时,尽量命名局部变量.

 

14.把引用的系统的namespace和自定义或第三方的分开.

 

15.文件名要能反应类的内容,最好是和类同名,一个文件中一个类.

 

16.目录结构中要反应出namespace的层次.

 

17.大括号“{“要新起一行.

public class AuthorAttribute : Attribute

{

}

 

二、编码习惯.

1.C#预定义的类名,而不要用别名.

string userName;   而不是 System.String userName;

int number;            而不是 System.Int32;

 

2.一行不要超过80个字符.

 

3.尽量不要手工更改机器生成的代码,若必须更改,一定要改成和机器生成的代码风格一样.

 

4.关键的语句(包括声明关键的变量)必须要写注释.

 

5.文字常量和数字常量不要硬编码,应该用常量类或枚举代替.

 

6.不要用goto系列语句.

 

7.不要声明publicprotected的成员变量,应用property.

 

8.不要声明publicevent,应用事件访问器.

public class Source

{

     private EventHandler m_NumberChangeEvent;

    

     public event EventHandler NumberChangeEvent

     {

         add

         {

              m_NumberChangeEvent += value;

         }

        

         remove

         {

              m_NumberChangeEvent -= value;

         }

     }

}

 

9.类型转换的使用规则.

Animal animal = new Dog();

Dog dog = animal as Dog;

if (dog != null)

{

}

 

10.生成和构建一个长的字符串时,一定要使用StringBuilder,而不用string.

 

11.始终使用“{  }”包含if下的语句,即使只有一条语句.

 

12.switch语句一定要有default来处理意外情况.

 

13.尽量不要使用三目运算符 ? : ,而要使用if语句.

 

14.尽量不用使用this引用,除非是要调用类中的另一个Constructor.

public class Person

{

     public Person(string name)

     {

     }

    

     public Person() : this(“Jim”)

     {

     }

}

2004年08月12日

这篇文章有点个人的感情色彩在里面,但是据我知道的应该是真实的事情,但是他的论述中少了一轮在第四轮和第三轮之间还有一轮,以网络迅速致富的人(如丁磊,张朝阳)。文章所说的第四轮,就是现在被称为“最后的晚餐”的国有股减持 (有待观望!)

  改革开放过程从本质上看是一个财富转移过程。改革开放之初,政府降低积累率,通过农副产品提价和涨工资、发奖金等方式对农民、工人、知识分子和干部多年来的辛勤劳动做出一些补偿,赢得了全的社会的好评,制造了拥护改革开放的舆论。

  但是接下去事情就一步步对工人、农民不利。”大锅饭”、”铁饭碗”是工人的根本利益所在。西方国家工人运动的潮流就是争取大锅饭和铁饭碗。工会的首要目标是将工资的定价权从雇主手中夺过来,并改变定价方式,改计件制为计时制,即大锅饭;其次是争取免于解雇的权力,至少是要求雇主在解雇之前六个月通知工人,并且要得到工会的同意,即增进饭碗的可靠性,在日本甚至直接是终身雇佣制。与”大锅饭”和”铁饭碗”相应的,是工人自律程度和合作意识的提高。在中国国营企业中,事实上工人的主人翁意识一度十分高涨,出现了象铁人王进喜这样的一大批劳动英雄,国营企业工人的工作积极性和工作质量事实上都远胜于日本企业。所以,认为”铁饭碗”必然效率低下的说法是不符合事实的。问题也在于,从资本家唯利是图的眼光看来,”铁饭碗”束缚了资方的权力,使资方无法随心所欲地解雇工人,降低工资,不能实现利润最大化。因此,八十年代初期,美国的里根和英国的撒切尔在西方发动了私有化和”破三铁”运动,中国的改革竟与之遥相呼应。

从”破三铁”开始,工人就失去了主人翁地位,而厂长却开始行使资本家的权力,这样,国营企业走上了私有化道路。全民所有制肢解为部门所有制,地区所有制,企业所有制,直至执政官员任期所有制。在厂长负责制名义下,应该代表全民经营企业的厂长、经理获得了空前的、不受监督的权力,他一步步将过去前三十年建设的财富和工人们正在创造的财富据为己有。承包制公开承认厂长们化公为私的权力,价格双轨制又给厂长们化公为私的途径。在权力和金钱的腐蚀下,越来越多的厂长经理背叛了党的宗旨和原则,结党营私,任人唯亲,将企业变成独立王国和向政府讨价还价的工具,成为发财致富的先头部队。

  与工人一样,农民最容易受竞争伤害。八十年代中期以来,农产品价格不断下跌,农民干得越多,赔得越多,其关键就是自相残杀的竞争(其间农产品价格一度上升,是因为政府保护价收购所致)。因此,人民公社使农民从相互竞争走向相互合作,是农民根本利益所在。但是,邓小平的政策一方面给农民以甜头,另一方面废除了人民公社制度,分田到户,埋下了农民相互残酷竞争的祸根。从1984年农民卖粮难起,农民就重新尝到了”多收了三五斗”(一篇描写旧中国农民增产不增收的小说)的市场经济滋味。此后,虽然有少数农民靠经济作物和养殖业发财致富,但绝大多数农民遭到市场力量的一次又一次洗劫,收入日益下降。与此同时,农村干部利用批地、计划生育、道路建设等名目不断搜刮农民,农村干部们富裕起来了,农村干群关系却变得形同水火。

  一小部分知识分子是利用改革开放机遇的主要受益群体。这个群体中头脑活络,有知识,有经验,有权力背景的那一部分率先下海经商,利用体制转换期间的无数漏洞,成为新生的资本家。一部分人在干部队伍”专业化、年轻化、知识化”的浪潮中成为”第三梯队”,被邓式政权所吸纳。当然还有少数人干脆出国洋插队,直接享受发达国家的物质生活去了。至于大多数劳动知识分子,则只能是”光着屁股坐花轿”了。

  中上层干部是改革开放的动力,其中大多数也是改革开放的主要受益者,而且层次越高,权力越大,受益越多。以往,干部受到各种运动的约束,夹着尾巴做人。现在,发财致富名利双收,那些私欲重的干部率先做起”以权换钱”、”以钱换更大权”的如意买卖,成为现实权力扩大再生产者。

  70年代末至80年代初期的第一轮致富潮,是发生在广东沿海的走私进口潮和广西、云南边陲的贩毒潮。这一波潮流开始范围较小、层次较低、金额还不算太大,因而不引人瞩目,但这两股潮流后来愈演愈烈,特别是走私潮,成为沿海地区的致富主要秘密武器。深圳、珠海、北海、汕头、厦门、海南、威海、青岛、大连等沿海城市无一不靠走私致富。邓南巡后,走私活动更上一层楼。在一些地区和城市,走私决定甚至由人大常委会做出,海陆空军的舰只、飞机、军车都成了走私的运输工具。在厦门远华案中可以看到,海关、公安、武警都被走私分子利用。龙永图谈沦加入世贸组织的理由之一便是,由于走私,我国实际关税不到5%,远远低于名义关税,因此还不如把名义关税降下来。两者之间的落差就使得沿海走私城市崛起,而东北、西北、中原各地的重化工业城市萧条衰落。累计20多年的走私金额,当不下5万亿人比币(现价,下同)。如以走私纯利润(扣除走私环节实际成本,但不扣除行贿资金)总金额的20%计,从中可以形成100万个百万富翁。

  第二轮致富潮发生在城市承包制和双轨制期间。大量的集体企业和中小型国有企业在承包者大肆鲸吞下陷入困境,财务混乱,工资拖欠,设备过度使用,产品以次充好,从而实现承包者个人利益最大化。在物资流通上,计划内外价格巨大落差造就出了一大批暴发户和暴发企业。当承包者拥有紧俏物资定价和销售权时,例如首钢,这两种制度的弊端便结合在一起,成为权力拥有者的天堂。这一轮致富潮遍及神州大地,但致致富的手段比较简单,持续时间比较短,而且致富者思想还未彻底解放,故总案值当在5万亿人民币以下,实际落入承包者和官倒者手中约为1万亿人民币,可造就不到100万个百万富翁。

  第三轮致富潮是在邓南巡讲话以后的土地和股票的投机热中。部分高干子女是土地投机热的最大受益者,他们凭借权力和关系用低廉的价格买到大片土地,然后转手倒卖,一次暴富,其速度和规模都超过前两轮狂潮。潮势所至,各地的银行甚至财政资金纷纷卷入土地投机,获得的利润进入相应机构和个人的腰包,损失成为银行的呆坏帐、财政的赤字。这是中国金融机构不良资产的第一个主要来源,也是省、市、县政府村债务的第一个主要来源。股票投机伴随着土地投机达到高峰,在政府收紧银根后,几乎同时破灭。其效应也和土地投机相似,获得原始股的权势人物功成身退,盘满钵溢,跟风炒作者被洗劫一空。这轮致富潮为时虽短,但涉及面广,层次高,金额大,总案值在10万亿人民币以上。可造就200万个百万富翁。

  第四轮致富潮是卖完了土地卖企业,推行国有企业私有化,所谓大股小卖,大企业股份化,小企业出售拍卖。经过前三轮的准备,财富都已经聚集到少数人手中,他们有能力收购国有企业。即使如此,这些人也不会按照市场价格收购。这时候一批会计事务所、国有资产评估所大显身手,将国有企业的价格严重低估拍卖给当地的实权人物,并从中捞取丰厚的中介费。这实际上是一场明火执仗地抢劫。政府和银行帮助这一抢劫过程顺利地进行,政府允许被私人收购的企业逃废债务,用军警弹压企业职工的抗议,银行提供贷款帮助收购。尘埃落定时,地方和部门的实权人物已经摇身一变成为大资本家了。大型国有企业的股份化也同样是一场抢劫,裁减员工,买断工龄,是主要的抢劫方式。此外,3000万中小股民被抢劫的对象,所用的办法是让会计师事物所高估企业资产,发行掺水股票,不断地圈股民的钱。朱熔基总理给国家会计学院的题词”不做假账”,是对这一轮抢劫行情的绝妙注解。估计这轮行情的总值也在5亿人民币左右,可造就100万个百万富翁。

  每一轮致富行情都是腐败的好机会。在这些行情外,在工程招标和建设,重大设备和大宗物资采购,大笔贷款,重要职务任命等,都是产生百万富翁的丰厚土壤,这些也是银行不良资产增长的丰厚土壤。此外,当然还有一些没有权力背景或权钱交易的、在市场中拼杀出来的百万翁。这样,总计百万富翁数接近1000万(《半月谈》(内部版)2001年第7期:”中国的百万富翁近千万之众。”),其中更有数百名资产过亿的大富翁。这些人就是改革开放最大受益者,也是改革开放的弄潮儿和中坚力量,他们是今日中国政权的真正执掌者。这部分人不到中国人口的0.8%。

  经过这四波大潮洗劫后,中国政府手中掌握的资源已经不多了,土地虽然未卖光,但剩下的多为不太值钱的市郊地;国有企业也卖得差不多了,剩下的只有那些没人要也不好意思卖的军工企业。戴相龙承认的国有商业银行不良贷款比例为25.37%,为22,898亿元,这还不算已经剥离到四大资产管理公司的坏账15688亿(已收回1360亿元)。据业内人士透露,实际不良资产比例远高于50%,中国的银行体系随时可能遭到挤兑风潮的袭击。从1999年起。财政赤字以每年45%的速度递增,分别为:1997年582.15亿,1998年922.23亿,1999年1743.59亿,2002年3098亿。到2002年底,国债余额将达到25600亿元,相当于2001年GDP的26.7%。这还仅仅是正式的国债。各地政府向中央政府学习,也搞欠债繁荣,每一任省、市、县长甚至乡长、村长都争相搞建设、上项目,银行贷款不够就集资,集资不够就挪用教师工资、棉花和粮食收购款,一任接一任地积累起庞大的地方债务(含未登记外债),累计达60000亿人民币。此外,考虑到越来越多的失业、越来越早的退休,以及人口老龄化,社会保险基金的缺口达4万到8万亿。所有这些债务、不良资产、基金缺口最终都是要由国家来承担,以最低数字计,高达162826亿人民币。

  那么国家还有多少资产呢?据2001年统计年鉴数据:中国共有国有及非国有企业162885万户。企业拥有的资产总额为126211亿元人民币,负债93271亿人民币。负债率高达73.9%,净资产32940万亿人民币。经过大规模私有化后,国有企业资产比例已降至全国企业总资产的30%左右,而负债率高于其他类企业。若按相同的资产负债率计算,国有净资产只剩下9882亿人民币。

  这就是我们的家底。这是一个吃完祖宗饭,又断子孙路的家底。共和国亿万人民五十多年来创造的财富就这样流进了少数先富起来者的腰包,却留下了一个152944亿人民币的债务黑洞。填补这个黑洞的,只能是恶通货膨胀,届时,老百姓手头的存款将被洗劫一空。

2004年08月09日

HTML部分  
 
<%@  Page  language=”c#”  Codebehind=”UpLoad.aspx.cs”  AutoEventWireup=”false”  Inherits=”WebPortal.Upload”  %>  
<!DOCTYPE  HTML  PUBLIC  ”-//W3C//DTD  HTML  4.0  Transitional//EN”  >  
<HTML>  
           <HEAD>  
                       <title>多文件上传</title>  
                       <script  language=”JavaScript”>  
       function  addFile()  
       {  
                   var  str  =  ’<INPUT  type=”file”  size=”50″  NAME=”File”>’  
                   document.getElementById(‘MyFile’).insertAdjacentHTML(“beforeEnd”,str)  
       }  
                       </script>  
           </HEAD>  
           <body>  
                       <form  id=”form1″  method=”post”  runat=”server”  enctype=”multipart/form-data”>  
                                   <div  align=”center”>  
                                               <h3>多文件上传</h3>  
                                               <P  id=”MyFile”><INPUT  type=”file”  size=”50″  NAME=”File”></P>  
                                               <P>  
                                                           <input  type=”button”  value=”增加(Add)”  onclick=”addFile()”>  <input  onclick=”this.form.reset()”  type=”button”  value=”重置(ReSet)”>  
                                                           <asp:Button  Runat=”server”  Text=”开始上传”  ID=”UploadButton”></asp:Button>  
                                               </P>  
                                               <P>  
                                                           <asp:Label  id=”strStatus”  runat=”server”  Font-Names=”宋体”  Font-Bold=”True”  Font-Size=”9pt”  Width=”500px”  
                                                                       BorderStyle=”None”  BorderColor=”White”></asp:Label>  
                                               </P>  
                                   </div>  
                       </form>  
           </body>  
</HTML>  
 
代码部分  
 
using  System;  
using  System.Collections;  
using  System.ComponentModel;  
using  System.Data;  
using  System.Drawing;  
using  System.Web;  
using  System.Web.SessionState;  
using  System.Web.UI;  
using  System.Web.UI.WebControls;  
using  System.Web.UI.HtmlControls;  
 
namespace  WebPortal  
{  
           ///  <summary>  
           ///  UpLoad  的摘要说明。  
           ///  实现多文件上传  
           ///  </summary>  
           public  class  Upload  :  System.Web.UI.Page  
           {  
                       protected  System.Web.UI.WebControls.Button  UploadButton;  
                       protected  System.Web.UI.WebControls.Label  strStatus;  
 
                       private  void  Page_Load(object  sender,  System.EventArgs  e)  
                       {  
                                   ///  在此处放置用户代码以初始化页面  
                                   if  (this.IsPostBack)  this.SaveImages();  
                       }  
 
                       private  Boolean  SaveImages()  
                       {  
                                   ///’遍历File表单元素  
                                   HttpFileCollection  files    =  HttpContext.Current.Request.Files;  
 
                                   ///  ’状态信息  
                                   System.Text.StringBuilder  strMsg  =  new  System.Text.StringBuilder();  
                                   strMsg.Append(“上传的文件分别是:<hr  color=red>”);  
                                   try  
                                   {  
                                               for(int  iFile  =  0;  iFile  <  files.Count;  iFile++)  
                                               {  
                                                           ///’检查文件扩展名字  
                                                           HttpPostedFile  postedFile  =  files[iFile];  
                                                           string  fileName,  fileExtension;  
                                                           fileName  =  System.IO.Path.GetFileName(postedFile.FileName);  
                                                           if  (fileName  !=  ”")  
                                                           {  
                                                                       fileExtension  =  System.IO.Path.GetExtension(fileName);  
                                                                       strMsg.Append(“上传的文件类型:”  +  postedFile.ContentType.ToString()  +  ”<br>”);  
                                                                       strMsg.Append(“客户端文件地址:”  +  postedFile.FileName  +  ”<br>”);  
                                                                       strMsg.Append(“上传文件的文件名:”  +  fileName  +  ”<br>”);  
                                                                       strMsg.Append(“上传文件的扩展名:”  +  fileExtension  +  ”<br><hr>”);  
                                                                       ///’可根据扩展名字的不同保存到不同的文件夹  
                                                                       ///注意:可能要修改你的文件夹的匿名写入权限。  
                                                                       postedFile.SaveAs(System.Web.HttpContext.Current.Request.MapPath(“images/”)  +  fileName);  
                                                           }  
                                               }  
                                               strStatus.Text  =  strMsg.ToString();  
                                               return  true;  
                                   }  
                                   catch(System.Exception  Ex)  
                                   {  
                                               strStatus.Text  =  Ex.Message;  
                                               return  false;  
                                   }  
                       }  
                       #region  Web  窗体设计器生成的代码  
                       override  protected  void  OnInit(EventArgs  e)  
                       {  
                                   //  
                                   //  CODEGEN:  该调用是  ASP.NET  Web  窗体设计器所必需的。  
                                   //  
                                   InitializeComponent();  
                                   base.OnInit(e);  
                       }  
 
                       ///  <summary>  
                       ///  设计器支持所需的方法  -  不要使用代码编辑器修改  
                       ///  此方法的内容。  
                       ///  </summary>  
                       private  void  InitializeComponent()  
                       {          
                                   this.ID  =  ”Upload”;  
                                   this.Load  +=  new  System.EventHandler(this.Page_Load);  
 
                       }  
                       #endregion  
           }  
}

前台代码

<!–StartFragment–><%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”Thumbnail.aspx.vb”
Inherits=”aspxWeb.Thumbnail” %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<HTML>
  <HEAD>
    <title>在ASP.NET里轻松实现缩略图</title>
    <meta content=”Microsoft Visual Studio.NET 7.0″ name=”GENERATOR”>
    <meta content=”Visual Basic 7.0″ name=”CODE_LANGUAGE”>
    <meta content=”JavaScript” name=”vs_defaultClientScript”>
    <meta content=”http://schemas.microsoft.com/intellisense/ie5″ name=”vs_targetSchema”>
  </HEAD>
  <body MS_POSITIONING=”GridLayout”>
    <asp:Label id=”Label1″ runat=”server”></asp:Label>
    <form id=”Form1″ method=”post” runat=”server” enctype=”multipart/form-data”>
      <INPUT type=”file” name=”file” width=”600″><br><br>
      <asp:Button id=”Button1″ runat=”server”></asp:Button>
    </form>
  </body>
</HTML>

——————————————————————————-

后台代码

<font face="Verdana" size="2">using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.IO; using System.Drawing.Imaging; namespace eMeng.Exam { /// <summary> /// Thumbnail 的摘要说明。 /// </summary> public class Thumbnail : System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 Label1.Text = &#8220;<br /> <h3>在ASP.NET里轻松实现缩略图</h3> <p>&#8220;; Button1.Text = &#8220;上载并显示缩略图&#8221;; } #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// <summary> /// 设计器支持所需的方法 &#8211; 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { HttpFileCollection MyFileColl = HttpContext.Current.Request.Files; HttpPostedFile MyPostedFile = MyFileColl[0]; if (MyPostedFile.ContentType.ToString().ToLower().IndexOf(&#8220;image&#8221;) < 0) { Response.Write("无效的图形格式。"); return; } GetThumbNail(MyPostedFile.FileName, 100, 100, MyPostedFile.ContentType.ToString(), false, MyPostedFile.InputStream); } private System.Drawing.Imaging.ImageFormat GetImageType(object strContentType) { if ((strContentType.ToString().ToLower()) == "image/pjpeg") { return System.Drawing.Imaging.ImageFormat.Jpeg; } else if ((strContentType.ToString().ToLower()) == "image/gif") { return System.Drawing.Imaging.ImageFormat.Gif; } else if ((strContentType.ToString().ToLower()) == "image/bmp") { return System.Drawing.Imaging.ImageFormat.Bmp; } else if ((strContentType.ToString().ToLower()) == "image/tiff") { return System.Drawing.Imaging.ImageFormat.Tiff; } else if ((strContentType.ToString().ToLower()) == "image/x-icon") { return System.Drawing.Imaging.ImageFormat.Icon; } else if ((strContentType.ToString().ToLower()) == "image/x-png") { return System.Drawing.Imaging.ImageFormat.Png; } else if ((strContentType.ToString().ToLower()) == "image/x-emf") { return System.Drawing.Imaging.ImageFormat.Emf; } else if ((strContentType.ToString().ToLower()) == "image/x-exif") { return System.Drawing.Imaging.ImageFormat.Exif; } else if ((strContentType.ToString().ToLower()) == "image/x-wmf") { return System.Drawing.Imaging.ImageFormat.Wmf; } else { return System.Drawing.Imaging.ImageFormat.MemoryBmp; } } private void GetThumbNail(string strFileName, int iWidth, int iheight, string strContentType, bool blnGetFromFile, System.IO.Stream ImgStream) { System.Drawing.Image oImg; if (blnGetFromFile) { oImg = System.Drawing.Image.FromFile(strFileName); } else { oImg = System.Drawing.Image.FromStream(ImgStream); } oImg = oImg.GetThumbnailImage(iWidth, iheight, null, IntPtr.Zero); string strGuid = System.Guid.NewGuid().ToString().ToUpper(); string strFileExt = strFileName.Substring(strFileName.LastIndexOf(".")); Response.ContentType = strContentType; MemoryStream MemStream = new MemoryStream(); oImg.Save(MemStream, GetImageType(strContentType)); MemStream.WriteTo(Response.OutputStream); } } }</font>

private void GetZoomedLogo(System.IO.Stream originLogo, int width, int height,System.IO.Stream outputStream)
  {
   int drawWidth = 0, drawHeight = 0;

   System.Drawing.Image origin = System.Drawing.Image.FromStream(originLogo);

   if (width == 0 && height == 0)   //not designate width and height
   {
    width = origin.Width;
    height = origin.Height;
   }

   if (origin.Width < width && origin.Height < height)    //not zoom in
   {
    drawWidth = origin.Width;
    drawHeight = origin.Height;
   }
   else
   {
    double scaleX = (double)origin.Width / (double)width;
    double scaleY = (double)origin.Height / (double) height;

    double scale = scaleX > scaleY ? scaleX : scaleY;
    drawWidth = Convert.ToInt32(origin.Width / scale);
    drawHeight = Convert.ToInt32(origin.Height / scale);
   }
   System.Drawing.Rectangle destRect = new Rectangle((width – drawWidth) / 2, (height – drawHeight) / 2, drawWidth, drawHeight);
    
   Bitmap temp = new Bitmap(width, height);
   Graphics g = Graphics.FromImage(temp);

   SolidBrush brush = new SolidBrush(Color.White);
   g.FillRectangle(brush, 0, 0, width, height);             //draw background
//   g.DrawLine(new Pen(Color.Red, 10), 0, 0, 20, 20);

   if (width >= 300 || height >= 300)
   {
    g.DrawImage(origin, destRect);
   }
   else
   {
    System.Drawing.Image thumbnail = origin.GetThumbnailImage(drawWidth, drawHeight, null, System.IntPtr.Zero);
    g.DrawImage(thumbnail, destRect);
   }

   temp.Save(outputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

   origin.Dispose();
   temp.Dispose();
   g.Dispose();
  }