Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 12
  1. #1
    Ngày tham gia
    Sep 2015
    Đang ở
    Hà Nội
    Bài viết
    0

    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 tham gia
    Sep 2015
    Bài viết
    0
    _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 :

    Mã:
            public struct BLENDFUNCTION        {            public byte BlendOp;            public byte BlendFlags;            public byte SourceConstantAlpha;            public byte AlphaFormat;                }                public const int ULW_COLORKEY = 1;        public const int ULW_ALPHA = 2;        public const int ULW_OPAQUE = 4;        public const byte AC_SRC_OVER = 0;        public const byte AC_SRC_ALPHA = 1;                [DllImport("user32.dll")]        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);        [DllImport("user32.dll")]        public static extern IntPtr GetDC(IntPtr hWnd);        [DllImport("user32.dll")]        public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);        [DllImport("gdi32.dll")]        public static extern IntPtr CreateCompatibleDC(IntPtr hDC);        [DllImport("gdi32.dll")]        public static extern bool DeleteDC(IntPtr hdc);        [DllImport("gdi32.dll")]        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);        [DllImport("gdi32.dll")]        public static extern bool DeleteObject(IntPtr hObject);
    _Các hằng số quan trọng:

    Mã:
        protected const int cst_frmExtraHeight = 50; //Phần thêm vào bên trên của form để draw icon và title    protected const int cst_iconSize = 50;            public const int cst_imgWidth = 284;           //Width và Height của image glassform.png    public const int cst_imgHeight = 249;    public const int cst_frmWidth = 248;            //Width và Height của form thực trong hình không kể shadow    public const int cst_frmHeight = 213;    public const int cst_lFrm = 12;         //left, right, top, bottom của form thực trong hình    public const int cst_rFrm = 24;    public const int cst_tFrm = 12;    public const int cst_bFrm = 24;    public const int cst_xBtnX = -44-5;         //Position của close button    public const int cst_xBtnY = -5;
    _Các biến quan trọng:

    Mã:
        public int frmWidth; //The size of window with extra height    public int frmHeight; //The size of window with extra height    public int clientWidth; //The size of window without extra height    public int clientHeight; //The size of window without extra height    public int clientX; //Distance between this.Left and form.left    public int clientY; ////Distance between this.Top and form.top            protected Bitmap bitmap;    //bitmap chứa hình ảnh của form 1    protected Graphics g;            public delegate void dPaint(Graphics g);    //Delegate & Event của hàm cần vẽ thêm trên form 1    public event dPaint ePaint;                 //            protected int posButtonX = 0;           //Position của image closebutton (có 3 hình closebutton trong file image)    protected Rectangle recButtonX;    protected bool moveOutButtonX = true;   //Chuột có ở trong closebutton kô để thay đổi hình closebutton            protected Form f;               //Form 2    protected int arrRecNext = 0;           //Số lượng textglow    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


    Mã:
       public void calculate(int formHeight)   {   //Modify the form   //this.Height = formHeight + cst_frmExtraHeight; //Increase the form height to draw icon and title           //Caculate   frmWidth = this.Width - (int)(this.Width*cst_lFrm/cst_frmWidth) - (int)(this.Width*cst_rFrm/cst_frmWidth);   frmHeight = this.Height - (int)(this.Height*cst_tFrm/cst_frmHeight) - (int)(this.Height*cst_bFrm/cst_frmHeight);                   clientWidth = frmWidth;   clientHeight = frmHeight - cst_frmExtraHeight;                   clientX = (int)(this.Width*cst_lFrm/cst_frmWidth);   clientY = (this.Height*cst_tFrm/cst_frmHeight) + cst_frmExtraHeight;   }
    _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


    Mã:
    public void addTextGlow(int x,int y,int width,int height){arrRec[arrRecNext] = new Rectangle(x,y,width,height);            arrRecNext += 1;}public void addTextGlow(Form frm,Control ctrl){arrRec[arrRecNext] = new Rectangle(ctrl.Left - frm.Left,ctrl.Top - frm.Top,ctrl.Width,ctrl.Height);            arrRecNext += 1;}
    _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

    Mã:
    public void setFormMain(Form frm){           this.Width = frm.Width + (int)(frm.Width*cst_lFrm/cst_frmWidth) + (int)(frm.Width*cst_rFrm/cst_frmWidth);frm.Height += cst_frmExtraHeight; //Increase the form height to draw icon and titlethis.Height = frm.Height + (int)(frm.Height*cst_tFrm/cst_frmHeight) + (int)(frm.Height*cst_bFrm/cst_frmHeight);frm.Height -= cst_frmExtraHeight;            //Calculatecalculate(this.Height);            this.TopMost = true;            f = frm;f.TopMost = true;            this.Show();f.Show();            this.frmGlass_onMouseDown(this,new MouseEventArgs(MouseButtons.Left,1,clientX,clientY,0));            beginPaint();    drawFrm();    if (ePaint != null)        ePaint(g);    applyTrans();endPaint();            f.Left = this.Left + (int)(this.Width*cst_lFrm/cst_imgWidth);f.Top = this.Top + (int)(this.Height*cst_tFrm/cst_imgHeight) + cst_frmExtraHeight;}
    _Hàm beginPaint và endPaint: như đã giới thiệu ở trên

    Mã:
    public virtual void beginPaint(){               bitmap = new Bitmap(frmWidth,frmHeight);            g = Graphics.FromImage(bitmap);    g.SmoothingMode = SmoothingMode.AntiAlias;}public virtual void endPaint(){    g.Dispose();    bitmap.Dispose();}
    _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

    Mã:
    public virtual void drawFrm(){    if (bitmap == null || g == null)        return;     g.DrawImage(new Bitmap("GlassFormImages\\GlassForm.png"),this.ClientRectangle);    //g.DrawLine(new Pen(Color.Black),clientX,clientY,clientX + clientWidth,clientY + clientHeight);    //g.DrawLine(new Pen(Color.Red),this.Left,this.Left,this.Left + frmWidth,this.Left + frmHeight);                            g.DrawImage(new Bitmap("GlassFormImages\\TextGlow.png"),                 new Rectangle(25,20,clientWidth - (int)(clientWidth*30/100),25));    string title = this.Text;    if (f != null)        title = f.Text;    g.DrawString(title,                 new Font(FontFamily.GenericSansSerif,12,FontStyle.Bold,GraphicsUnit.Pixel),                 new SolidBrush(Color.Black),new Point(30+20,20+5));                g.DrawImage(new Bitmap("GlassFormImages\\Icon.png"),0,0,cst_iconSize,cst_iconSize);                recButtonX = new Rectangle((clientX + clientWidth) + cst_xBtnX,(int)( frmHeight - clientHeight + cst_xBtnY),44,18);    if (posButtonX == 0)        g.DrawImage(new Bitmap("GlassFormImages\\CloseButton.png"),                    recButtonX,                    posButtonX,0,44,18,GraphicsUnit.Pixel);                //Draw TextGlow    if (arrRecNext == 0)        return;                for (int i = 0; i != arrRecNext; i++)    {        g.DrawImage(new Bitmap("GlassFormImages\\TextGlow.png"),                        new Rectangle(clientX + arrRec[i].X -25,clientY + arrRec[i].Y -10,                                 arrRec[i].Width +40,arrRec[i].Height +20));    }}
    _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:

    Mã:
        beginPaint();        drawFrm();        if (ePaint != null)  //Call các hàm vẽ lên form 1 (cái này do form 2 làm)            ePaint(g);        applyTrans();    endPaint();
    Mã:
    public virtual void applyTrans(){           if (bitmap == null)        return;                IntPtr dcScreen = Win32.GetDC(IntPtr.Zero);    IntPtr dcMem = Win32.CreateCompatibleDC(dcScreen);    IntPtr hBmp = IntPtr.Zero;    IntPtr oldBmp = IntPtr.Zero;                            try     {        hBmp = bitmap.GetHbitmap(Color.FromArgb(0));        oldBmp = Win32.SelectObject(dcMem,hBmp);                        Win32.Size size = new Win32.Size(bitmap.Width,bitmap.Height);        Win32.Point pSource = new Win32.Point(0,0);        Win32.Point pTop = new Win32.Point(this.Left,this.Top);                        Win32.BLENDFUNCTION blendF = new Win32.BLENDFUNCTION();        blendF.BlendOp = Win32.AC_SRC_OVER;        blendF.BlendFlags = 0;        blendF.SourceConstantAlpha = 255;        blendF.AlphaFormat = Win32.AC_SRC_ALPHA;                        Win32.UpdateLayeredWindow(Handle,dcScreen,ref pTop,ref size,dcMem,ref pSource,0,ref blendF,Win32.ULW_ALPHA);    }    finally     {        Win32.ReleaseDC(IntPtr.Zero,dcScreen);                    if (!(hBmp.Equals(IntPtr.Zero)))        {            Win32.SelectObject(dcMem,oldBmp);            Win32.DeleteObject(hBmp);        }                        Win32.DeleteDC(dcMem);    }}
    _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ì:

    Mã:
    glassF.ePaint += new GlassApp.dPaint(exPaint); void exPaint(Graphics g){    g.DrawLine(...);}
    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

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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)..[IMG]images/smilies/wink.png[/IMG]

  4. #4
    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 tham gia
    Sep 2015
    Bài viết
    0
    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)

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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á.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi nhc1987
    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á.
    Bác khiêm tốn quá [IMG]images/smilies/daydreaming.gif[/IMG] . Theo mình nghĩ chắc cái project mà nhc xem qua nó xài cách này:
    +Tạo 2 Form, 1 Form vẽ hình lên rùi cho opacity là 50 hay gì đó
    + Form thứ 2 thì set background color là màu gì đó rùi set transparent color là màu đó luôn để cho chỉ nhìn thấy control thui
    + Rùi để form 2 chồng lên form 1, khi di chuyển form 1 thì form 2 đi theo

    Cách này xem ra không ổn vì một khi đã set opacity lên form 1 thì bất cứ hình gì vẽ lên đều có độ mờ như nhau tức là không thể vẽ cái closebutton đặc được. Còn về chuyện tốn RAM thì không biết cách làm này có tốn RAM như nhc nói không (cái này phải thử mới biết)

    Còn project của mình kô set opacity của form 1 xuống dưới 100% hay nói cách khác là form 1 đặc chứ không mờ nhưng nhờ một kỹ thuật trong window nên có thể vẽ file hình png lên form 1 (Ví dụ hình png đó có chỗ mờ chỗ đặc (cái này xài photoshop sẽ biết) thì khi vẽ lên form cũng sẽ y như vậy, tức là chỗ nào trong hình đặc thì vẽ lên chỗ đó đặc, còn chỗ nào mờ thì khi vẽ lên sẽ mờ và thấy được phần đằng sau (như hình)).

    Nói chung là như vậy, nhưng mà nghĩ đi nghĩ lại thì thấy loại project này đúng là không ứng dụng được thật, nếu có thì cũng chỉ dành cho mấy người nào like vista quá mở lên coi chơi. Nhưng kỹ thuật vẽ file png lên form thì đúng là đáng học.[IMG]images/smilies/biggrin.png[/IMG] [IMG]images/smilies/wink.png[/IMG] [IMG]images/smilies/wink.png[/IMG]

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi nhc1987
    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)[IMG]images/smilies/18.gif[/IMG]


  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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)

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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ì.

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •