日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
探秘JDK7之二:半透明和任意形狀的窗口

昨天為大家?guī)砹恕疤矫豃DK 7:將會出現(xiàn)新的語言特性”,今天我們從Java SE 6u10(Build 12)開始和大家探討一下Java引入的com.sun.awt.AWTUtilities類提供半透明和任意形狀窗口的支持,這是個臨時類,因?yàn)?u10不是一個Java SE主版本,沒有提供抽象窗口工具集API(Abstract Window Toolkit API,AWT API),也沒有修改現(xiàn)有API。在JDK 7中,AWTUtilities類將不復(fù)存在,AWT類也做了許多改變,以更好地支持半透明和任意形狀的窗口,本文將為大家介紹一下JDK 7中提供的3種半透明窗口,另外也會涉及到任意形狀窗口的介紹。

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)向陽,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

簡單的半透明窗口

簡單的半透明窗口就是透明度均勻分布的窗口,所有像素的不透明度值都一樣,這個值越小,窗口越透明,達(dá)到最小值時,窗口就是完全透明的了,相反,如果值越大則越不透明。

JDK 7給java.awt.Window類增加了public void setOpacity(float opacity)和public float getOpacity()兩個方法來實(shí)現(xiàn)簡單的半透明窗口效果,前一個方法需要一個不透明度參數(shù),其取值范圍是0.0(完全透明)-1.0(完全不透明)。

在窗口上調(diào)用setOpacity()方法激活其簡單半透明效果,注意指定的參數(shù)值不能小于0.0,也不能大于1.0,否則setOpacity()會拋出一個IllegalArgumentException異常。

如果窗口處于全屏模式且不透明度值小于1.0,setOpacity()方法會拋出一個java.awt.IllegalComponentStateException異常,如果不支持簡單透明度且不透明度值小于1.0,它會拋出UnsupportedOperationException異常。

java.awt.GraphicsDevice類提供了一個public Window getFullScreenWindow()方法確定窗口是否處于全屏模式,這個類也提供了一個public boolean isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency translucencyKind)方法確定當(dāng)前的顯示設(shè)備是否支持簡單透明效果,如果顯示設(shè)備支持這個方法參數(shù)指定的半透明效果,isWindowTranslucencySupported()就返回True,對于簡單半透明效果,這個方法的參數(shù)必須是GraphicsDevice.WindowTranslucency.TRANSLUCENT,如下所示:

 
 
 
 
  1. GraphicsEnvironment ge;
  2. ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
  3. if (!ge.getDefaultScreenDevice ().
  4.         isWindowTranslucencySupported (GraphicsDevice.WindowTranslucency.TRANSLUCENT))
  5. {
  6.     System.err.println ("simple translucency isn't supported");
  7.     return;
  8. }

我創(chuàng)建了一個STDemo程序演示簡單半透明效果,使用滑塊調(diào)節(jié)框架窗口的透明度,清單1顯示了這個程序的源代碼。

