Archive for July, 2009

Xác định các thiết bị USB Mouse bằng jUSB

Người ta biết đến Java với câu slogan nổi tiếng: “write once, run everywhere”. Điều này có nghĩa Java là một nền tảng chạy độc lập với hệ điều hành và phần cứng, developer chỉ cần viết code một cách tổng quát theo các hàm mà Java cung cấp là có thể yên tâm rằng chương trình của mình sẽ chạy được trên tất cả mọi máy mà Java Runtime Enviroment được cài đặt. Tuy nhiên, không có gì là hoàn hảo, Java lại rất kém trong việc xử lý các tương tác về phần cứng, vì các tương tác này là do hệ điều hành và các driver điều khiển, nên thật sự không tồn tại bất kỳ phương pháp tổng quát nào để làm việc bằng Java ở mức lập trình hệ thống. Xác định các thiết bị chuột USB được cắm vào máy tính là một vấn đề khó khăn cho Java developer, và bài viết này nhằm mục đích hướng dẫn giải quyết vấn đề trên, sử dụng thư viện jUSB để gọi API của từng hệ điều hành cụ thể.
Read more

Data Binding

Giới thiệu

Data Binding (liên kết dữ liệu), có thể nói nôm na là phương pháp rút trích dữ liệu từ trong database và hiển thị chúng ra giao diện bên ngoài mà không cần phải viết những dòng code chán ngắt hoặc chỉ cần viết rất ít. Do data là linh hồn của một ứng dụng, nên từ xưa data binding đã được xem là một trong những vấn đề quan trọng hàng đầu cần phải giải quyết để tăng hiệu năng của việc lập trình và hiệu quả của chương trình.

Những developer đã từng trải qua thời kỳ làm việc với Windows Forms sẽ nhận thấy rằng data binding trong WPF không có quá nhiều điểm khác biệt. Cũng như Windows Forms, WPF cho phép tạo liên kết giữa các thuộc tính của đối tượng dữ liệu với các thuộc tính của thành phần giao diện. WPF cũng cung cấp các control dạng list, có thể được bind từ một mảng, hay một danh sách đối tượng; list control này có khả năng hiển thị toàn bộ thông tin theo từng trang (paging) hoặc xem chi tiết theo từng record một, cho phép người dùng có thể duyệt để tìm kiếm thông tin mà họ mong muốn.
Read more

Animation

WPF là một framework mới với nhiều khả năng tiên tiến, đặc biệt là hỗ trợ rất mạnh về đồ họa và giao diện người dùng. Ta có thể xem một số hình ảnh tạo bỏi WPF dùng trên ngôn ngữ C# như sau:

Animation là một trong số đó, không những thế, nó còn là hạt nhân, là điểm nhấn của WPF. Với cách tiếp cận hoàn toàn khác so với Window Form truyền thống là dựa trên định thời, hiệu ứng trong WPF chủ yếu dựa trên thuộc tính. Ta có thể xoay, kéo dãn ra, di chuyển dọc theo màn hình, đổi màu, v..v mọi đối tượng, tùy theo cách thức tác động lên thuộc tính tương ứng. Để có thể phát huy hết sức mạnh của animation trong WPF, những kiến thức về thuộc tính độc lập (depedency property), style, transformation…. là cần thiết.
Read more

Transformation

Transformation là khái niệm dùng để chỉ các phép biến đổi một hình ảnh này thành một hình ảnh khác, bên dưới thực chất nó là sự biến đổi hệ tọa độ, đưa hình ảnh từ hệ tọa độ này sang hệ tọa độ khác để hình này nhìn có vẻ khác đi. Bằng phương pháp toán học, người ta thực hiện phép chuyển đổi tọa độ bằng việc sử dụng ma trận. Mỗi phép chuyển đổi tọa độ – mỗi loại transformation như scaling (phóng to, thu nhỏ), reflection (tạo ảnh đối xứng), translation (dịch chuyển) và rotation (xoay) – đều có một ma trận đặc trưng cho nó. Bài viết sẽ giới thiệu các kiến thức toán học cơ bản về vector, ma trận và transform trong không gian 2D, đồng thời cũng giới thiệu về các công cụ mà WPF cung cấp để thao tác với các đối tượng toán học để tạo nên hiệu ứng 2D transformation cho UI control. WPF vẫn hỗ trợ transformation trong không gian 3D, nhưng sẽ không được đề cập đến vì khối lượng lý thuyết toán 3D khổng lồ khó có thể được trình bày trong một bài tìm hiểu ngắn.
Read more

