Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Cách tạo 1 dialog với hình dáng đặc biệt

  1. #1
    Ngày gia nhập
    08 2006
    Bài viết
    32

    Mặc định Cách tạo 1 dialog với hình dáng đặc biệt

    Khi chúng ta kick hoạt một chươngtrinhf thì hình dáng đầu tiên luôn là hình chữ nhật.Nói chung là khôn đẹp lắm và mình đã từng thấy nhiều người tạo được với hộp thoại hình lá.Vậy nếu ai biết thì có thể chia sẻ cho tôi và mọi người không?Rất mong được sự đóng góp giúp đỡ của mọi người.Chắc các bạn ai cũng biết chương trình "Lịch vạn sự" với giaodieenj rất đẹp và được viết bằng VB vậy chắc là VC++ cung lam được....?

  2. #2
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Mình chưa có kinh nghiệm về vấn đề này nhưng theo mình thì bạn có thể tạo một hộp thoại kiểu ko có title và đặt màu nền là một màu đặc biệt nào đó. Sau đó bạn set cái màu nền đó là màu thủng ( diễn đạt ko tốt lắm )
    pEnGwINUS.

  3. #3
    Ngày gia nhập
    07 2007
    Bài viết
    3

    Nói về lập trình đồ họa và hệ thống thì VB không thể qua mặt dc VC++ đâu bạn! Bạn hảy tham khảo phần CRgn và SetWindowRgn trong MSDN, có đầy đủ mọi thứ đó!

  4. #4
    Ngày gia nhập
    03 2007
    Bài viết
    179

    Trích dẫn Nguyên bản được gửi bởi Kflrei Xem bài viết
    Nói về lập trình đồ họa và hệ thống thì VB không thể qua mặt dc VC++ đâu bạn! Bạn hảy tham khảo phần CRgn và SetWindowRgn trong MSDN, có đầy đủ mọi thứ đó!
    Bạn có chắc không , vì cái vb lẫn c++ là của một hãng mà, vô lẽ bên này có bên kia không

  5. #5
    Ngày gia nhập
    08 2006
    Bài viết
    32

    Theo mình thì VC++ hơn hẳn phần lập trình đồ họa của VB ma.Trong VC++ có thêm thư viên opengl(một trong hai thư viện đồ họa mạnh nhất).Chính vì vậy tạo giao diện mạnh hơn hẳn của VB.VB chỉ thực sự mạnh về data thôi.

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

    Mặc định Cách tạo 1 dialog với hình dáng đặc biệt

    Bạn xem bài viết sau xem có giúp được chút gì không? Dr sưu tầm được.

    Bên dưới là đoạn mã của 2 hàm chính sử dụng để tạo bitmap region.
    Chúng nằm trong tập tin BitmapRegion.cs // Tạo và áp dụng bitmap region cho control được cung cấp
    Code:
    public static void CreateControlRegion(Control control, Bitmap bitmap)
    { 
    	// thoát ra nếu control hay bitmap bằng null 
    	if(control == null || bitmap == null) return; 
    	// Thiết lập cho kích thước của control bằng với kích thước của bitmap 
    	control.Width = bitmap.Width; 
    	control.Height = bitmap.Height; 
    	// Kiểm tra xem chúng ta có đang vẽ lên Form hay không? 
    	if(control is System.Windows.Forms.Form)
    	{ 
    		// Ép kiểu thành kiểu Form 
    		Form form = (Form)control; 
    		// Thiết lập cho kích thước của form lớn hơn kích thước của bitmap một chút 
    		// trong trường hợp đường viền của form chưa được chọn là none 
    		form.Width += 15; form.Height += 35; 
    		// Không có đường viền 
    		form.FormBorderStyle = FormBorderStyle.None; 
    		// Thiết lập cho bitmap làm hình nền của form 
    		form.BackgroundImage = bitmap; 
    		// Tính toán ra graphic path dựa trên bitmap được cung cấp GraphicsPath 
    		graphicsPath = CalculateControlGraphicsPath(bitmap); 
    		// Áp dụng region mới 
    		form.Region = new Region(graphicsPath); 
    	} 
    		// Kiểm tra xem chúng ta đang làm việc với button? 
    		else if(control is System.Windows.Forms.Button) 
    		{ 
    			// Ép kiểu thành button Button 
    			button = (Button)control; 
    			// Không hiển thị button text 
    			button.Text = [/IMG] 
    			// Chuyển kiểu con trỏ thành dạng hand khi di chuyển lên button 
    			button.Cursor = Cursors.Hand; 
    			// Đặt hình nền cho button 
    			button.BackgroundImage = bitmap; 
    			// Tính toán ra graphic path dựa trên bitmap được cung cấp GraphicsPath 
    			graphicsPath = CalculateControlGraphicsPath(bitmap); 
    			// Áp dụng region mới 
    			button.Region = new Region(graphicsPath); 
    		} 
    }
    
    // Tính toán graphic path đại diện cho hình dạng của bitmap 
    // với màu trong suốt là màu của pixel góc trên bên trái. 
    private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap) 
    { 
    	// Khai báo một GraphicsPath 
    	GraphicsPath graphicsPath = new GraphicsPath(); 
    	// Sử dụng màu của pixel góc trên bên trái làm màu trong suốt 
    	Color colorTransparent = bitmap.GetPixel(0, 0); 
    	// Lưu giá trị cột khi pixel không trong suốt đầu tiên được tìm thấy 
    	// Giá trị này sẽ xác định vị trí đầu tiên chúng ta bắt đầu quét 
    	int colOpaquePixel = 0; 
    	// Quét qua tất cả các hàng (trục Y) 
    	for(int row = 0; row < bitmap.Height; row ++) 
    	{ 
    		// Khởi tạo lại giá trị 
    		colOpaquePixel = 0; 
    		// Quét qua tất cả các cột (trục X) 
    		for(int col = 0; col < bitmap.Width; col ++) 
    		{ 
    			// Nếu đây là 1 pixel không trong suốt, lưu lại và bắt đầu tìm kiếm 
    			if(bitmap.GetPixel(col, row) != colorTransparent) 
    				{ 
    					// pixel không trong suốt được tìm thấy, đánh dấu lại 
    					colOpaquePixel = col; 
    					// Tạo 1 biến mới để lưu vị trí pixel hiện thời 
    					int colNext = col; 
    					// Khởi đầu từ pixel không trong suốt được tìm thấy và tìm kiếm 
    					// thêm các pixel không trong suốt phía sau cho đến khi gặp pixel 
    					// trong suốt hay quét hết hình 
    					for(colNext=colOpaquePixel; colNext if(bitmap.GetPixel(colNext, row) == colorTransparent) break; 
    							// Tạo một hình chữ nhật cho pixel không trong suốt và 
    							// thêm nó vào graphic path 
    							graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1)); 
    							col = colNext; 
    				} 
    		} 
    	} 
    	// Trả về graphic path được tạo 
    	return graphicsPath; 
    }
    Tạo bitmap region cho form:
    Để tạo bitmap cho form, bạn chỉ cần 2 dòng mã. Lưu ý là bạn không cần phải thiết lập cho thuộc tính Border của form là none, chương trình sẽ tự làm cho bạn.
    Code:
    public class Form1 : System.Windows.Forms.Form 
    		{ 
    			// Load your bitmap for the form 
    			private Bitmap bmpFrmBack = new Bitmap(typeof(Form1), "back.bmp"); 
    			public Form1() 
    			{ 
    				//Required for Windows Form Designer support 
    				// InitializeComponent(); 
    				// Make our bitmap region for the form 
    				BitmapRegion.CreateControlRegion(this, bmpFrmBack); 
    			} 
    		}
    Tạo bitmap region cho button:
    Tạo bitmap region cho button cũng giốn như tạo bitmap button cho form. Bạn cũng không phải thay đổi thuộc tính gì cho button.

    Code:
    public class Form1 : System.Windows.Forms.Form 
    				{ 
    					// Load your bitmap for the form 
    					private Bitmap bmpFrmBack = new Bitmap(typeof(Form1), "back.bmp"); 
    					// Load your bitmap for the button 
    					private Bitmap bmpBob = new Bitmap(typeof(Form1), "bob.bmp"); 
    					public Form1() 
    					{ 
    						// Required for Windows Form Designer support 
    						// InitializeComponent(); 
    						// Make our bitmap region for the form 
    						BitmapRegion.CreateControlRegion(this, bmpFrmBack); 
    						// Make our bitmap regions for the buttons 
    						BitmapRegion.CreateControlRegion(button1, bmpBob); 
    					} 
    				}
    Bây giờ nếu bạn muốn thay đổi bitmap của button khi di chuyển chuột lên chúng, tôi rất vui khi báo cho bạn biết rằng bạn không phải tạo một custom button cho việc này. Bạn chỉ cần xử lý hai sự kiện MouseLeave và MouseEnter như được chỉ ra bên dưới:
    Code:
    private void button1_MouseEnter(object sender, System.EventArgs e) 
    					{ 
    						// Make bitmap region for button 
    						BitmapRegion.CreateControlRegion(button1, bmpBobSay); 
    					} 
    					private void button1_MouseLeave(object sender, System.EventArgs e) 
    					{ 
    						// Make bitmap region for button 
    						BitmapRegion.CreateControlRegion(button1, bmpBob); 
    					}
    Di chuyển form:
    Bởi vì form của bạn bây giờ không có thanh tiêu đề, chúng ta cần làm cho người dùng có thể bấm chuột trái vào bất cứ chỗ nào trên form và di chuyển nó. Giải pháp cho MFC là xử lý thông điệp WM_LBUTTONDOWN và dùng lệnh PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)) để đánh lừa cửa sổ đó như là chúng ta đang bấm vào thanh tiêu đề. Tuy nhiên, tôi không thể làm cho nó hoạt động với Windows Form, vì thế đoạn mã bên dưới là 1 giải pháp thay thế:

    Code:
    private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
    					{ 
    						// Check if dragging of the form has occurred 
    						if(e.Button == MouseButtons.Left) 
    							{ 
    								// If this is the first mouse move event for left click dragging 
    								// of the form, store the current point clicked so that we can use 
    								// it to calculate the form's new location in subsequent mouse move 
    								// events due to left click dragging of the form 
    								if(isFirst == true) 
    									{ 
    										// Store previous left click position 
    										prevLeftClick = new Point(e.X, e.Y); 
    										// Subsequent mouse move events will not be treated as first time, 
    										// until the left mouse click is released or other mouse click // occur 
    										isFirst = false; 
    									} 
    									// On subsequent mouse move events with left mouse click down. 
    									// (i.e. During dragging of form) 
    									else 
    										{ 
    											// This flag here is to do alternate processing for the form 
    											// dragging because it causes serious flicking when u allow 
    											// every such events to change the form's location. 
    											// You can try commenting this out to see what i mean 
    											if(toBlock == false) 
    												this.Location = new Point(this.Location.X + e.X - prevLeftClick.X, this.Location.Y + e.Y - prevLeftClick.Y); 
    												// Store new previous left click position 
    												prevLeftClick = new Point(e.X, e.Y); 
    												// Allow or deny next mouse move dragging event 
    												toBlock = !toBlock; 
    										} 
    							} 
    							// This is a new mouse move event so reset flag else 
    							isFirst = true; 
    					}
    Ghi chú: Có một vấn đề với việc đường viên chữ nhật được vẽ trên button khi button có focus. Tôi không thể disable đường viền này được. Và kết quả là, tôi tạo cho bitmap của mình hơi lớn hơn một chút để đường viền này không bị vẽ ra khỏi region của button.
    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!

  7. #7
    Ngày gia nhập
    06 2007
    Nơi ở
    Đà Nẵng
    Bài viết
    41

    Theo mình thì VC++ hơn hẳn phần lập trình đồ họa của VB ma.Trong VC++ có thêm thư viên opengl(một trong hai thư viện đồ họa mạnh nhất).Chính vì vậy tạo giao diện mạnh hơn hẳn của VB.VB chỉ thực sự mạnh về data thôi.
    Bậy kinh , nói phải biết suy nghĩ nhé . Mấy cái này VB cũng dùng được (openGL)region cũng có , chỉ có dx9 trở lên , Xna ... thì VB bó tay thôi .

  8. #8
    Ngày gia nhập
    05 2007
    Bài viết
    17

    Nói chung VB là basic mà, cơ bản nhất, dễ cho người ko bít gì lun . Bên vb tạo được hình dáng đặc biệt thì có 1 module transparent. Khi đó chỉ cần có 1 tấm ảnh hình bất kì, set màu form trùng màu nền tấm hình là form có hình dáng như cái hình đó. Còn VC++ thì chịu ^^
    http://www.sonnb.com Offline Priston Tale Zone

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

  1. Dialog::DoModal trong MFC. Làm thế nào để tương tác với dialog bên dưới?
    Gửi bởi rua_con trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 29-02-2012, 03:27 PM
  2. Cách gọi một hàm của dialog chính chứa tab control có tab item là dialog child
    Gửi bởi theboy909 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 13-06-2011, 06:51 AM
  3. Có một dialog con muốn thay đổi một vài thông số trên dialog cha thì làm thế nào
    Gửi bởi theboy909 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 24-05-2011, 03:39 PM
  4. Xử lý Dialog trong MFC | Code điều Khiển Dialog con ở đâu?
    Gửi bởi AdminPro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 08-04-2009, 10:53 PM
  5. Di chuyển Dialog khi drag and drop phần thân Dialog (Client)?
    Gửi bởi mu9991 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 07-11-2008, 10:48 AM

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