清單1. STDemo.java

 
 
 
 
  1. // STDemo.java
  2. import java.awt.EventQueue;
  3. import java.awt.FlowLayout;
  4. import java.awt.GraphicsDevice;
  5. import java.awt.GraphicsEnvironment;
  6. import javax.swing.JFrame;
  7. import javax.swing.JLabel;
  8. import javax.swing.JPanel;
  9. import javax.swing.JSlider;
  10. import javax.swing.event.ChangeEvent;
  11. import javax.swing.event.ChangeListener;
  12. public class STDemo extends JFrame
  13. {
  14.    public STDemo ()
  15.    {
  16.       super ("Simple Translucency Demo");
  17.       setDefaultCloseOperation (EXIT_ON_CLOSE);
  18.       final JSlider slider = new JSlider (0, 100, 100);
  19.       ChangeListener cl;
  20.       cl = new ChangeListener ()
  21.            {
  22.                public void stateChanged (ChangeEvent ce)
  23.                {    
  24.                   JSlider source = (JSlider) ce.getSource ();
  25.                   STDemo.this.setOpacity (source.getValue ()/100.0f);
  26.                }
  27.            };
  28.       slider.addChangeListener (cl);
  29.       getContentPane ().setLayout (new FlowLayout ());
  30.       getContentPane ().add (new JLabel ("TRANSP"));
  31.       getContentPane ().add (new JPanel () {{ add (slider); }});
  32.       getContentPane ().add (new JLabel ("OPAQUE"));
  33.       getRootPane ().setDoubleBuffered (false);
  34.       pack ();
  35.       setVisible (true);
  36.    }
  37.    public static void main (String [] args)
  38.    {
  39.       Runnable r;
  40.       r = new Runnable ()
  41.           {
  42.               public void run ()
  43.               {
  44.                  GraphicsEnvironment ge;
  45.                  ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
  46.                  if (!ge.getDefaultScreenDevice ().
  47.                          isWindowTranslucencySupported
  48.                            (GraphicsDevice.WindowTranslucency.
  49.                                            TRANSLUCENT))
  50.                  {
  51.                      System.err.println ("simple translucency isn't "+
  52.                                          "supported");
  53.                      return;
  54.                  }
  55.                  new STDemo ();
  56.               }
  57.           };
  58.       EventQueue.invokeLater (r);
  59.    }
  60. }

上面的代碼創(chuàng)建了一個滑塊,為該組件注冊了一個變化監(jiān)聽器,當(dāng)滑塊組件移動時,這個組件觸發(fā)變化事件,監(jiān)聽器調(diào)用setOpacity(),參數(shù)就使用滑塊的當(dāng)前值。

上面的代碼使用new JPanel () {{ add (slider); }}創(chuàng)建了一個Swing面板,并在面板上添加了一個滑塊組件,從本質(zhì)上講,這個快捷方式是先實(shí)例化JPanel的一個子類,然后用這個子類的實(shí)例初始化滑塊組件。

Swing組件的雙倍緩存可以制造出意想不到的視覺效果,當(dāng)你拖動滑塊使窗口完全透明時,你將只能看到滑塊本身,但清單1中的代碼通過getRootPane ().setDoubleBuffered (false);禁用了雙倍緩存。

編譯并運(yùn)行STDemo,移動滑塊就能看到簡單半透明窗口效果了,如圖1所示。

圖 1 窗口及其內(nèi)容全部處于均勻透明的狀態(tài)

#p#

像素級半透明窗口

像素級半透明允許你控制窗口中每個像素的不透明度,這樣就可以營造出窗口的一部分比另一部分更透明的效果,雖然像素級半透明也可以實(shí)現(xiàn)窗口透明度均勻,但與簡單半透明方法比起來,它更占資源。

JDK 7通過修改Window的public void setBackground(Color bgColor)方法,檢查參數(shù)的alpha部分提供像素級半透明效果的支持,如果alpha不等于1.0(窗口不透明),在窗口上繪制每個像素時將會使用alpha值。

真實(shí)的半透明級別

繪制像素時使用的真實(shí)半透明值也依賴于傳遞給Window的setOpacity()方法的值,以及Window的當(dāng)前形狀。

如果窗口處于全屏模式且背景色的alpha值小于1.0,這個方法將會拋出IllegalComponentStateException異常,如果不支持像素級半透明且alpha值小于1.0,將會拋出UnsupportedOperationException異常。

為了避免后一個異常,調(diào)用GraphicsDevice's isWindowTranslucencySupported()方法時,參數(shù)必須使用GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT,并檢查返回的值,如下所示:

 
 
 
 
  1. GraphicsEnvironment ge;
  2. ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
  3. if (!ge.getDefaultScreenDevice ().
  4.         isWindowTranslucencySupported (GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT))
  5. {
  6.     System.err.println ("per-pixel translucency isn't supported");
  7.     return;
  8. }

