- Ứng dụng Windows hiện đại đã trở nên chậm và nặng do phụ thuộc vào các framework dựa trên web, đồng thời đánh mất quyền kiểm soát ở cấp hệ điều hành từng có trong thời Win32
- Với Win32 API, có thể tự do định nghĩa hình dạng cửa sổ thông qua vòng lặp thông điệp và đối tượng HRGN, nên thiết kế cửa sổ phi tiêu chuẩn từng rất phổ biến
- Bằng cách dùng bitmap và kỹ thuật layered window, người ta có thể tạo ra các cửa sổ hình dạng tự do với độ trong suốt và hoạt ảnh
- Tuy nhiên, cửa sổ tùy biến dần biến mất vì độ phức tạp khi phải tự triển khai mọi chức năng cơ bản và sự thay đổi trong thị hiếu ưa chuộng sự đơn giản của người dùng
- Dù vậy, Win32 vẫn mang lại tự do kiểm soát cửa sổ và thử nghiệm, đồng thời giữ nguyên khả năng tạo ra phần mềm desktop sáng tạo
Sự đơn điệu của ứng dụng Windows hiện đại và tự do đã mất của Win32
- Phần lớn ứng dụng desktop Windows gần đây chạy trên các lớp bọc trình duyệt như React, Electron, Tauri, biến thành những cấu trúc dựa trên web phức tạp vừa chậm vừa ngốn bộ nhớ
- Ngay cả một ứng dụng ghi chú đơn giản cũng chiếm 50MB bộ nhớ, trong khi ứng dụng cùng chức năng viết bằng Win32 C thuần chỉ khoảng 1.8MB
- Ngay cả trên phần cứng hiện đại, mức sử dụng bộ nhớ khi khởi động Windows 11 cũng lên tới 77%
- Trước đây, khi còn lập trình trực tiếp với Win32 API, lập trình viên có quyền kiểm soát hoàn toàn ở cấp hệ điều hành
- Khi đó không bị giam trong cửa sổ hình chữ nhật, mà có thể tự do tạo ra các cửa sổ có hình dạng phi tiêu chuẩn
- Vào thời Windows XP, nhiều ứng dụng như Windows Media Player sở hữu ngoại hình rất độc đáo
Những cửa sổ “hình thù kỳ lạ” của ngày xưa
- Đã có thời ứng dụng Windows được tạo ra với nhiều hình dạng khác nhau để thể hiện bản sắc và cá tính
- Trình phát media trông như thiết bị phần cứng, mascot desktop đi lại trên màn hình, còn các bảng tiện ích được thiết kế như bảng đồng hồ, đồ chơi, hay bảng điều khiển của người ngoài hành tinh
- Hình dạng cửa sổ không nhất thiết phải là hình chữ nhật, và mục tiêu của UI khi đó gần với cá tính hơn là tính tiện dụng
- Lý do những kiểu này biến mất ngày nay là vì lập trình viên không còn trực tiếp kiểm soát chính cửa sổ nữa
- Phần lớn framework UI hiện đại che giấu hệ điều hành, khiến nhà phát triển chỉ làm việc trong vùng hình chữ nhật bị giới hạn
Kiến trúc dựa trên thông điệp của Win32 và khả năng điều khiển cửa sổ
- Trọng tâm của lập trình Win32 nằm ở vòng lặp thông điệp sự kiện
- Vòng lặp gồm
GetMessage, TranslateMessage, DispatchMessage là nền tảng cho mọi hoạt động
- Bằng cách xử lý các thông điệp như “WM_CREATE”, “WM_PAINT”, “WM_SIZE”, “WM_DESTROY”, ta định nghĩa hành vi của cửa sổ
- Dùng HRGN (Region Object), có thể thay đổi hình dạng cửa sổ một cách tự do
- Khi chỉ định vùng cho cửa sổ bằng
SetWindowRgn, chỉ phần vùng đó mới được xem là cửa sổ thực sự
- Trong mã ví dụ,
CreateEllipticRgn được dùng để tạo cửa sổ hình elip, đồng thời tự triển khai chức năng kéo thả khi không có thanh tiêu đề
- Khi nhận “WM_LBUTTONDOWN”, nó gửi “WM_NCLBUTTONDOWN” với “HTCAPTION” để giả lập việc di chuyển cửa sổ
- Như vậy, việc tạo hình dạng thì dễ, nhưng thách thức cốt lõi là phải tự xây lại các chức năng mà khung cửa sổ mặc định vốn đã cung cấp
Cửa sổ dựa trên bitmap và layered window
- Ví dụ “drivenbyimage/main.c” định nghĩa hình dạng cửa sổ bằng dữ liệu bitmap
- Nó tải “shape.bmp” và đặt các pixel ngoài màu trong suốt (magenta) làm vùng cửa sổ
- Bitmap đồng thời đóng vai trò là hình ảnh được vẽ lên màn hình và hình dạng thực tế của cửa sổ
- Các ứng dụng skin ngày trước đã dùng cách này để tạo ra nhiều hình dạng như chó con, tàu vũ trụ, radio, hay gương mặt nhân vật
- Tuy nhiên, vùng dựa trên bitmap có biên cứng và không thể thể hiện bán trong suốt
- Muốn có viền mượt hay hoạt ảnh, cần dùng layered window (
WS_EX_LAYERED)
- Trong ví dụ “Animated/”, ảnh 32-bit có kênh alpha trong suốt được tải lên bằng
UpdateLayeredWindow
- Nó dùng GDI+ để vẽ sprite sheet lên bitmap trong bộ nhớ, chuyển đổi từng frame rồi hiển thị lên desktop
- Hình dạng cửa sổ không còn cố định, mà trạng thái pixel hiện tại chính là hình dạng của cửa sổ
- Cách làm này hỗ trợ độ trong suốt mượt, thay đổi hình dạng theo từng frame, và hoạt ảnh tự nhiên
Độ khó của cửa sổ tùy biến và sự thay đổi về mặt văn hóa
- Khi tạo cửa sổ tùy biến bằng Win32 API, mọi chi tiết hành vi đều phải tự xử lý
- Kéo thả, thay đổi kích thước, đóng, nhập từ bàn phím, hỗ trợ DPI... đều là những chức năng mà cửa sổ mặc định vốn tự động xử lý nhưng nay phải triển khai thủ công
- Làm prototype thì dễ, nhưng để mài giũa thành một sản phẩm hoàn thiện lại cần chi phí và công sức rất lớn
- Người dùng cũng dần ưu tiên sự ổn định và đơn giản hơn những thử nghiệm thị giác kiểu này
- Cửa sổ phi tiêu chuẩn thường bị gắn với phần mềm quảng cáo, toolbar, và các tiện ích không cần thiết, tạo nên hình ảnh tiêu cực
- Kết quả là “cửa sổ hình thù kỳ lạ” bị xem như yếu tố đùa vui hơn là phần mềm nghiêm túc
Khả năng và ý nghĩa vẫn còn nguyên của Win32
- Dù vậy, Win32 vẫn mang lại tự do kiểm soát trực tiếp và thử nghiệm
- Chỉ với thông điệp, handle và API vẽ, ta vẫn có thể điều khiển cửa sổ ở cấp hệ điều hành
- Trong đa số trường hợp, cửa sổ hình chữ nhật là lựa chọn hợp lý, nhưng điều này nhắc rằng đó là lựa chọn chứ không phải bắt buộc
- Mã ví dụ được công khai trong kho GitHub WierdApps
- Bao gồm ba mẫu: cửa sổ hình elip, cửa sổ dựa trên bitmap và mascot hoạt ảnh
- Win32 vẫn cho phép tạo ra phần mềm desktop sáng tạo và mang tính thử nghiệm
1 bình luận
Ý kiến trên Hacker News
Tôi hy vọng những cửa sổ có hình dạng kỳ quặc sẽ không quay trở lại
Chỉ vì có thể làm không có nghĩa là nên làm
Việc các ứng dụng ngày nay được tạo bằng các lớp bọc trình duyệt như React, Electron, Tauri đều trông na ná nhau là vì chúng không dùng framework GUI của hệ điều hành
Khi ứng dụng nào cũng dùng widget phi tiêu chuẩn hoặc màu sắc, hình dạng riêng, khả năng tiếp cận và tính dễ dùng sẽ bị phá hỏng
Trớ trêu là hiện nay những ứng dụng nhấn mạnh “bản sắc” thường lại là kiểu bảng điều khiển cho driver bị các hãng phần cứng nhét vào, và đó là loại bloatware tệ nhất
Tôi thích Win32, nhưng tôi cho rằng văn hóa skin kỳ quái ngày xưa là điềm báo trước cho lối nghĩ “branding = bản sắc” hiện nay
Cuối cùng nó dẫn đến sự bùng nổ của Electron và các thư viện widget nửa vời
Trừ những ứng dụng đặc thù như Blender hay Ardour, GUI cá tính không phải ưu tiên hàng đầu
Hệ điều hành ngày nay không còn cho cá nhân mà cho doanh nghiệp. Thời Win3.1~XP mới thực sự là kỷ nguyên của máy tính cá nhân
Các ứng dụng dựa trên React ngày nay không có tính nhất quán, cả với hệ điều hành lẫn với nhau
Cứ 6 tháng UI lại đổi nhưng UX chẳng cải thiện. Khả năng tiếp cận (a11y) thì gần như bị lãng quên hoàn toàn
Ngày trước phần mềm do số ít người làm ra và được duy trì ổn định trong thời gian dài
Giờ thì mọi thứ chuyển sang lặp nhanh và đội ngũ lớn, và thiết kế phẳng là kết quả phù hợp với môi trường đó
Thiết kế skeuomorphic tốn kém vì phải liên tục làm lại tài sản đồ họa
Cuối cùng đây là thời đại ưu tiên tốc độ và quy mô. Giống như đồ nội thất chạm khắc thủ công bị thay bằng đồ nội thất lắp ráp phẳng
Đến thời đại HiDPI thì việc vẽ UI theo từng pixel như trước đã trở nên khó khăn hơn nhiều
Hồi Win95~XP người ta có thể vẽ trực tiếp lên front buffer nên nhanh và tốn ít bộ nhớ, còn bây giờ mỗi cửa sổ phải giữ một buffer sao lưu nên dùng RAM nhiều hơn
Khi đọc câu “The point was usually not usability. It was identity.” tôi có cảm giác như đây là bài do LLM viết
Tôi từng phát triển ứng dụng Windows, và giao diện Win32 chỉ cho kiểm soát khoảng 90%
Tôi nhớ mình từng muốn đổi theme màu và cuối cùng phải tự triển khai lại MessageBox
Notepad viết bằng Win32 C thuần chỉ dùng 1.8MB, trong khi trình ghi chú bây giờ ngốn tới 50MB
Thậm chí GNU Emacs còn dùng ít bộ nhớ hơn
Trong khi EDIT.EXE ở chế độ văn bản chỉ dùng 520KB nên hiệu quả hơn nhiều
Trước đây trên Mac có một ứng dụng ghi đĩa CD tên là Disco, và trong lúc ghi đĩa sẽ có hiệu ứng khói bốc lên trên cửa sổ
Steve Jobs từng tự mình trình diễn nó trên sân khấu và rất thích thú
Tôi cũng vui vì bài viết có nhắc đến mascot trên desktop
Gần đây tôi xem một video về desktop pet làm bằng Godot, nó chạy đa nền tảng
Có hơi tốn công một chút, nhưng không phức tạp đến mức Win32. Đây là lựa chọn tốt cho những người yêu thích desktop pet