Style

Một Style là một tập hợp các giá trị thuộc tính có thể áp vào một đối tượng đồ hoạ. Style trong WPF đóng vai trò tương tự như CSS trong HTML. Giống như CSS, WPF Style cho phép định nghĩa một tập hợp những định dạng chung để áp dụng trong toàn bộ chương trình để bảo đảm tính nhất quán. WPF Style hoạt động một cách tự động, áp dụng lên kiểu dữ liệu mục tiêu (target type), và có thể áp dụng nối tiếp xuống cây cấu trúc các đối tượng đồ hoạ. Tuy nhiên, WPF Style còn mạnh mẽ hơn CSS khi nó có thể đặt giá trị của bất kì thuộc tính phụ thuộc (dependency property) nào, ví dụ như trạng thái của control. WPF hỗ trợ cả triggers, dùng để thay đổi các thuộc tính của control khi mà một thuộc tính nào đó thay đổi, và hỗ trợ templates để định dạng lại cấu trúc bên dưới của control. Style là một điểm mạnh mà ta có thể mạnh dạn áp dụng trong chương trình.
Read more

Resource

Trong WPF có hai đối tượng dữ liệu đều được gọi dưới tên là resource:

  • Assembly resource là một dãy dữ liệu nhị phân được đính kèm vào trong assembly đã được biên dịch sẵn, ví dụ như .NET exe, dll. Người ta sử dụng assembly resource trong trường hợp muốn bảo đảm rằng hình ảnh và âm thanh được sử dụng trong chương trình luôn ở tư thế sẵn sàng khi muốn truy cập.
  • Object resource là những đối tượng .NET mà developer định nghĩa tại một vị trí nào đó trong chương trình để sử dụng chúng tại nhiều vị trí khác nhau. Object resource ít khi được tạo ra bằng code, mà chủ yếu được viết thông qua XAML markup. Kiểu resource này hỗ trợ cho việc tái sử dụng các đối tượng đồ họa và cho phép lưu trữ các thông tin (ví dụ như color scheme của ứng dụng) tại vị trí tập trung để việc tìm kiếm và chỉnh sửa được thuận tiện. Object resource đa số được sử dụng kết hợp với WPF style để tạo giao diện thống nhất trong chương trình.

Read more

Dependency Property & Routed Event

Dependency Property

Khi ta bắt đầu với việc phát triển ứng dụng với WPF, ta sẽ gặp phải các thuộc tính phụ thuộc. Chúng trông tương tự như những thuộc tính .Net thông thường, nhưng khái niệm đằng sau thì phức tạp hơn và mạnh hơn.

Những thuận lợi của các thuộc tính phụ thuộc:

  • Giảm không gian lưu trữ. Một sự lãng phí lớn để lưu trữ cả một vùng cho mỗi thuộc tính khi hơn 90% các thuộc tính của một điều khiển giao diện người dùng đều duy trì ở các giá trị khởi tạo. Thuộc tính phụ thuộc giải quyết vấn đề này bằng cách chỉ lưu trữ thuộc tính bị thay đổi trong thực thể. Giá trị mặc định được lưu trữ chỉ một lần trong thuộc tính phụ thuộc.
  • Kế thừa giá trị. Khi ta truy cập một thuộc tính phụ thuộc, giá trị được phân giải dựa trên một thứ tự phân giải giá trị. Nếu không có giá trị cục bộ nào được thiết lập, giá trị phụ thuộc sẽ đi lên cây luận lý cho tới khi tìm được một giá trị. Ví dụ, khi ta thiết lập giá trị FontSize trên thành phần gốc, nó sẽ áp dụng cho mọi textblock ở sau ngoại trừ ta ghi đè giá trị đó.
  • Báo hiệu sự thay đổi. Thuộc tính phụ thuộc có cơ chế tích hợp nhận dạng sự thay đổi. Bằng cách đăng ký một callback trong metadata của thuộc tính, ta sẽ được lưu ý khi giá trị của thuộc tính được thay đổi. Kỹ thuật này cũng được sử dụng bởi data binding.

Read more