另外,確定窗口本身是否支持像素級半透明效果也很重要,可調(diào)用java.awt.GraphicsConfiguration's public Boolean isTranslucencyCapable()方法來判斷,如果支持的話,這個方法返回Ture,如下所示:

 
 
 
 
  1. / The following code fragment continues from the previous code fragment, but assumes that 
  2. // the current class is a descendent of java.awt.Window.
  3. if (!getGraphicsConfiguration ().isTranslucencyCapable ())
  4. {
  5.     System.err.println ("per-pixel translucency not in effect for this graphics configuration");
  6.     System.exit (0);
  7. }

如果你想確定當(dāng)前背景色的alpha,可調(diào)用Window的public Color getBackground()方法,你也可以調(diào)用新的public boolean isOpaque()方法確定窗口當(dāng)前是否是不透明的(返回True)。

我創(chuàng)建了一個PPTDemo程序演示像素級半透明窗口,清單2顯示了它的代碼,因?yàn)檫@個窗口是未加裝飾的,你需要點(diǎn)擊它的關(guān)閉按鈕來終止它。

清單2. PPTDemo.java

 
 
 
 
  1. // PPTDemo.java
  2. import java.awt.Color;
  3. import java.awt.Dimension;
  4. import java.awt.EventQueue;
  5. import java.awt.GradientPaint;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.GraphicsDevice;
  9. import java.awt.GraphicsEnvironment;
  10. import java.awt.event.ActionEvent;
  11. import java.awt.event.ActionListener;
  12. import javax.swing.Box;
  13. import javax.swing.BoxLayout;
  14. import javax.swing.JButton;
  15. import javax.swing.JFrame;
  16. import javax.swing.JPanel;
  17. public class PPTDemo extends JFrame
  18. {
  19.    public PPTDemo ()
  20.    {
  21.       super ("Per-Pixel Translucency Demo");
  22.       JPanel gradPanel = new JPanel ()
  23.                          {
  24.                              // Transparent red
  25.                              Color colorA = new Color (255, 0, 0, 0);
  26.                              // Solid red
  27.                              Color colorB = new Color (255, 0, 0, 255);
  28.                              protected void paintComponent (Graphics g)
  29.                              {
  30.                                  Graphics2D g2d = (Graphics2D) g;
  31.                                  GradientPaint gp;
  32.                                  gp = new GradientPaint (0.0f, 0.0f, colorA,
  33.                                                          0.0f, getHeight (),
  34.                                                          colorB, true);
  35.                                  g2d.setPaint (gp);
  36.                                  g2d.fillRect (0, 0, getWidth (),
  37.                                                getHeight ());
  38.                                  
  39.                              }
  40.                          };
  41.       gradPanel.setPreferredSize (new Dimension (300, 200));
  42.       gradPanel.setLayout (new BoxLayout (gradPanel, BoxLayout.Y_AXIS));
  43.       JButton btnClose = new JButton ("Close");
  44.       ActionListener al;
  45.       al = new ActionListener ()
  46.            {
  47.                public void actionPerformed (ActionEvent ae)
  48.                {
  49.                   System.exit (0);
  50.                }
  51.            };
  52.       btnClose.addActionListener (al);
  53.       btnClose.setAlignmentX (0.5f);
  54.       gradPanel.add (Box.createVerticalGlue ());
  55.       gradPanel.add (btnClose);
  56.       gradPanel.add (Box.createVerticalGlue ());
  57.       setContentPane (gradPanel);
  58.       if (!getGraphicsConfiguration ().isTranslucencyCapable ())
  59.       {
  60.           System.err.println ("per-pixel translucency not in effect for "+
  61.                               "this graphics configuration");
  62.           System.exit (0);
  63.       }
  64.       setBackground (new Color (0, 0, 0, 0)); // Achieve per-pixel
  65.                                               // translucency.
  66.       pack ();
  67.       setLocationRelativeTo (null);
  68.       setVisible (true);
  69.    }
  70.    public static void main (String [] args)
  71.    {
  72.       Runnable r;
  73.       r = new Runnable ()
  74.           {
  75.               public void run ()
  76.               {
  77.                  GraphicsEnvironment ge;
  78.                  ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
  79.                  if (!ge.getDefaultScreenDevice ().
  80.                          isWindowTranslucencySupported
  81.                            (GraphicsDevice.WindowTranslucency.
  82.                                            PERPIXEL_TRANSLUCENT))
  83.                  {
  84.                      System.err.println ("per-pixel translucency isn't "+
  85.                                          "supported");
  86.                      return;
  87.                  }
  88.                  new PPTDemo ();
  89.               }
  90.           };
  91.       EventQueue.invokeLater (r);
  92.    }
  93. }

上面的代碼顯示了用JPanel類創(chuàng)建了兩個java.awt.Color對象,alpha值為0時透明,為255時不透明,它的paintComponent()方法和java.awt.GradientPaint一起給面板的表面涂上了一層梯度式alpha值。

后面的代碼將這個面板作為框架窗口的內(nèi)容面板,并驗(yàn)證窗口的圖形配置是否支持像素級半透明,最后調(diào)用setBackground()方法開啟像素級半透明窗口效果。

調(diào)整窗口的大小后,清單2中的代碼調(diào)用setLocationRelativeTo(null)讓面板在屏幕上居中,接著調(diào)用setVisible(true)方法控制面板的半透明顯示:上方透明,下方不透明,中間半透明,如圖2所示。

圖 2 從上到下,透明度不斷減小

#p#

像素級透明和任意形狀的窗口

像素級透明和像素級半透明類似,這種半透明模式主要用于任意形狀窗口中的內(nèi)容。

任意形狀窗口是未加裝飾的窗口,其外觀與特定幾何形狀一致(如圓,圓角矩形等),形狀外的像素是透明的,在這些像素上點(diǎn)擊才顯示背景。

JDK 7通過向Window增加public void setShape(Shape shape)和public Shape getShape()方法支持像素級透明和任意形狀的窗口,向前一個方法傳遞一個java.awt.Shape實(shí)例給當(dāng)前窗口指定一個形狀。

如果窗口處于全屏模式且傳遞來一個非空形狀時,setShape()方法會拋出IllegalComponentStateException異常,如果不支持像素級透明且傳遞來一個非空形狀時,拋出UnsupportedOperationException異常。

為了避免后一個異常,調(diào)用GraphicsDevice's isWindowTranslucencySupported()方法時,參數(shù)必須使用raphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT,并檢查返回的值,如下所示:

 
 
 
 
  1. GraphicsEnvironment ge;
  2. ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
  3. if (!ge.getDefaultScreenDevice ().
  4.         isWindowTranslucencySupported (GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT))
  5. {
  6.     System.err.println ("per-pixel transparency isn't supported");
  7.     return;
  8. }

我創(chuàng)建了一個PPTSWDemo程序演示像素級透明和任意形狀的窗口,我們將清單2中顯示出來的圓角矩形改成橢圓形狀,清單3顯示了這個程序的源代碼。

清單3. PPTSWDemo.java

 
 
 
 
  1. // PPTSWDemo.java
  2. import java.awt.Color;
  3. import java.awt.Dimension;
  4. import java.awt.EventQueue;
  5. import java.awt.GradientPaint;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.GraphicsDevice;
  9. import java.awt.GraphicsEnvironment;
  10. import java.awt.Shape;
  11. import java.awt.event.ActionEvent;
  12. import java.awt.event.ActionListener;
  13. import java.awt.geom.Ellipse2D;
  14. import javax.swing.Box;
  15. import javax.swing.BoxLayout;
  16. import javax.swing.JButton;
  17. import javax.swing.JFrame;
  18. import javax.swing.JPanel;
  19. public class PPTSWDemo extends JFrame
  20. {
  21.    public PPTSWDemo ()
  22.    {
  23.       super ("Per-Pixel Transparency and Shaped Window Demo");
  24.       setUndecorated (true); // Avoid decorated window artifacts.
  25.       JPanel gradPanel = new JPanel ()
  26.                          {
  27.                              // Solid white
  28.                              Color colorA = new Color (255, 255, 255);
  29.                              // Solid red
  30.                              Color colorB = new Color (255, 0, 0);
  31.                              protected void paintComponent (Graphics g)
  32.                              {
  33.                                  Graphics2D g2d = (Graphics2D) g;
  34.                                  GradientPaint gp;
  35.                                  gp = new GradientPaint (0.0f, 0.0f, colorA,
  36.                                                          0.0f, getHeight (),
  37.                                                          colorB, true);
  38.                                  g2d.setPaint (gp);
  39.                                  g2d.fillRect (0, 0, getWidth (),
  40.                                                getHeight ());
  41.                                  
  42.                              }
  43.                          };
  44.       gradPanel.setPreferredSize (new Dimension (300, 200));
  45.       gradPanel.setLayout (new BoxLayout (gradPanel, BoxLayout.Y_AXIS));
  46.       JButton btnClose = new JButton ("Close");
  47.       ActionListener al;
  48.       al = new ActionListener ()
  49.            {
  50.                public void actionPerformed (ActionEvent ae)
  51.                {
  52.                   System.exit (0);
  53.                }
  54.            };
  55.       btnClose.addActionListener (al);
  56.       btnClose.setAlignmentX (0.5f);
  57.       gradPanel.add (Box.createVerticalGlue ());
  58.       gradPanel.add (btnClose);
  59.       gradPanel.add (Box.createVerticalGlue ());
  60.       setContentPane (gradPanel);
  61.       pack ();
  62.       setShape (new Ellipse2D.Float (0, 0, getWidth (), getHeight ()));
  63.       setLocationRelativeTo (null);
  64.       setVisible (true);
  65.    }
  66.    public static void main (String [] args)
  67.    {
  68.       Runnable r;
  69.       r = new Runnable ()
  70.           {
  71.               public void run ()
  72.               {
  73.                  GraphicsEnvironment ge;
  74.                  ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
  75.                  if (!ge.getDefaultScreenDevice ().
  76.                          isWindowTranslucencySupported
  77.                            (GraphicsDevice.WindowTranslucency.
  78.                                            PERPIXEL_TRANSPARENT))
  79.                  {
  80.                      System.err.println ("per-pixel transparency isn't "+
  81.                                          "supported");
  82.                      return;
  83.                  }
  84.                  new PPTSWDemo ();
  85.               }
  86.           };
  87.       EventQueue.invokeLater (r);
  88.    }
  89. }

在驗(yàn)證了支持像素級透明后,清單3執(zhí)行setShape (new Ellipse2D.Float (0, 0, getWidth (), getHeight ()));將框架窗口改成橢圓形,效果如圖3所示。

圖 3 梯度式透明現(xiàn)在限制在橢圓范圍內(nèi)

遺憾的是,任意形狀窗口的邊緣有鋸齒,也許等到JDK 7正式發(fā)布,使用像素級半透明和抗鋸齒功能可以解決掉這個問題。

#p#

半透明聯(lián)合像素級透明和任意形狀窗口

你可以聯(lián)合像素級半透明(或簡單半透明)和像素級透明實(shí)現(xiàn)一個半透明的任意形狀窗口,我創(chuàng)建了一個CTSWDemo程序演示這是可能的,清單4中的代碼擴(kuò)展了前面的例子,包括了像素級半透明代碼。

