Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 22 kết quả

Đề tài: GlassApp - Aero nguyên form giống Vista trên XP...

  1. #1
    Ngày gia nhập
    01 2008
    Bài viết
    18

    Thumbs up GlassApp - Aero nguyên form giống Vista trên XP...

    GlassApp - Aero nguyên form giống Vista trên XP...





    Đây là project khá hay do mình nghiên cứu, nay chia sẻ cho các bác.

    Điểm nổi bật:
    + Aero nguyên form (như hình)
    + Vẽ được trên phần aero mà hình vẽ kô mờ đi (không giống set opacity của form)
    + Các control cũng kô mờ đi (vì để ở form khác, hem hiểu sao để control lên form aero nó kô xuất hiện)
    + Có phần text glow đằng sau phần chữ (giống vista, như hình)
    + Di chuyển form kô giựt (Ram: 256 CPU: 1.8GHz)

    Điểm khác:
    + Còn một đống lỗi (hehe, dzậy mới post zô đây chứ kô post bên box sản phẩm rùi)
    + Không kéo form bự ra nhỏ zô đc
    + Nếu form mặc định bự wá thì cái form sẽ bị xấu (wé xấu)
    + Hem có nút minimize, maximize
    + Form luôn ontop
    + Cái nút close (><) lúc nằm chỗ này lúc nằm chỗ kia
    + Mấy cái file hình đi kèm hơi bị nặng (1Mb)

    Xem sơ cũng thấy khuyết nhiều hơn ưu, mà cái project này tui cũng tham khảo hơi bị nhiều (sẽ nói trong phần tham khảo), nhưng cũng mạo muội post lên đây mong các bác xem qua, cho nhận xét nếu đc thì sửa mấy cái "Điểm khác" giùm em.

    Trong source hem có chú thích (viết cách đây mấy năm), nên giờ sẽ chú giải trong đây...

    _Giải thích sơ sơ về nguyên tắc hoạt động:
    + Có 2 form: form 1 làm aero form 2 chứa các control
    + Form 1 topmost, form 2 cũng topmost nhưng làm topmost sau form 1
    + Form 1 thực chất là classlibrary nên khi làm form 2 thì attach cái glasslibrary vào rùi call hàm setFormMain, nếu cần thêm textglow thì call addTextGlow
    + Rùi cho form 1 show
    + Nếu cần vẽ lên form 1 thì áp dụng ePaint (sẽ giải thích sau)

  2. #2
    Ngày gia nhập
    01 2008
    Bài viết
    18

    _Giải thích chi tiết:
    _Các hàm window và các biến cần thiết đều đc declare trong class Win32:
    + Một số hàm chính tạo nên aero cho form 1 :
    Visual C# Code:
    1.         public struct BLENDFUNCTION
    2.         {
    3.             public byte BlendOp;
    4.             public byte BlendFlags;
    5.             public byte SourceConstantAlpha;
    6.             public byte AlphaFormat;       
    7.         }
    8.        
    9.         public const int ULW_COLORKEY = 1;
    10.         public const int ULW_ALPHA = 2;
    11.         public const int ULW_OPAQUE = 4;
    12.         public const byte AC_SRC_OVER = 0;
    13.         public const byte AC_SRC_ALPHA = 1;
    14.        
    15.         [DllImport("user32.dll")]
    16.         public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, int crKey, ref BLENDFUNCTION pblend, int dwFlags);
    17.         [DllImport("user32.dll")]
    18.         public static extern IntPtr GetDC(IntPtr hWnd);
    19.         [DllImport("user32.dll")]
    20.         public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
    21.         [DllImport("gdi32.dll")]
    22.         public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
    23.         [DllImport("gdi32.dll")]
    24.         public static extern bool DeleteDC(IntPtr hdc);
    25.         [DllImport("gdi32.dll")]
    26.         public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
    27.         [DllImport("gdi32.dll")]
    28.         public static extern bool DeleteObject(IntPtr hObject);

    _Các hằng số quan trọng:
    Visual C# Code:
    1.     protected const int cst_frmExtraHeight = 50; //Phần thêm vào bên trên của form để draw icon và title
    2.     protected const int cst_iconSize = 50;
    3.        
    4.     public const int cst_imgWidth = 284;           //Width và Height của image glassform.png
    5.     public const int cst_imgHeight = 249;
    6.     public const int cst_frmWidth = 248;            //Width và Height của form thực trong hình không kể shadow
    7.     public const int cst_frmHeight = 213;
    8.     public const int cst_lFrm = 12;         //left, right, top, bottom của form thực trong hình
    9.     public const int cst_rFrm = 24;
    10.     public const int cst_tFrm = 12;
    11.     public const int cst_bFrm = 24;
    12.     public const int cst_xBtnX = -44-5;         //Position của close button
    13.     public const int cst_xBtnY = -5;

    _Các biến quan trọng:
    Visual C# Code:
    1.     public int frmWidth; //The size of window with extra height
    2.     public int frmHeight; //The size of window with extra height
    3.     public int clientWidth; //The size of window without extra height
    4.     public int clientHeight; //The size of window without extra height
    5.     public int clientX; //Distance between this.Left and form.left
    6.     public int clientY; ////Distance between this.Top and form.top
    7.        
    8.     protected Bitmap bitmap;    //bitmap chứa hình ảnh của form 1
    9.     protected Graphics g;
    10.        
    11.     public delegate void dPaint(Graphics g);    //Delegate & Event của hàm cần vẽ thêm trên form 1
    12.     public event dPaint ePaint;                 //
    13.        
    14.     protected int posButtonX = 0;           //Position của image closebutton (có 3 hình closebutton trong file image)
    15.     protected Rectangle recButtonX;
    16.     protected bool moveOutButtonX = true;   //Chuột có ở trong closebutton kô để thay đổi hình closebutton
    17.        
    18.     protected Form f;               //Form 2
    19.     protected int arrRecNext = 0;           //Số lượng textglow
    20.     protected Rectangle[] arrRec = new Rectangle[100];  //rec của các textglow (add vào bằng addTextGlow)

    _Hàm calculate(int formHeight): hàm này là rối nhất trong project, mình viết lâu rùi nên giờ quên, để khi nào nhớ lại thì post chú thích lên

    Visual C# Code:
    1.    public void calculate(int formHeight)
    2.    {
    3.    //Modify the form
    4.    //this.Height = formHeight + cst_frmExtraHeight; //Increase the form height to draw icon and title
    5.        
    6.    //Caculate
    7.    frmWidth = this.Width - (int)(this.Width*cst_lFrm/cst_frmWidth) - (int)(this.Width*cst_rFrm/cst_frmWidth);
    8.    frmHeight = this.Height - (int)(this.Height*cst_tFrm/cst_frmHeight) - (int)(this.Height*cst_bFrm/cst_frmHeight);
    9.                
    10.    clientWidth = frmWidth;
    11.    clientHeight = frmHeight - cst_frmExtraHeight;
    12.                
    13.    clientX = (int)(this.Width*cst_lFrm/cst_frmWidth);
    14.    clientY = (this.Height*cst_tFrm/cst_frmHeight) + cst_frmExtraHeight;
    15.    }

    _Hàm addTextGlow(int x,int y,int width,int height) : x, y, width, height của control
    addTextGlow(Form frm,Control ctrl) : thường xài cái này, chừng nào kô được kết quả mong muốn thì xài cái trên

    Visual C# Code:
    1. public void addTextGlow(int x,int y,int width,int height)
    2. {
    3. arrRec[arrRecNext] = new Rectangle(x,y,width,height);
    4.            
    5. arrRecNext += 1;
    6. }
    7. public void addTextGlow(Form frm,Control ctrl)
    8. {
    9. arrRec[arrRecNext] = new Rectangle(ctrl.Left - frm.Left,ctrl.Top - frm.Top,ctrl.Width,ctrl.Height);
    10.            
    11. arrRecNext += 1;
    12. }

    _Hàm setFormMain(Form frm): hàm này cũng rối nốt, nhưng đại khái là attach cái form 2 vào rùi tính tóan khoảng cách, width height của form 1 sao cho form 1 bao quát hết form 2
    Visual C# Code:
    1. public void setFormMain(Form frm)
    2. {          
    3. this.Width = frm.Width + (int)(frm.Width*cst_lFrm/cst_frmWidth) + (int)(frm.Width*cst_rFrm/cst_frmWidth);
    4. frm.Height += cst_frmExtraHeight; //Increase the form height to draw icon and title
    5. this.Height = frm.Height + (int)(frm.Height*cst_tFrm/cst_frmHeight) + (int)(frm.Height*cst_bFrm/cst_frmHeight);
    6. frm.Height -= cst_frmExtraHeight;
    7.            
    8. //Calculate
    9. calculate(this.Height);
    10.            
    11. this.TopMost = true;
    12.            
    13. f = frm;
    14. f.TopMost = true;
    15.            
    16. this.Show();
    17. f.Show();
    18.            
    19. this.frmGlass_onMouseDown(this,new MouseEventArgs(MouseButtons.Left,1,clientX,clientY,0));
    20.            
    21. beginPaint();
    22.     drawFrm();
    23.     if (ePaint != null)
    24.         ePaint(g);
    25.     applyTrans();
    26. endPaint();
    27.            
    28. f.Left = this.Left + (int)(this.Width*cst_lFrm/cst_imgWidth);
    29. f.Top = this.Top + (int)(this.Height*cst_tFrm/cst_imgHeight) + cst_frmExtraHeight;
    30. }

    _Hàm beginPaint và endPaint: như đã giới thiệu ở trên
    Visual C# Code:
    1. public virtual void beginPaint()
    2. {          
    3.     bitmap = new Bitmap(frmWidth,frmHeight);
    4.        
    5.     g = Graphics.FromImage(bitmap);
    6.     g.SmoothingMode = SmoothingMode.AntiAlias;
    7. }
    8. public virtual void endPaint()
    9. {
    10.     g.Dispose();
    11.     bitmap.Dispose();
    12. }

    _Hàm drawForm: hàm này khá dễ hiểu, đại khái là vẽ cái form, closebutton, title, mấy cái textglow lên
    Visual C# Code:
    1. public virtual void drawFrm()
    2. {
    3.     if (bitmap == null || g == null)
    4.         return;
    5.  
    6.     g.DrawImage(new Bitmap("GlassFormImages\\GlassForm.png"),this.ClientRectangle);
    7.     //g.DrawLine(new Pen(Color.Black),clientX,clientY,clientX + clientWidth,clientY + clientHeight);
    8.     //g.DrawLine(new Pen(Color.Red),this.Left,this.Left,this.Left + frmWidth,this.Left + frmHeight);
    9.                        
    10.     g.DrawImage(new Bitmap("GlassFormImages\\TextGlow.png"),
    11.                  new Rectangle(25,20,clientWidth - (int)(clientWidth*30/100),25));
    12.     string title = this.Text;
    13.     if (f != null)
    14.         title = f.Text;
    15.     g.DrawString(title,
    16.                  new Font(FontFamily.GenericSansSerif,12,FontStyle.Bold,GraphicsUnit.Pixel),
    17.                  new SolidBrush(Color.Black),new Point(30+20,20+5));
    18.            
    19.     g.DrawImage(new Bitmap("GlassFormImages\\Icon.png"),0,0,cst_iconSize,cst_iconSize);
    20.            
    21.     recButtonX = new Rectangle((clientX + clientWidth) + cst_xBtnX,(int)( frmHeight - clientHeight + cst_xBtnY),44,18);
    22.     if (posButtonX == 0)
    23.         g.DrawImage(new Bitmap("GlassFormImages\\CloseButton.png"),
    24.                     recButtonX,
    25.                     posButtonX,0,44,18,GraphicsUnit.Pixel);
    26.            
    27.     //Draw TextGlow
    28.     if (arrRecNext == 0)
    29.         return;
    30.            
    31.     for (int i = 0; i != arrRecNext; i++)
    32.     {
    33.         g.DrawImage(new Bitmap("GlassFormImages\\TextGlow.png"),
    34.                         new Rectangle(clientX + arrRec[i].X -25,clientY + arrRec[i].Y -10,
    35.                                  arrRec[i].Width +40,arrRec[i].Height +20));
    36.     }
    37. }

    _Hàm applyTrans: hàm quyết định aero, hơi khó hiểu, xem thêm phần tham khảo để hiểu rõ, và phải call hàm này sau khi drawForm(). Ex:
    Visual C# Code:
    1.     beginPaint();
    2.         drawFrm();
    3.         if (ePaint != null)  //Call các hàm vẽ lên form 1 (cái này do form 2 làm)
    4.             ePaint(g);
    5.         applyTrans();
    6.     endPaint();

    Visual C# Code:
    1. public virtual void applyTrans()
    2. {      
    3.     if (bitmap == null)
    4.         return;
    5.            
    6.     IntPtr dcScreen = Win32.GetDC(IntPtr.Zero);
    7.     IntPtr dcMem = Win32.CreateCompatibleDC(dcScreen);
    8.     IntPtr hBmp = IntPtr.Zero;
    9.     IntPtr oldBmp = IntPtr.Zero;
    10.                        
    11.     try
    12.     {
    13.         hBmp = bitmap.GetHbitmap(Color.FromArgb(0));
    14.         oldBmp = Win32.SelectObject(dcMem,hBmp);
    15.                
    16.         Win32.Size size = new Win32.Size(bitmap.Width,bitmap.Height);
    17.         Win32.Point pSource = new Win32.Point(0,0);
    18.         Win32.Point pTop = new Win32.Point(this.Left,this.Top);
    19.                
    20.         Win32.BLENDFUNCTION blendF = new Win32.BLENDFUNCTION();
    21.         blendF.BlendOp = Win32.AC_SRC_OVER;
    22.         blendF.BlendFlags = 0;
    23.         blendF.SourceConstantAlpha = 255;
    24.         blendF.AlphaFormat = Win32.AC_SRC_ALPHA;
    25.                
    26.         Win32.UpdateLayeredWindow(Handle,dcScreen,ref pTop,ref size,dcMem,ref pSource,0,ref blendF,Win32.ULW_ALPHA);
    27.     }
    28.     finally
    29.     {
    30.         Win32.ReleaseDC(IntPtr.Zero,dcScreen);
    31.            
    32.         if (!(hBmp.Equals(IntPtr.Zero)))
    33.         {
    34.             Win32.SelectObject(dcMem,oldBmp);
    35.             Win32.DeleteObject(hBmp);
    36.         }
    37.                
    38.         Win32.DeleteDC(dcMem);
    39.     }
    40. }

    _Example về ePaint (nơi vẽ lên form 1)
    Ví dụ trong form 2 muốn vẽ thêm một đường thẳng vào form 1 thì:
    Visual C# Code:
    1. glassF.ePaint += new GlassApp.dPaint(exPaint);
    2.  
    3. void exPaint(Graphics g)
    4. {
    5.     g.DrawLine(...);
    6. }

    Những cái còn lại khá dễ hiểu, nếu có thắc mắc thì các bác cứ nêu lên


    +++Tham khảo:
    + Per Pixel Alpha Blend in C# : http://www.codeproject.com/KB/GDI-pl...pha_sharp.aspx
    Đã được chỉnh sửa lần cuối bởi vpdp_pc : 19-01-2008 lúc 06:48 AM. Lý do: Sửa lại link down

  3. #3
    Ngày gia nhập
    01 2008
    Bài viết
    18

    Mấy cái này xem ra cũng hơi rối, nhưng cũng mong các bác góp ý, nhận xét. Sau này em sẽ nghiên cứu thêm, chú thích đầy đủ rùi wăng wa box sản phẩm luôn (Dạo này đang bận)..

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Bận 1 số việc riêng nên chưa có thời gian nhiều để nghiên cứu, cảm ơn bạn đã share code, cái này mình cũng muốn tìm hiểu vì mình kém về đồ họa lắm.

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Cái này ko biết đã có bao nhiêu người làm rồi. Có một sự thật đau lòng là các dạng này đều chỉ để ... chưng xem chơi, đừng mong ứng dụng được vào cái gì.
    Keep moving forward!

    ... Retired ...

  6. #6
    Ngày gia nhập
    01 2008
    Bài viết
    18

    Mặc định GlassApp - Aero nguyên form giống Vista trên XP...

    Trích dẫn Nguyên bản được gửi bởi nhc1987 Xem bài viết
    Cái này ko biết đã có bao nhiêu người làm rồi. Có một sự thật đau lòng là các dạng này đều chỉ để ... chưng xem chơi, đừng mong ứng dụng được vào cái gì.
    Cũng không thể nói trước được, tại project này mình viết khá lâu rồi, để khi nào rảnh thì sửa sang lại cho đàng hoàng rùi ứng dụng vào mấy cái project khác của mình cho đẹp hơn (như cái hình 2)... Mà nếu không ứng dụng được thì ít ra cũng có cái đáng xem trong project (ít là đối với người mới)

    Đã được chỉnh sửa lần cuối bởi vpdp_pc : 19-01-2008 lúc 05:28 AM.

  7. #7
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Thực ra Dr thấy cái này rất hay đó. Tuy là nó có phần khó ứng dụng nhưng mà theo Dr thì nó thực sự là không phải không ứng dụng được. Sử dụng được hay không còn phụ thuộc vào người sử dụng nó nữa.

    Dr thấy hay, và ủng hộ các bạn phát triển nó lên. Về C# hiện nay Dr đang nghiên cứu, với lại cũng quá bận rộn. Nhưng nếu có thể Dr sẽ tham khảo và cùng mọi người phát triển thành cái gì đó có ích hơn.

    Dr đã em mấy đề tài của bạn, rất có ích. Dr xin cảm ơn bạn đã chia sẻ, nếu ai cũng có thể chia sẻ được như bạn và thường xuyên thì rất tốt đó. (Chỉ khi không sợ người khác chê, chỉ khi bạn thích, bạn mới có thể chia sẻ nó cho mọi người được)
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  8. #8
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Cái này đúng là hay thật vì tui đã từng mất cả tháng để tìm hiểu cách làm ra nó ... nào là codeproject, codegure, clbvb, ... và khi tìm được cách làm rồi thì lại thất vọng. Nó hoàn toàn ko ứng dụng được.

    Thứ nhất, ngốn RAM kinh khủng. Chỉ chạy một cái form nhỏ xíu khoảng 300x200 mà đã mất gần 50MB. Bạn thử chạy vài cái thì thế nào ?

    Thứ hai, làm chương trình chạy chậm kinh khủng. Ngay cả minimize, maximize ko dám enable vì... treo máy. Không tin thì bạn xài thử thì biết.

    Thứ ba, thực tế thì nó ko đẹp. Bạn thử minimize, maximize form mà xem, nó rung lên dữ dội, ý là mới chỉ có form trống, nếu có thêm control bên trong thì ko biết sẽ như thế nào.

    Tuy nhiên, kĩ thuật để làm nó thì rất đáng để nghiên cứu.
    Keep moving forward!

    ... Retired ...

  9. #9
    Ngày gia nhập
    01 2008
    Bài viết
    18

    Cũng không hẳn là tốn RAM:



    Mỗi cái chạy chỉ tốn 12-14 mb, lúc mình mở lên 5 cái thì tổng RAM 5 cái chiếm cũng chỉ có 58-60 mb.

    Mình không biết bạn nhc làm thế nào mà tốn RAM dữ vậy, nếu được bạn có thể post project bạn đã làm lên đây để mình tham khảo

    Còn nữa, mình có xem qua một project giống của mình nhưng viết trên C++ xài MFC, cái này tốn có 6mb RAM khi chạy (Người viết cái này cũng pro thiệt, cái này mà làm trên C++ thì mình chịu)

    VistaDlg: http://www.box.net/shared /39nlr0pkws (Chỉ có file exe, nguyên project của nó hơi bị lớn)
    Đã được chỉnh sửa lần cuối bởi vpdp_pc : 19-01-2008 lúc 01:35 PM. Lý do: Thêm link

  10. #10
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    nhc làm gì có đủ trình độ để code mấy cái này !

    Chỉ là tìm được trên mạng thôi. Tiếc là tui xóa hết rồi.

    P/s: nếu bạn nói sơ qua cách làm (ko code) cho mọi người hiểu thì tốt quá.
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 19-01-2008 lúc 01:32 PM.
    Keep moving forward!

    ... Retired ...

Các đề tài tương tự

  1. Sử dụng màu trên winxp, sang vista thi bị đổi mau khác
    Gửi bởi hoicuibap trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 02-11-2011, 09:19 AM
  2. Lập trình C trên vista. Chọn trình biên dịch C nào?
    Gửi bởi neo202 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 22-07-2009, 11:18 AM
  3. Lỗi khi dùng vc++ trên vista
    Gửi bởi neo202 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 15-07-2009, 04:26 PM
  4. Hiển thị mảng nguyên trên form
    Gửi bởi cobehaudau trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 30-03-2009, 12:20 AM
  5. Chạy C Không được trên Vista
    Gửi bởi hackervn trong diễn đàn Thắc mắc chung
    Trả lời: 15
    Bài viết cuối: 22-12-2008, 12:50 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn