View Full Version : GlassApp - Aero nguyên form giống Vista trên XP...
vpdp_pc
18-01-2008, 10:18 PM
GlassApp - Aero nguyên form giống Vista trên XP...
http://i245.photobucket.com/albums/gg55/vpdp_pc1011/ScrShot.jpg
http://i245.photobucket.com/albums/gg55/vpdp_pc1011/AppEx.jpg
Đâ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)
vpdp_pc
18-01-2008, 10:21 PM
_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 :
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:
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:
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
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
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
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 title
this.Height = frm.Height + (int)(frm.Height*cst_tFrm/cst_frmHeight) + (int)(frm.Height*cst_bFrm/cst_frmHeight);
frm.Height -= cst_frmExtraHeight;
//Calculate
calculate(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
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
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:
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();
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ì:
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-plus/perpxalpha_sharp.aspx
+++++++ Download: http://www.box.net/shared/iql4354co0
vpdp_pc
18-01-2008, 10:24 PM
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)..;)
huynguyen
18-01-2008, 10:49 PM
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.
nhc1987
19-01-2008, 12:04 AM
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ì.
vpdp_pc
19-01-2008, 05:07 AM
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)(\'o)
http://i245.photobucket.com/albums/gg55/vpdp_pc1011/Ex.jpg
Kevin Hoang
19-01-2008, 11:16 AM
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)
nhc1987
19-01-2008, 12:11 PM
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.
vpdp_pc
19-01-2008, 01:08 PM
Cũng không hẳn là tốn RAM:
http://i245.photobucket.com/albums/gg55/vpdp_pc1011/Ex-1.jpg
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 (http://www.box.net/shared/39nlr0pkws) (Chỉ có file exe, nguyên project của nó hơi bị lớn)
nhc1987
19-01-2008, 01:26 PM
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á.
vpdp_pc
19-01-2008, 02:30 PM
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á (8-)> . 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.:D ;) ;)
ThanhDN
24-01-2008, 10:47 PM
Lúc nào cũng là 2 Form :D, có lúc form 2 không chạy theo được form 1 nữa
chưa có làm nhòe , vả lại không phải làm nguyên form như thế
cái này nhìn ngầu quá , nhất là cái icon và cái shadow . Còn của vbfrance thì được cái nhòe hay
player
26-01-2008, 09:13 AM
Oh mình là newmember mong anh em chỉ bảo thêm. Mới học C# có một ngày hà vào đây thấy viết C# đẹp quá.Và cái này mình đang rất cần để làm cho giao diện đẹp nè thank nhiều. Bạn có thể up cái project hay source code toàn bộ lên hông vậy thế thì cảm ơn lắm.
Z3roXIII
12-02-2008, 11:07 AM
chồng 2 cái form lên, giống cái chiêu mà tui và tụi bạn làm. Vì ko thể cho chương trình dừng ở từng chỗ, nên tụi tui tạo 1 cái forms rồi cho nó mờ lại chừa cái nút chồng lên cái form chính, để cho người dùng ko biết đường mà move nó qua che cái hình , và để cho họ tưởng nó là cái nút hiện trên cái form chính, nhưng cách này thì không ổn lắm, nhưng mà ý tưởng cũng tuyệt rồi, quan trọng là tìm chỗ ứng dụng thích hợp cho nó, chứ hình như ứng dụng vào trường hợp này ko ổn lắm
vietthanhpro
24-02-2008, 09:38 AM
Mình không hiểu phần code làm trên là tất hày chỉ một phần vậy. Copy cả project cho anh em xem cho xong đi(:-)?
hacker073
29-02-2008, 01:41 PM
Mình xin đóng góp vài ý kiến nha.
Để xây dựng được dạng FORM như thế(Nói chung là giao diện kiểu Windows Vsta) thi đòi hỏi bạn phải có bộ tập hợp file .DLL mới làm được.Các bạn cần mình sẽ Post lên sau và hướng dần cách sử dụng luôn nhé.Bộ file DLL này dược lấy từ thư viện của OFFICE 2007.
LH:hacker073@gmail.com minh se gửi link cho
thetukiet
09-08-2008, 03:35 PM
Tớ cũng ủng hộ vpdp_pc. Chúc bạn ngày càng có nhiều đóng góp hữu ích cho Cộng Đồng chúng ta. (=D)> (=D)> (=D)>
longtqdayma
31-08-2008, 01:30 PM
Cái này cũng hay ,Bạn vpdp_pc ơi cho mình hỏi làm đơn giản hơn thế chỉ cần
làm cái thanh tiêu đề vào vùng ngoài của form trong suốt ,có được không
như cái chương trình sau, nếu rỗi bạn làm cho mình xem được không
link
http://s8.galaxyz.net/fo.html?s=716B5C5D455848524758475971071E05161F000F 10121C0A
tên file TrueTransparency.rar
ZCoder87
01-09-2008, 02:11 PM
Trước kia ZCoder cũng thử cái này với C++ rồi.
Tất cả chỉ trong cái function này thôi.
BOOL UpdateLayeredWindow(
HWND hwnd,
HDC hdcDst,
POINT *pptDst,
SIZE *psize,
HDC hdcSrc,
POINT *pptSrc,
COLORREF crKey,
BLENDFUNCTION *pblend,
DWORD dwFlags
);
Để làm được cái hiệu ứng này thì đầu tiên bạn phải chụp lại màn hình hiện tại.
Cái này chính là:
- HDC hdcDst (HDC chính là cái handle của Graphics C# đó)
- Và sau đó vẽ những gì bạn muốn trên HDC hdcSrc. Aero là ở phần này. Nó có 1 quy định màu sắc mình cũng không nhớ rõ nữa nhưng đại khái là như vầy.
+ hdcSrc là một Image 32 bit. Có nghĩa là 1 điểm trên đó sẽ bao gồm 4 giá trị R, G, B và A.
. Khi A = 255 (có nghĩa là vùng form trên đó không bị trong suốt. Nhận các sự kiện click chuột vào). Màu sắc R,G,B được giữ nguyên vẹn.
. Khi A = 1 - 244 có nghĩa bắt đầu có hiệu ứng transparent.
. Khi A = 0 thì vùng là vùng bị cắt xén.
- Còn các tham số còn lại chỉ tọa độ, kích thước của cửa sổ bị cắt xén. BLENDFUNCTION chính là độ trong suốt của phần có A=255.
Quên nữa. Còn phải điều chỉnh cửa số có thể thuộc tính WS_LAYERED_EX nữa. Cái này hình như phải call hàm Setwindowlong từ API
Đoạn code này copy của vpdp_pc tương đối dễ hiểu và mấu chốt ở đây
// Chụp lấy màn hình hiện tại (bao gồm tất cả những gì thể hiện trên màn hình)
IntPtr dcScreen = Win32.GetDC(IntPtr.Zero);
// Tạo 1 memDC ảo của màn hình.
IntPtr dcMem = Win32.CreateCompatibleDC(dcScreen);
IntPtr hBmp = IntPtr.Zero;
IntPtr oldBmp = IntPtr.Zero;
try
{
// Vẽ lên dcẢo (bitmap chính là file png có nguyên tắc màu của Aero)
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, // cửa sổ form
dcScreen, // Màn hình hiện tại
ref pTop,ref size, // toạ độ và kích thước form
dcMem, // Màn hình Aero
ref pSource, // Toạ độ bắt đầu của dcMem
0, // Color Alpha = đen
ref blendF,Win32.ULW_ALPHA); // Const alpha
}
Đẹp thì không biết có đẹp hơn hay không? nhưng bạn phải trả 1 cái giá đắt nếu dùng Aero kiểu này đó. Bởi lẽ dường như bạn không làm chủ được cái cửa sổ nữa, các control. Các sự kiện paint...
Do đó nó chỉ ứng dụng làm demo windows thôi.
Biết 1 chút nên cũng xin đóng góp 1 chút ít.
HieuKull!89
29-10-2008, 02:43 PM
giá mà bạn tìm được nguyên cả cái Project nhỉ! thế mới biết được code của nó thế nào mà học tập! hjc
dù sao cũng Thanhs nhé^^!
icttrack
02-09-2010, 09:40 AM
Cũng không hẳn là tốn RAM:
http://i245.photobucket.com/albums/gg55/vpdp_pc1011/Ex-1.jpg
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 (http://www.box.net/shared/39nlr0pkws) (Chỉ có file exe, nguyên project của nó hơi bị lớn)
Đọc đoạn này mình khẳng định tác giả chép mã. Vì đơn giản những đoạn mã tác giả gửi lên hoàn toàn sử dụng P/Invoke để gọi các hàm Win32 trong .Net. Với lập trình viên C/C++ thì Win32 API ko có gì là xa lạ cả, nó là tập hợp các hàm sử dụng giao tiếp bằng ngôn ngữ lập trình C. Nói một cách khác, nếu lập trình viên C/C++ muốn được hiệu ứng tương tự thì cũng phải dùng các hàm Win32 mà tác giả đã dùng, thậm chí các thao tác gọi hàm cũng gần như là tương tự, chỉ có điều giản tiện hơn vì không phải dùng khai báo P/Invoke tức là sẽ đỡ rối rắm hơn so với dùng C#.
Nếu tự làm những cái đó thì kiến thức Windows API phải khá. Mà đã có hiểu biết tốt về Windows API mà ko biết chút gì về lập trình C/C++ sử dụng Windows API là điều rất khó xảy ra.
windows
02-09-2010, 10:15 AM
Chép mã mà hiểu được và vận dụng thành công thì cũng đáng chép lắm chứ ? Ai chẳng phải chép mã rồi học, hiểu mới sáng tạo ra cái khác ?
Hoặc như IBM open source 1 món gì đó cho người khác update, modify và lấy lại code-không-phải-của-họ-viết chỉnh sửa và đem bán, ấy mới gọi là pro.
icttrack
02-09-2010, 10:29 AM
Chép mã mà hiểu được và vận dụng thành công thì cũng đáng chép lắm chứ ? Ai chẳng phải chép mã rồi học, hiểu mới sáng tạo ra cái khác ?
Hoặc như IBM open source 1 món gì đó cho người khác update, modify và lấy lại code-không-phải-của-họ-viết chỉnh sửa và đem bán, ấy mới gọi là pro.
À, ở đây ý mình muốn nói tác giả chép nhưng không hiểu vấn đề.
Còn ý bạn nói thì mình hoàn toàn đồng tình.
vBulletin® v3.8.4, Copyright ©2000-2010, Jelsoft Enterprises Ltd. Administrer by Kevin Hoang