清單 4. CTSWDemo.java

 
 
 
 
  1. // CTSWDemo.java
  2. import java.awt.Color;
  3. import java.awt.Dimension;
  4. import java.awt.EventQueue;
  5. import java.awt.GradientPaint;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.GraphicsDevice;
  9. import java.awt.GraphicsEnvironment;
  10. import java.awt.Shape;
  11. import java.awt.event.ActionEvent;
  12. import java.awt.event.ActionListener;
  13. import java.awt.geom.Ellipse2D;
  14. import javax.swing.Box;
  15. import javax.swing.BoxLayout;
  16. import javax.swing.JButton;
  17. import javax.swing.JFrame;
  18. import javax.swing.JPanel;
  19. public class CTSWDemo extends JFrame
  20. {
  21.    public CTSWDemo ()
  22.    {
  23.       super ("Combined Translucency with Per-Pixel Transparency and Shaped "+
  24.              "Window Demo");
  25.       setUndecorated (true); // Avoid decorated window artifacts.
  26.       JPanel gradPanel = new JPanel ()
  27.                          {
  28.                              Color colorA = new Color (255, 0, 0, 0);
  29.                              Color colorB = new Color (255, 0, 0, 255);
  30.                              protected void paintComponent (Graphics g)
  31.                              {
  32.                                  Graphics2D g2d = (Graphics2D) g;
  33.                                  GradientPaint gp;
  34.                                  gp = new GradientPaint (0.0f, 0.0f, colorA,
  35.                                                          0.0f, getHeight (),
  36.                                                          colorB, true);
  37.                                  g2d.setPaint (gp);
  38.                                  g2d.fillRect (0, 0, getWidth (),
  39.                                                getHeight ());
  40.                                  
  41.                              }
  42.                          };
  43.       gradPanel.setPreferredSize (new Dimension (300, 200));
  44.       gradPanel.setLayout (new BoxLayout (gradPanel, BoxLayout.Y_AXIS));
  45.       JButton btnClose = new JButton ("Close");
  46.       ActionListener al;
  47.       al = new ActionListener ()
  48.            {
  49.                public void actionPerformed (ActionEvent ae)
  50.                {
  51.                   System.exit (0);
  52.                }
  53.            };
  54.       btnClose.addActionListener (al);
  55.       btnClose.setAlignmentX (0.5f);
  56.       gradPanel.add (Box.createVerticalGlue ());
  57.       gradPanel.add (btnClose);
  58.       gradPanel.add (Box.createVerticalGlue ());
  59.       setContentPane (gradPanel);
  60.       if (!getGraphicsConfiguration ().isTranslucencyCapable ())
  61.       {
  62.           System.err.println ("per-pixel translucency not in effect for this "+
  63.                               "graphics configuration");
  64.           System.exit (0);
  65.       }
  66.       setBackground (new Color (0, 0, 0, 0)); // Achieve per-pixel
  67.                                               // translucency.
  68.       pack ();
  69.       setShape (new Ellipse2D.Float (0, 0, getWidth (), getHeight ()));
  70.       setLocationRelativeTo (null);
  71.       setVisible (true);
  72.    }
  73.    public static void main (String [] args)
  74.    {
  75.       Runnable r;
  76.       r = new Runnable ()
  77.           {
  78.               public void run ()
  79.               {
  80.                  GraphicsEnvironment ge;
  81.                  ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();
  82.                  if (!ge.getDefaultScreenDevice ().
  83.                          isWindowTranslucencySupported
  84.                            (GraphicsDevice.WindowTranslucency.
  85.                                            PERPIXEL_TRANSLUCENT))
  86.                  {
  87.                      System.err.println ("per-pixel translucency isn't "+
  88.                                          "supported");
  89.                      return;
  90.                  }
  91.                  if (!ge.getDefaultScreenDevice ().
  92.                          isWindowTranslucencySupported
  93.                            (GraphicsDevice.WindowTranslucency.
  94.                                            PERPIXEL_TRANSPARENT))
  95.                  {
  96.                      System.err.println ("per-pixel transparency isn't "+
  97.                                          "supported");
  98.    &nb
    當(dāng)前名稱:探秘JDK7之二:半透明和任意形狀的窗口
    文章分享:http://www.5511xx.com/article/cceeoep.html