Tạo giao diện người dùng đồ họa bằng API Win32. Giao diện đồ họa và các công cụ để phát triển chúng. EI nào cần tạo

yadobr Tháng Một 14, 2014 lúc 09:10

Thiết kế giao diện người dùng đồ họa

  • Giao diện

Giới thiệu

Có hàng tỷ thiết bị điện toán trong thế giới hiện đại. Thậm chí nhiều chương trình hơn cho họ. Và mỗi cái đều có giao diện riêng, là “đòn bẩy” tương tác giữa người dùng và mã máy. Không có gì ngạc nhiên khi giao diện càng đẹp thì tương tác càng hiệu quả.

Tuy nhiên, không phải tất cả các nhà phát triển và thậm chí cả nhà thiết kế đều nghĩ đến việc tạo ra một giao diện đồ họa thuận tiện và dễ hiểu cho người dùng.

Đối với bản thân tôi, tôi bắt đầu bằng việc đặt câu hỏi: những nguyên tắc chung, cái gì phần tử giao diện (EI) tạo ra thiết kế mà chúng nên có, nơi chúng nên được đặt chính xác và cách chúng hoạt động.
Dưới đây tôi sẽ cố gắng trả lời những câu hỏi này.

Nguyên tắc chung


Tôi nên tạo EI gì?


Thiết kế EI nên như thế nào?

Trên thực tế, thiết kế EI là chủ đề của một bài viết riêng. Ở đây bạn cần phải tính đến mọi thứ: từ màu sắc, hình dạng, tỷ lệ cho đến tâm lý nhận thức. Tuy nhiên vẫn có một số nguyên tắc cần lưu ý:

Làm thế nào để định vị chính xác EI trên màn hình?


EI nên hành xử như thế nào?


Bị giam giữ

Bài viết này không tự nhận là hướng dẫn toàn diện nhất về các nguyên tắc thiết kế giao diện. Giao diện đồ họa người dùng là một chủ đề rộng lớn, gắn bó chặt chẽ với tâm lý học, chiếm lĩnh tâm trí của các nhà khoa học và hàng trăm trang sách, nghiên cứu. Với hình thức nhỏ như vậy, không có cách nào thể hiện được hết chủ đề được nêu ra. Tuy nhiên, việc tuân theo các nguyên tắc cơ bản sẽ giúp xây dựng các giao diện thân thiện với người dùng hơn, cũng như đơn giản hóa quá trình thiết kế.
Cám ơn vì sự quan tâm của bạn.

Văn học

Jeff Raskin, “Giao diện: hướng đi mới trong thiết kế hệ thống máy tính”
Alan Cooper, “Về giao diện. Nguyên tắc cơ bản của thiết kế tương tác"
Alan Cooper, “Bệnh viện tâm thần trong tay bệnh nhân”

Gửi công việc tốt của bạn trong cơ sở kiến ​​thức rất đơn giản. Sử dụng mẫu dưới đây

Các sinh viên, nghiên cứu sinh, các nhà khoa học trẻ sử dụng nền tảng kiến ​​thức trong học tập và công việc sẽ rất biết ơn các bạn.

Đăng trên http://www.allbest.ru/

Đăng trên http://www.allbest.ru/

CƠ QUAN GIÁO DỤC LIÊN BANG RF

Cơ sở giáo dục nhà nước

giáo dục chuyên nghiệp cao hơn

Nhà nước nhân đạo Nga trường đại học

Viện Khoa học Thông tin và Công nghệ An ninh

Khoa Tin học tổng hợp

BÀI KIỂM TRA

TRONG CÔNG NGHỆ THÔNG TIN

GIAO DIỆN ĐỒ HỌA VÀ CÔNG CỤ PHÁT TRIỂN CỦA CHÚNG

Lisichenok Konstantin Viktorovich

Thực tập 3 năm học

(thời gian học 4 năm)

Nhóm b (lĩnh vực thông tin)

Cố vấn khoa học,

Tiến sĩ, giáo viên: Mashintsov E.A.

Mátxcơva 2005

Kế hoạch

Giới thiệu

Hệ thống cửa sổ X

Cấu trúc hệ thống chung Cửa sổ X

Lập trình bằng thư viện X Toolkit Intrinsic (Xt)

Đối tượng Xt, phân loại của chúng

Nguồn thông tin

Giới thiệu

Lần đầu tiên vào năm 1959, tại hội nghị UNESCO về xử lý thông tin, Streci đề xuất một chế độ chia sẻ thời gian để giải quyết các vấn đề trên máy tính, từ thời điểm đó người ta thường tính thời điểm bắt đầu của điện toán tương tác và do đó, nghiên cứu về giao diện người-máy. Khi sức mạnh máy tính tăng lên, chi phí của thành phần đàm thoại của phần mềm cũng tăng theo. Vấn đề về hiệu quả của máy đã trở nên gay gắt hơn với sự gia nhập nhanh chóng vào thị trường máy trạm kết hợp khả năng tương tác với đồ họa. Thuật ngữ hiệu quả kể từ đó đã thay đổi ý nghĩa của nó - nếu trước đây nó phản ánh các đặc điểm như thời gian xử lý và dung lượng bộ nhớ bị chiếm dụng thì bây giờ nó được hiểu là dễ phát triển, dễ bảo trì và dễ làm việc với chương trình. Vì vậy, chi phí nghiên cứu và phát triển giao diện người dùng là hợp lý.

Sự phát triển của bất kỳ phần mềm ứng dụng nào thường liên quan đến việc tạo ra giao diện người dùng. Vì hầu hết các giao diện người dùng hiện đại đều dựa trên những ý tưởng tương tự (sử dụng chuột tích cực, tập trung vào các đối tượng, đồ họa, v.v. - bắt chước các quá trình và hiện tượng, khả năng sử dụng các thuật toán quen thuộc với mọi người trong cuộc sống hàng ngày), nên có một cơ hội và sự cần thiết phát triển phần mềm phụ trợ được thiết kế để tạo ra các giao diện “tiêu chuẩn” như vậy, hay đúng hơn là cơ sở của chúng.

Mặt khác, tính đa dạng và đa dạng của nền tảng phần cứng và hệ thống mà phần mềm này sẽ cần chạy trên đó đòi hỏi tính di động của nó ở cấp mã nguồn. Các yêu cầu trên dẫn đến ý tưởng về một công cụ phần mềm hợp nhất di động để tạo giao diện người dùng hoặc nếu chúng ta xem xét sản phẩm phần mềm ứng dụng cuối cùng, một hệ thống (mô-đun, khối) quản lý (quản lý, quản lý, duy trì, quản lý) giao diện với người dùng.

Bạn có thể phân loại các công cụ đó (công cụ Giao diện người dùng) theo sơ đồ sau:

* Hệ thống màn hình văn bản (curse, ncurse, v.v.).

* Hệ thống màn hình đồ họa.

* Hệ thống đa cửa sổ (WMS):

* hướng vào ký tự (văn bản);

* đồ họa;

*Bộ công cụ giao diện người dùng

* truyền thống;

* hướng đối tượng;

* UIDS - User Interface Development System - hệ thống phát triển giao diện người dùng (bộ công cụ);

* UIMS - Hệ thống quản lý giao diện người dùng - hệ thống (quản lý) giao diện người dùng (mô-đun phần mềm - một phần không thể thiếu của sản phẩm cuối cùng kết hợp với UIDS tương ứng);

* UIDE - User Interface Development Environment - Môi trường phát triển giao diện người dùng.

Sơ đồ này không có vẻ là một sự phân loại có hệ thống; đúng hơn, nó chỉ đơn giản là một sự liệt kê.

Hiện nay, những nỗ lực lớn đang được thực hiện để phát triển các phương pháp và tạo ra các công cụ trong các hệ thống có tên UIMS - Hệ thống quản lý giao diện người dùng.

Hệ thốngCửa sổ X

Cửa sổ X hoặc đơn giản X là một hệ thống tạo giao diện đồ họa người dùng, ban đầu trên các máy tính chạy UNIX. X được tạo ra tại MIT (Viện Công nghệ Massachusetts). Hiện tại, phiên bản 11.6 (X11R6) đã được phát hành và việc chuẩn bị cho việc phát hành phiên bản 7 đang được tiến hành tích cực.

Điểm đặc biệt của X Window là kiến ​​trúc của nó - nó được xây dựng theo sơ đồ client-server. Sự tương tác giữa máy khách X và máy chủ X xảy ra trong khuôn khổ giao thức lớp ứng dụng tương ứng - giao thức X. X Window không quan tâm đến phương tiện truyền tải được sử dụng, có thể là ổ cắm UNIX cục bộ hoặc bất kỳ mạng nào, ví dụ: TCP. Điều này có nghĩa là máy khách X và máy chủ X có thể “sống” trên các máy tính khác nhau, tức là. chương trình có thể thực hiện đầu vào/đầu ra thông tin đồ họa trên màn hình của một máy tính khác và sự khác biệt trong kiến ​​​​trúc của máy khách X và máy chủ X không đóng bất kỳ vai trò nào - điều này được đảm bảo bởi tiêu chuẩn giao thức X. Hệ thống cung cấp đầu ra đồ họa cho màn hình máy, nhận tín hiệu từ các thiết bị đầu vào như bàn phím và chuột rồi truyền chúng đến các chương trình. Cần lưu ý rằng thiết bị đầu ra có thể có nhiều màn hình. X cung cấp đầu ra cho bất kỳ trong số chúng. Tất cả điều này: màn hình (màn hình), thiết bị đầu vào (bàn phím, chuột) được gọi theo thuật ngữ X Window - hiển thị.

Nhờ kiến ​​trúc của nó, X Window có thể được sử dụng tự do trong các hệ thống máy tính phân tán, ví dụ như trong mạng TCP/IP (Internet).

X cho phép người dùng (phía sau màn hình) giao tiếp với nhiều chương trình cùng một lúc. Để ngăn đầu ra từ chúng bị trộn lẫn, hệ thống sẽ tạo “màn hình con ảo” - cửa sổ - trên màn hình hiển thị. Mỗi ứng dụng (theo quy định) chỉ vẽ trong cửa sổ (hoặc các cửa sổ) riêng của nó. X cung cấp một bộ công cụ để tạo các cửa sổ, di chuyển chúng xung quanh màn hình, thay đổi kích thước, hiển thị chúng, v.v.

Theo quy định, các chương trình có một tập hợp các tham số cấu hình - tài nguyên. Đây có thể là màu của cửa sổ, các thông số khác nhau của phông chữ văn bản (chữ ghép, kích thước, v.v.) và nhiều hơn nữa. Hệ thống tiêu chuẩn hóa cách xác định tài nguyên ứng dụng, quản lý chúng và chứa một số quy trình để làm việc với chúng. Tập hợp các chức năng này được gọi là “trình quản lý tài nguyên” (Trình quản lý tài nguyên Xrm - X). Việc "lưu trữ" các tham số chương trình được gọi là cơ sở dữ liệu tài nguyên.

X hoạt động theo hệ tư tưởng của kiến ​​trúc hướng sự kiện - nó tổ chức giao tiếp giữa chính các chương trình và giữa các chương trình với môi trường bên ngoài thông qua các sự kiện. Sự kiện là một đơn vị thông tin xác định các thay đổi hoặc hành động xảy ra trong hệ thống. Sử dụng mã định danh sự kiện, bạn có thể lấy thông tin về nó - loại sự kiện, đặc điểm của nó, nơi nó xảy ra, v.v.

Thiết bị X Window chung

Hệ thống Cửa sổ X là một tập hợp các chương trình và thư viện. “Trái tim” của nó là một chương trình đặc biệt - máy chủ X. Đây là một quá trình UNIX riêng biệt diễn ra trên máy tính có gắn màn hình. Máy chủ biết các tính năng của thiết bị cụ thể và biết những gì cần phải làm để hiển thị bất kỳ đối tượng đồ họa nào, chẳng hạn như đối tượng nguyên thủy, trên màn hình. Anh ta cũng có thể nhận biết và xử lý các tín hiệu đến từ bàn phím và chuột.

Máy chủ giao tiếp với các chương trình máy khách bằng cách gửi hoặc nhận các gói dữ liệu từ chúng. Nếu máy chủ và máy khách ở trên các máy khác nhau thì dữ liệu sẽ được gửi qua mạng và nếu trên cùng một máy thì kênh nội bộ sẽ được sử dụng. Ví dụ: nếu máy chủ phát hiện người dùng đã nhấn nút chuột, thì nó sẽ chuẩn bị gói (sự kiện) tương ứng và gửi nó đến máy khách trong cửa sổ có con trỏ chuột tại thời điểm nút được nhấn. Và ngược lại, nếu chương trình cần hiển thị nội dung nào đó lên màn hình hiển thị, nó sẽ tạo gói dữ liệu cần thiết và gửi đến máy chủ. Rõ ràng, một mô tả về sự tương tác này, các định dạng gói, v.v. và biên dịch đặc tả cho giao thức X nói trên.

Tuy nhiên, để lập trình cho X, bạn không cần biết chi tiết về việc triển khai máy chủ và giao thức X. Hệ thống này cung cấp một thư viện thủ tục tiêu chuẩn để các chương trình truy cập các dịch vụ X "ở mức cao". Vì vậy, để hiển thị một điểm trên màn hình, chỉ cần gọi quy trình tiêu chuẩn tương ứng, truyền cho nó các tham số cần thiết là đủ. Quy trình này sẽ thực hiện tất cả công việc tạo gói dữ liệu và truyền chúng đến máy chủ.

Cửa sổ X

Như đã đề cập trước đó, cửa sổ là một khái niệm cơ bản trong X. Thông thường, nó đại diện cho một vùng hình chữ nhật trên màn hình mà hệ thống cung cấp cho chương trình khách. Cái sau sử dụng một cửa sổ để hiển thị thông tin đồ họa.

Cửa sổ có một bên trong và một cạnh. Các thuộc tính chính của cửa sổ là chiều rộng và chiều cao của phần bên trong cũng như chiều rộng (độ dày) của cạnh. Các tham số này được gọi là hình học cửa sổ.

Mỗi cửa sổ được liên kết với một hệ tọa độ, gốc tọa độ nằm ở góc trên bên trái của cửa sổ (chính xác hơn là bên trong của nó). Trục x hướng sang phải và trục y hướng xuống dưới. Đơn vị đo trên cả hai trục là pixel.

X Window cho phép một chương trình tạo nhiều cửa sổ cùng một lúc. Họ được liên kết thành một hệ thống phân cấp trong đó một số là “cha mẹ” và những người khác là “con cháu”. Bản thân máy chủ tạo một cửa sổ chính trên mỗi màn hình, cửa sổ này là “cửa sổ mẹ” trên cùng của tất cả các cửa sổ khác. Cửa sổ này được gọi là cửa sổ "root".

Quản lý cửa sổ

Các cửa sổ có thể được định vị tùy ý trên màn hình, chồng lên nhau. X Window có một bộ công cụ mà chương trình máy khách có thể sử dụng để thay đổi kích thước cửa sổ và vị trí của chúng trên màn hình. Điểm đặc biệt của hệ thống là không tích hợp sẵn khả năng điều khiển windows bằng chuột hoặc bàn phím. Để làm điều này, bạn cần một khách hàng đặc biệt - trình quản lý cửa sổ.

Tuy nhiên, người quản lý không thể quản lý chính xác các cửa sổ nếu không biết gì về chúng. Windows có thể có nhiều thuộc tính khác nhau mà trình quản lý cửa sổ phải cung cấp: ví dụ: trong nhiều trường hợp, việc có tiêu đề cửa sổ là thuận tiện, trong những trường hợp khác, cửa sổ không thể được làm nhỏ hơn hoặc ngược lại - lớn hơn ở một kích thước nhất định. Cửa sổ có thể được "thu gọn" thành một biểu tượng ("biểu tượng") - trong trường hợp này người quản lý phải biết nên sử dụng biểu tượng nào và đặt tên cho nó là gì. Khách hàng có thể truyền đạt mong muốn của mình về windows tới người quản lý theo hai cách:

* khi tạo cửa sổ X, “gợi ý” có thể được truyền về vị trí ban đầu của cửa sổ, hình học, kích thước tối thiểu và tối đa, v.v.;

* bạn có thể sử dụng cách giao tiếp tích hợp giữa các chương trình trong X - cơ chế “thuộc tính”.

Tính năng đồ họa X Window

Hệ thống X Window được thiết kế để chạy trên màn hình raster. Số bit trên mỗi pixel được gọi là độ sâu hoặc độ dày của màn hình. Các bit có cùng số (cùng chữ số nhị phân) trong tất cả các pixel tạo thành một loại mặt phẳng, như thể song song với màn hình. Nó được gọi là mặt phẳng màu. X cho phép bạn vẽ trong (các) mặt phẳng màu bất kỳ mà không ảnh hưởng đến các mặt phẳng màu khác.

Giá trị pixel không trực tiếp đặt màu của một điểm trên màn hình mà đặt số ô trong một mảng đặc biệt trong đó giá trị màu được lưu trữ, tức là. giá trị pixel chỉ định số màu trong bảng màu hiện tại.

X có một tập hợp lớn các thủ tục cho phép bạn vẽ các đồ họa nguyên thủy: điểm, đường, cung, văn bản; làm việc với các khu vực có dạng tự do.

“Tính chất” và nguyên tử

X Window có các phương tiện tích hợp để cung cấp thông tin giữa các chương trình máy khách. Để làm điều này, cơ chế "thuộc tính" được sử dụng. "Thuộc tính" là cấu trúc thông tin được liên kết với một số đối tượng, chẳng hạn như cửa sổ, có sẵn cho tất cả máy khách X. Mỗi thuộc tính có một tên và một mã định danh duy nhất - một nguyên tử. Thông thường, tên tài sản được viết bằng chữ in hoa. Các nguyên tử được sử dụng để truy cập nội dung của các thuộc tính nhằm giảm lượng thông tin được gửi giữa máy khách và máy chủ X.

X cung cấp một số quy trình cho phép bạn dịch tên thuộc tính thành một nguyên tử duy nhất và ngược lại, thu được dữ liệu cần thiết cho một nguyên tử.

Một số thuộc tính và các nguyên tử tương ứng của chúng được xác định trước và được tạo tại thời điểm khởi tạo máy chủ.

Lập trình sử dụng thư việnBộ công cụ X nội tại (Xt)

Để lập trình trên hệ thống cửa sổ X dễ dàng hơn, một số gói đã được tạo. Tiêu chuẩn thực tế hiện nay là thư viện X Toolkit Intrinsics (Xt), được bao gồm trong bản phân phối tiêu chuẩn của hệ thống. Xt giúp bạn dễ dàng khởi tạo chương trình và tạo cửa sổ. Ngoài ra, thư viện còn chứa các công cụ tạo đối tượng (phần tử điều khiển) được các chương trình sử dụng khi giao tiếp với người dùng. Theo thuật ngữ Xt, phần tử điều khiển được gọi là widget.

Hiện tại, nhiều bộ phần tử điều khiển (đối tượng) khác nhau được triển khai trên cơ sở gói, ví dụ: Athena, OSF/Motif, Open Look. Những bộ công cụ này, kết hợp với chính Xt, được sử dụng như một công cụ tiện lợi để tạo giao diện. Họ đảm nhiệm công việc tẻ nhạt mà một lập trình viên sẽ phải thực hiện thủ công nếu anh ta viết ứng dụng của riêng mình chỉ bằng các thủ tục của thư viện lõi X Window.

Khái niệm cơ bản về Xt

lập trình giao diện đồ họa người dùng

đối tượng Xt

Gói Xt là cơ sở để tạo các phần tử điều khiển - widget (khoảng trống). Theo nghĩa Xt, một tiện ích chỉ đơn giản là một cấu trúc dữ liệu có các trường bao gồm ID của chính phần tử đó, ID của cửa sổ của nó, nếu có, v.v. Các thuộc tính của một đối tượng như vậy được gọi là tài nguyên. Ví dụ, tài nguyên widget có thể là màu của cửa sổ, màu của viền cửa sổ, phông chữ của văn bản hiển thị, v.v.

Mỗi đối tượng thuộc về một trong các lớp được xác định trước (lớp widget). Một lớp được hiểu theo nghĩa thông thường trong lập trình hướng đối tượng, tức là: một lớp có thể được coi là một tập hợp các thể hiện (đối tượng) có cùng đặc điểm. Các lớp Xt tạo thành một hệ thống phân cấp.

Trong quá trình hoạt động, chương trình tự tạo các đối tượng (thể hiện của lớp - widget). Chúng tạo thành các tập hợp, mỗi tập hợp cũng đại diện cho một hệ thống phân cấp nhất định. Mỗi hệ thống phân cấp như vậy được gọi là cây đối tượng (cây widget). Gốc của cây nhất thiết phải là một widget, thuộc về một trong các lớp con của lớp đặc biệt - Shell. Nếu trong số hai widget A và B của một cây đối tượng, đối tượng đầu tiên gần gốc hơn đối tượng thứ hai, thì A là đối tượng cha ("mẹ") của B và B là đối tượng con (hoặc đối tượng "con" ( child) của A. Như vậy, đối tượng shell là widget cha của tất cả các widget khác trong cây đối tượng. Chính anh ta là người tương tác giữa chương trình và người quản lý cửa sổ.

Hệ thống phân cấp được mô tả của các widget tương ứng với mối quan hệ giữa các cửa sổ của chúng, đây là một thuộc tính của X Window. Ngoài ra, một hệ thống phân cấp khác được áp đặt cho các đối tượng. Thực tế là trong quá trình hoạt động, một số đối tượng có thể điều khiển những đối tượng khác. Ví dụ: nếu một đối tượng có các đối tượng con, thì khi hình học thay đổi, nó có thể tự động xây dựng lại hình học của các đối tượng con cháu của nó. Để điều này xảy ra, một kết nối được thiết lập giữa các vật dụng - kết nối “điều khiển”. Mỗi đối tượng có thể có một hoặc nhiều đối tượng con được "quản lý" bởi nó.

Có ba cơ chế tương tác giữa một chương trình sử dụng Xt với tiện ích và X Window.

*Gọi lại

Thủ tục (“thủ tục gọi lại”). Đối với bất kỳ lớp nào, một tập hợp các hành động được xác định mà các đối tượng thuộc lớp đó phải phản ứng. Ví dụ: bất kỳ lớp nào cũng có phản hồi đối với việc phá hủy một widget. Khi một hành động được thực hiện, hàm Xt tiêu chuẩn hoặc một hoặc nhiều quy trình do chương trình cung cấp sẽ được gọi. Các chức năng như vậy được gọi là thủ tục gọi lại hoặc đơn giản là gọi lại.

*Hoạt động

-thủ tục. Chương trình có thể ra lệnh phản ứng với một sự kiện phức tạp cụ thể (nhóm sự kiện) đến từ Xt. Nếu một sự kiện xảy ra, Xt sẽ tìm kiếm và gọi hàm thích hợp.

* Trình xử lý sự kiện

- xử lý sự kiện. Phương pháp này tương tự như phương pháp trước, nhưng nhanh hơn và kém linh hoạt hơn. Nó cho phép bạn chỉ phản ứng với các sự kiện đơn giản (đơn lẻ), nhưng không phản ứng với chuỗi của chúng.

Sơ đồ lập trình chung

Các chương trình chạy trong X phải thực hiện một số bước tiêu chuẩn, chẳng hạn như thiết lập kết nối đến máy chủ, đặt các thuộc tính cần thiết cho trình quản lý cửa sổ và nhiều bước khác. Nếu Xt được sử dụng thì tất cả điều này được thực hiện bằng một quy trình - XtInitialize(). Nó tự khởi tạo gói, trình quản lý tài nguyên (\thuật ngữ quản lý tài nguyên) X Window và thực hiện các hoạt động cần thiết khác. Lệnh gọi tới XtInitialize() (hoặc XtAppInitialize()) phải đi trước tất cả các lệnh gọi thủ tục Xt khác. XtInitialize() trả về shell-widget ID, có thể được sử dụng làm gốc của cây đối tượng của chương trình. Thông thường, tên lớp của chương trình giống với tên của chính chương trình, chỉ có điều nó bắt đầu bằng chữ in hoa. Người quản lý tài nguyên sử dụng tên của chương trình và lớp để tra cứu các tham số của nó trong cơ sở dữ liệu tài nguyên.

Mỗi chương trình có thể thiết lập một số tham số trên dòng lệnh. Xt xác định các tham số "tiêu chuẩn" có thể được truyền khi chạy chương trình. Ngoài ra, dòng lệnh có thể chứa các tham số không chuẩn dành riêng cho ứng dụng này. XtInitialize() quét dòng lệnh và đặt các giá trị dữ liệu tương ứng vào cơ sở dữ liệu.

Trong quá trình khởi tạo, ngữ cảnh chương trình cũng được tạo - cấu trúc lưu trữ tất cả thông tin về ứng dụng. Bối cảnh nhằm bảo vệ chương trình khỏi ảnh hưởng của các sửa đổi khác nhau trong hệ điều hành. XtInitialize() tạo một số ngữ cảnh tiêu chuẩn (ngữ cảnh mặc định), tuy nhiên, bắt đầu từ phiên bản thứ tư của X, nên tạo một ngữ cảnh “cá nhân” riêng biệt cho từng phiên bản riêng lẻ của chương trình, theo đó, theo Xt , bạn nên gọi thủ tục XtAppInitialize() ( thay vì XtInitialize()). Ở đây lưu ý rằng một ứng dụng trong Xt không thể có một đối tượng như thường lệ mà có nhiều đối tượng “cấp cao nhất”.

Bước tiếp theo sau khi khởi tạo là giai đoạn tạo các phần tử điều khiển chương trình, mô tả mối quan hệ giữa chúng, thiết lập các phản ứng đối với các sự kiện khác nhau (đăng ký trình xử lý sự kiện và các đối tượng tương tự khác). Điều này có thể được thực hiện theo nhiều cách khác nhau, nhưng cách truyền thống là sử dụng, ví dụ: thủ tục XtCreateWidget() để tạo một đối tượng, thủ tục XtManagerChild() để chuyển quyền điều khiển một đối tượng sang cấp độ cha của nó, thủ tục XtAddEventHandler() để đăng ký xử lý sự kiện cho các widget, v.v. và như thế.

Sau khi tất cả các đối tượng chương trình được chuẩn bị hoạt động, các biểu diễn đồ họa của chúng (ví dụ: các cửa sổ tương ứng với các tiện ích này) được hiển thị trên màn hình bằng thủ tục XtRealizeWidget().

Giai đoạn tiếp theo là chu trình chính - chu trình nhận và gửi các sự kiện. Nó được triển khai bằng cách gọi thủ tục XtMainLoop() (XtAppMainLoop()).

Một chương trình chỉ sử dụng các thủ tục thư viện X lõi (Xlib) phải tự xem xét từng sự kiện đến (nhận nó từ hàng đợi sự kiện bằng lệnh gọi rõ ràng, chẳng hạn như XNextEvent() hoặc XPeekEvent()) và phản hồi tương ứng. Nếu một tác vụ có nhiều cửa sổ, thì trước khi thực hiện bất kỳ hành động nào, cần phải xác định sự kiện đã xảy ra ở cửa sổ nào và sự kiện này sẽ được xử lý ở cấp độ phân cấp nào (đối tượng này hoặc đối tượng cha của nó sẽ xử lý sự kiện này?) . Tất cả điều này là khá tẻ nhạt.

Xt đảm nhận tất cả các công việc thường ngày. XtMainLoop() nhận sự kiện tiếp theo và xác định cửa sổ mà sự kiện đó dự kiến. Có một widget tương ứng dọc theo cửa sổ. Đối với trường hợp sau, một trình xử lý sự kiện, thủ tục hành động hoặc lệnh gọi lại được xác định, đăng ký để phản ứng với sự kiện đã xảy ra. Nếu có bất kỳ mạng nào, chúng sẽ được gọi. Cơ chế được mô tả ở trên được gọi là phát sóng sự kiện.

XtMainLoop() (XtAppMainLoop()) tự động chấm dứt chương trình khi người quản lý cửa sổ yêu cầu.

Đối tượng Xt, phân loại của chúng

Xt cung cấp một bộ công cụ để tạo các đối tượng mà các chương trình sử dụng để giao tiếp với người dùng và nói chung với phần còn lại của thế giới bên ngoài.

Mỗi tiện ích do chương trình tạo ra là đại diện của lớp này hay lớp khác. Xt và các gói dựa trên nó, chẳng hạn như OSF/Motif, Athena, Tk/tcl, Open Look, v.v., có một số lượng lớn các lớp như vậy. Việc tạo các widget mới không được cung cấp trong các thư viện tiêu chuẩn cũng yêu cầu tạo (xác định) lớp tương ứng, đây thường là một công việc tốn thời gian.

Mỗi lớp có một số đặc điểm cố định chung cho tất cả các phiên bản của nó (ví dụ: danh sách các thủ tục gọi lại). Giá trị của những đặc điểm này có thể khác nhau giữa các đối tượng.

Tất cả các lớp Xt tạo thành một hệ thống phân cấp. Nếu lớp B gần đầu phân cấp hơn lớp D thì B được gọi là lớp cơ sở của D và D được gọi là lớp dẫn xuất (hoặc lớp con) của B.

Các lớp con kế thừa các đặc điểm của tất cả các lớp cơ sở của chúng. Điều này có nghĩa là một thể hiện của một lớp không chỉ có các đặc điểm của lớp đó mà còn có các thuộc tính của tất cả các lớp cơ sở.

Trong các chương trình, mỗi lớp được xác định bằng một biến trỏ đến cấu trúc dữ liệu tương ứng. Biến này được gọi là con trỏ tới lớp. Dữ liệu trong cấu trúc này được điền khi Xt được khởi tạo.

Các lớp tiện ích chính:

Sự vật. Một lớp trừu tượng (một lớp không tạo ra đối tượng của chính nó) được sử dụng làm gốc của cây tất cả các đối tượng. Nó chứa một lớp con duy nhất:

Trực tràngObj. Một lớp trừu tượng được sử dụng để xác định một số đặc điểm chung cần thiết cho hoạt động của các loại đối tượng khác nhau (ví dụ: đối với các đối tượng không có cửa sổ). Nó chứa một lớp con:

Cốt lõi. Gốc của cây các lớp widget có cửa sổ. Lớp này xác định các đặc điểm chung cho tất cả các đối tượng, chẳng hạn như kích thước của tiện ích và vị trí của nó trên màn hình. Chứa lớp con:

Tổng hợp. Các widget thuộc lớp này có thể là cha của các đối tượng khác. Các thể hiện của lớp Composite xác định hành vi sau cho các đối tượng con của chúng:

* đặt vị trí của các vật dụng “con” theo những hạn chế nhất định;

* khi bị hủy, giải phóng bộ nhớ được sử dụng bởi các đối tượng con (khi hủy một widget của lớp Composite, tất cả “hậu duệ” của nó sẽ bị hủy trước);

* kiểm soát sự xuất hiện của các cửa sổ của các widget con trên màn hình;

* kiểm soát việc chuyển tiêu điểm đầu vào giữa các đối tượng.

Lớp Composite chứa các lớp con:

Hạn chế. Lớp này là phần mở rộng hơn nữa của lớp cơ sở. Các phiên bản của nó có các khả năng bổ sung để kiểm soát quy mô và vị trí của các phiên bản con cháu của chúng. Ví dụ: các đối tượng con có thể được đặt theo thứ tự đặc biệt: theo hàng, trong cột, v.v.

Vỏ bọc. Đây là lớp đặc biệt được thiết kế để tương tác với trình quản lý cửa sổ. widget từ lớp này chỉ có thể có một con. Lớp Shell chứa các lớp con:

Ghi đèShell. Nó là một lớp con quan trọng của lớp Shell. Đối với cửa sổ tiện ích của lớp này, thuộc tính ghi đè_redirect được đặt thành Đúng, tức là. trình quản lý cửa sổ không kiểm soát nó. Theo quy định, cửa sổ của các đối tượng thuộc lớp này không có phụ kiện được trình quản lý cửa sổ thêm vào (tiêu đề, khung, nút tiêu chuẩn) và được sử dụng chủ yếu để tạo các loại menu khác nhau.

WMShel. Đây là lớp con đặc biệt của lớp Shell chứa các trường bổ sung cần thiết để tương tác với trình quản lý cửa sổ. Chứa:

Nhà cung cấpShell. Lớp này nhằm cung cấp khả năng tương tác với các trình quản lý cửa sổ đặc biệt. Lớp này chứa các lớp con:

TopLevelShell. Các widget của lớp này thường được sử dụng làm đối tượng shell của cây đối tượng chương trình. Anh ấy chứa:

Ứng dụngShell. Một chương trình thường chỉ có thể có một phiên bản thuộc lớp ApplicationShell.

TransientShell. Lớp này khác với lớp trước chỉ ở tính năng tương tác với trình quản lý cửa sổ. Không thể thu nhỏ các cửa sổ widget của lớp này (chuyển thành biểu tượng). Nhưng nếu đối tượng cha của lớp TransientShell bị biến thành một biểu tượng thì cửa sổ widget sẽ bị xóa khỏi màn hình. Lớp TransientShell được sử dụng để tạo các hộp thoại.

Mỗi lớp tiện ích và do đó các đối tượng được tạo trên cơ sở của nó có số lượng tham số khá lớn. Theo thuật ngữ Xt, chúng được gọi là "tài nguyên". Xt cung cấp nhiều công cụ để làm việc với chúng.

Các tính năng Xt bổ sung

Xt cung cấp cơ chế làm việc với các tệp (và các thiết bị bên ngoài nói chung) ở chế độ không đồng bộ. Một ứng dụng có thể đăng ký một thủ tục sẽ được gọi khi dữ liệu đã sẵn sàng hoặc khi xảy ra lỗi đọc/ghi.

Xt cung cấp cho ứng dụng khả năng thực hiện một số hành động nhất định trong khoảng thời gian nhất định. Ví dụ: hiển thị định kỳ thời gian hiện tại trên màn hình trong một cửa sổ nhất định, v.v. Với mục đích như vậy, một cơ chế Xt đặc biệt được sử dụng - bộ đếm thời gian. Nó cung cấp cuộc gọi tại một khoảng thời gian nhất định tới một chức năng đặc biệt do chương trình chỉ định.

Xt cung cấp khả năng thực hiện một số hành động khi hàng đợi sự kiện trống. Điều này được thực hiện bằng cách đăng ký một thủ tục "công việc" đặc biệt mà Xt sẽ gọi nếu hàng đợi sự kiện trống. Các chức năng như vậy thường được sử dụng để thực hiện các hành động và tính toán khác nhau trong thời gian rất ngắn.

Mỗi ứng dụng, nếu cần, có thể sửa đổi chu trình nhận và phân phối (xử lý) sự kiện thông thường - Xt cung cấp toàn bộ quy trình để làm việc với hàng đợi sự kiện.

Xt có một cơ chế được gọi là bộ tăng tốc, cho phép bạn giới thiệu các phần phụ thuộc của sự kiện và hành động. Trình tăng tốc tương tự như các thủ tục hành động với điểm khác biệt là một sự kiện (hoặc nhóm sự kiện) xảy ra trong một tiện ích sẽ bắt đầu lệnh gọi đến thủ tục hành động tương ứng cho một đối tượng khác.

Xt hỗ trợ một số cách để làm việc với các widget. Do đó, chương trình, sử dụng các quy trình do Xt cung cấp, có thể hiển thị một cửa sổ, đặt chế độ hoạt động này hoặc chế độ hoạt động khác cho nó và đóng cửa sổ khi không cần thiết. Các quy trình này chủ yếu được sử dụng để tạo các menu và hộp thoại bật lên. Theo quy định, tất cả các bộ tiện ích (ví dụ: OSF/Motif) đều có các quy trình riêng thuận tiện hơn nhiều để tạo menu và hộp thoại.

Các tiện ích bổ sung cho Xt Xt hiện được tập đoàn X tiêu chuẩn hóa cao, nhưng không có tiêu chuẩn cấp cao hơn. Phổ biến:

*Bộ công cụ OSF/Motif;

* Bộ tiện ích Athena;

* MỞ LOOK Bộ công cụ nội tại;

* Phỏng vấn;

*Tk/tcl.

Tiêu chuẩn phổ biến nhất và gần như thực tế có lẽ nên được coi là OSF/Motif.

Athena

Bộ tiện ích Athena được X Consortium cung cấp như một phần của bản phân phối tiêu chuẩn của X. Athena được tạo ra thông qua công việc phát triển các ứng dụng và tiện ích cốt lõi trong Dự án Athena tại MIT, dẫn đến Hệ thống X Window.

Athena ban đầu có đồ họa "phẳng" - tất cả các nút, menu và các thành phần giao diện khác đều không có bóng, tức là. đã bằng phẳng. Khoảng một năm trước, AW3d đã được phát hành - một biến thể của Athena Widgets, trong đó nhược điểm này đã được loại bỏ.

họa tiết

Open Software Foundation Motif (OSF/Motif) là gói bao gồm trình quản lý cửa sổ, một bộ tiện ích để thực hiện các hoạt động phụ trợ khác nhau và thư viện các đối tượng được xây dựng trên cơ sở Toolkit Intrinsics.

Motif hỗ trợ tất cả các lớp Xt và do đó là tài nguyên của các lớp đó, nhưng để ghi lại tên và lớp tài nguyên của đối tượng, các hằng số được sử dụng, bắt đầu bằng tiền tố XmN và XmC tương ứng. Để ghi lại loại tài nguyên, các hằng số có tiền tố XmR được sử dụng (thay vì XtR, được sử dụng trong Xt).

Motif mở rộng nhiều lớp đối tượng do Xt cung cấp. Đặc biệt, Motif hỗ trợ một tập hợp các lớp khá lớn cho phép bạn tạo menu, thanh cuộn), các nút bấm, thành phần chỉnh sửa, v.v.

Ngoài ra, Motif còn cung cấp một lớp đối tượng đặc biệt gọi là tiện ích - những đối tượng này tạo thành một lớp riêng biệt trong Motif, XmGadget, là một lớp con của lớp RectObj. Chúng cũng có thể được sử dụng để tạo các thành phần giao diện, nhưng có điểm đặc biệt là chúng không có cửa sổ riêng. Để vẽ, một tiện ích sử dụng cửa sổ chính của tiện ích đó.

Mỗi lớp tiện ích có nhiều lựa chọn về cả tài nguyên kế thừa và tài nguyên bổ sung dành riêng cho nó. Chúng cho phép bạn kiểm soát các đặc điểm quan trọng của đối tượng như màu nền, vị trí trên màn hình, phông chữ của văn bản hiển thị, v.v.

Một số lớp Motif không được sử dụng để tạo các phiên bản widget (các lớp như vậy được gọi là lớp trừu tượng trong thuật ngữ lập trình hướng đối tượng). Chúng chứa các thuộc tính và phương thức phổ biến nhất cần thiết cho hoạt động của nhiều loại vật dụng khác nhau.

Motif có hai lớp đối tượng chính: XmPrimitive và XmManager (lớp XmGadget đã được đề cập trước đó). Cả hai lớp này đều trừu tượng. Lớp đầu tiên kế thừa từ lớp Core và được sử dụng làm cơ sở cho các lớp đối tượng không sở hữu các đối tượng khác. Ví dụ như các nút có thể nhấp, danh sách, v.v. Lớp XmManager kế thừa từ lớp Constraint và được sử dụng để tạo các đối tượng có thể có và quản lý các đối tượng con.

Phân loại đồ vật

Lớp XmGadget. Khi các phiên bản của các lớp đối tượng Motif thông thường (widget) được tạo, một cửa sổ tương ứng sẽ xuất hiện. Nếu một chương trình sử dụng nhiều widget, điều này sẽ dẫn đến ứng dụng bị chậm đáng kể. Thời gian được dành cho cả việc tạo các cửa sổ và làm việc tiếp theo với chúng. Nhưng dễ dàng nhận thấy việc có một cửa sổ riêng cho từng đối tượng là không cần thiết chút nào. Nhãn, nút và nhiều vật dụng khác có thể được sử dụng thành công để vẽ các cửa sổ của đối tượng gốc của chúng. Không có cửa sổ - không cần liên hệ lại với máy chủ, năng suất tăng lên và bộ nhớ bổ sung không bị lãng phí.

Thực hiện chính xác ý tưởng này, các nhà phát triển Motif đã sao chép một số lớp đối tượng, tạo ra hai phiên bản - có cửa sổ và không có cửa sổ. Các phiên bản của đối tượng không có cửa sổ bắt nguồn từ hệ thống phân cấp của chúng từ một lớp trừu tượng - XmGadget và chúng có cùng tên chung. Lớp đối tượng đặc biệt này kế thừa các đặc điểm của nó từ lớp RectObj, lớp này là một lớp trừu tượng chứa các cơ chế cơ bản để kiểm soát hình dạng của các đối tượng.

Ngoài thực tế là các tiện ích không có cửa sổ riêng, các hạn chế khác cũng được áp dụng đối với chúng. Do đó, các trình xử lý sự kiện và bảng dịch không thể được xác định cho chúng. Ngoài ra, các tiện ích không thể có các đối tượng con cháu. Mặt khác, chức năng của tiện ích và tiện ích tương ứng là giống nhau, vì vậy chúng tôi sẽ không mô tả chúng một cách riêng biệt mà chỉ liệt kê chúng.

Lớp XmGadget chứa các lớp con:

* Tiện ích XmArrowButton.

* XmLabelGadget.\hfil

* Tiện ích XmPushButton.

* XmToggleButtonGadget.

* Tiện ích XmCascadeButton.

* Tiện ích XmSeparator.

Lớp XmPrimitive. Lớp trừu tượng này chứa:

XmArrowButton. Một thể hiện của lớp là một nút có mũi tên chỉ hướng được vẽ trên đó. Nút có thể được bấm bằng chuột hoặc bàn phím. Đường viền của phần tử điều khiển có thể có bóng, nó được sử dụng để hiển thị các trạng thái khác nhau mà đối tượng có thể: tự do ("nhả") và được nhấn.

XmLabel. Đại diện của lớp này (nhãn) là một trong những đối tượng Motif đơn giản nhất. Nhãn được thiết kế để hiển thị thông tin: văn bản hoặc hình ảnh (bitmap).

XmPushButton. Đại diện của lớp này là các nút bấm hình chữ nhật trong đó có thể vẽ một dòng văn bản.

Ví dụ: nếu một đối tượng được chọn bằng cách nhấn nút chuột trái trong khi con trỏ ở trên đối tượng, thì màu của đường viền của tiện ích sẽ thay đổi, điều này tạo ra hiệu ứng nhấp chuột. Sau khi nhả nút, màu đường viền sẽ được khôi phục. Bạn cũng có thể nhấp vào một tiện ích như vậy từ bàn phím - để thực hiện việc này, bạn cần đặt tiêu điểm đầu vào cho đối tượng và nhấn phím cách (thường).

Nút XmDrawn. Các đối tượng của lớp này tương tự như các nút có thể nhấp được với điểm khác biệt duy nhất là không phải văn bản được vẽ trong đó mà là một hình ảnh tùy ý (bản đồ pixel).

XmToggleButton. Đối tượng của lớp này là một nút nhỏ, bên cạnh đó thường có văn bản giải thích. Một nút có thể ở hai trạng thái: bật và tắt (tức là nó là một công tắc). Chúng được đánh dấu bằng sự thay đổi về hình thức của phần tử điều khiển.

Một đại diện của lớp này được sử dụng để tạo ra cái gọi là "nút kiểm tra", sẽ khôn ngoan hơn khi gọi "dấu kiểm" và "nút radio" - công tắc đa vị trí. Những cái đầu tiên được sử dụng để đặt tham số logic, tức là. có hai ý nghĩa. Cái sau phục vụ một mục đích tương tự, nhưng tập hợp các giá trị trong trường hợp này là hữu hạn và chứa nhiều hơn hai phần tử. Trong trường hợp này, dạng biểu diễn đồ họa của một đối tượng thuộc loại XmToggleButton phụ thuộc vào việc nó được sử dụng làm nút “dấu kiểm” hay nút “radio”.

Theo quy định, các tiện ích của lớp XmToggleButton được kết hợp thành các cấu trúc được gọi tương ứng là hộp kiểm và hộp radio. Các khối này lần lượt thể hiện sự sửa đổi các đối tượng của lớp XmRowColumn được mô tả bên dưới.

Nút XmCascade. Các đối tượng của lớp này đại diện cho các nút có thể nhấp và được sử dụng khi tạo menu. Khi bạn nhấp vào một đối tượng, một menu con ở cấp độ tiếp theo sẽ xuất hiện.

XmList. Đại diện của lớp này là một số đối tượng Motif thú vị nhất. Chúng được thiết kế để hiển thị danh sách các chuỗi và cung cấp cho người dùng cơ hội thực hiện các hành động khác nhau với các thành phần của danh sách. Người dùng có thể chọn một hoặc nhiều hàng được biểu thị trong đối tượng này và chúng sẽ được đánh dấu. Ngoài ra, nếu danh sách có tiêu điểm đầu vào thì một trong các thành phần của danh sách đó sẽ được đánh dấu bằng khung chấm. Khung này được gọi là con trỏ danh sách.

XmScrollBar. Các đối tượng của lớp này - thanh cuộn (thanh cuộn), theo quy tắc, được sử dụng cùng với các đối tượng khác, chẳng hạn như danh sách (XmList), văn bản (XmText) và các đối tượng khác. Thanh cuộn được thiết kế để cuộn một khu vực nếu thông tin được trình bày trong đó (danh sách, văn bản, hình ảnh, v.v.) không thể hiển thị hoàn toàn trong cửa sổ. Các đối tượng của lớp XmScrollBar biểu thị một dải (ngang hoặc dọc), dọc theo các cạnh của dải đó có các nút mũi tên. Nhấp vào bất kỳ trong số chúng sẽ cuộn theo hướng được chỉ định bởi mũi tên. Trên thanh cuộn có một thanh trượt (thanh trượt) - một hình chữ nhật được tô màu. Nếu bạn “móc” nó bằng chuột và “kéo” nó, thì theo quy luật, điều này cũng dẫn đến việc cuộn khu vực.

XmSeparator. Các đối tượng của lớp này - dấu phân cách - thường được sử dụng để cải thiện giao diện của các cửa sổ ứng dụng. Tiện ích này là một dải (đường) dọc hoặc ngang ngăn cách các nhóm đối tượng. Ví dụ: dấu phân cách có thể được sử dụng trong menu để phân tách một số lệnh khỏi các lệnh khác, trong hộp thoại - để tách một nhóm nút được nhấn khỏi các thành phần khác, v.v.

XmText. Các đối tượng của lớp này cho phép bạn hiển thị một hoặc nhiều dòng văn bản. Nếu các dòng không vừa với cửa sổ, thì hình ảnh có thể được cuộn sang trái, phải và lên xuống. Văn bản có thể được chỉnh sửa - chế độ chỉnh sửa có thể được thay đổi bằng cách cài đặt tài nguyên đối tượng tương ứng.

Motif cung cấp một số quy trình thuận tiện cho phép bạn thực hiện nhiều thao tác khác nhau với tiện ích thuộc lớp này: lấy và sửa đổi dữ liệu, sao chép một phần dữ liệu đã chọn vào bộ đệm hệ thống (clipboard), v.v.

XmTextField. Các đối tượng của lớp này cho phép bạn xem và chỉnh sửa một dòng văn bản.

Lớp XmManager. Lớp này là trừu tượng, tức là không được sử dụng để tạo ra các đối tượng. Nó định nghĩa các tham số cơ bản cần thiết để xây dựng các lớp widget có thể thao tác với các đối tượng khác. Những tài nguyên này cần thiết để hiển thị chính xác các tiện ích con và kiểm soát xem chúng có nhận được tiêu điểm đầu vào hay không.

Lớp XmManager chứa:

XmBulletinBoard. Các đối tượng của lớp này có thể có các đối tượng con được đặt trong cửa sổ theo bất kỳ cách nào. Tọa độ của các cửa sổ tiện ích con được đo trong hệ tọa độ có gốc tọa độ ở góc trên bên trái cửa sổ của đối tượng thuộc lớp XmBulletinBoard.

Ví dụ: khi bạn thay đổi kích thước của một đối tượng, bằng cách sử dụng chuột, vị trí ban đầu của các đối tượng con sẽ không thay đổi hoặc chúng được di chuyển để tránh giao nhau. Nếu cửa sổ widget trở nên nhỏ hơn, các phần của đối tượng con có thể trở nên vô hình.

Lớp XmBulletinBoard chứa:

XmForm. Một tính năng đặc biệt của các đối tượng thuộc lớp (biểu mẫu) này là khả năng kiểm soát vị trí của các đối tượng con của chúng bằng cách thiết lập các kết nối giữa chính biểu mẫu đó và tiện ích con cũng như giữa chính các đối tượng con đó.

Đối với mỗi tiện ích con, bạn có thể chỉ định xem cạnh trái, phải, dưới hoặc trên của nó được gắn vào hay không. Vì vậy, nếu các cạnh trái và phải của một đối tượng con được gắn vào cạnh phải của biểu mẫu, thì khoảng cách từ chúng đến cạnh này sẽ luôn giữ nguyên. Nếu kích thước của biểu mẫu giảm, đối tượng con sẽ di chuyển sang trái và nếu kích thước tăng thì nó sẽ di chuyển sang bên phải. Bạn có thể liên kết một tiểu dự án này với một tiểu dự án khác. Sau đó, việc thay đổi vị trí của đối tượng con mà tiện ích được liên kết sẽ dẫn đến việc di chuyển đối tượng bị ràng buộc để duy trì khoảng cách giữa chúng.

Khi thay đổi kích thước của biểu mẫu, tất cả các kết nối giữa các đối tượng con của nó sẽ được giữ nguyên.

XmSelectionBox. Các đối tượng của lớp này (“khối lựa chọn”) đại diện cho một ví dụ về tiện ích tổng hợp và bao gồm một danh sách có thể cuộn trong đó người dùng có thể chọn phần tử mình cần, cũng như trường văn bản (đối tượng XmTextField) trong đó mục được chọn trong danh sách là hiển thị. Người dùng có thể chỉnh sửa lựa chọn được thực hiện. Danh sách và trường văn bản có thể có các nhãn giải thích, được chỉ định bằng cách sử dụng tiện ích tương ứng của lớp XmLabel. Đối tượng lớp XmSelectionBox cũng bao gồm ba nút có thể đẩy được (đối tượng XmPushButton). Theo mặc định, chúng được gắn nhãn "Ok", "Hủy" và "Trợ giúp". Và cuối cùng, còn một yếu tố nữa - một nút có thể nhấp, được gọi là "Áp dụng" theo mặc định. Ban đầu, đối tượng con này được tạo nhưng không có trong danh sách các tiện ích được quản lý.

Sử dụng khối lựa chọn, người dùng có thể chọn chuỗi con mình cần trong danh sách hoặc nhập chuỗi đó vào trường văn bản. Các cài đặt được xác nhận bằng cách nhấn nút "Ok".

Lớp XmSelectionBox bao gồm:

XmCommand. Các đối tượng của lớp này cung cấp cho người dùng cơ hội chọn lệnh mong muốn bằng cách sử dụng danh sách các lệnh đã nhập hoặc bằng cách nhập lệnh vào trường văn bản được cung cấp riêng cho lệnh này trong tiện ích.

XmFileSelection. Các đối tượng của lớp này cho phép bạn xem nội dung hiện tại của các thư mục khác nhau và chọn một tệp cụ thể.

Các đối tượng của lớp này chứa các phần tử:

* 2 trường văn bản: "Filter" và "Selection" (đối tượng của lớp XmNextField);

* 2 danh sách: "Directories" và "Files" (đối tượng của lớp XmList);

* 4 nút có thể đẩy: "Ok", "Filter", "Cancel" và "Help" (đối tượng của lớp XmPushButton);

Trường văn bản "Bộ lọc" chỉ định một mặt nạ (mẫu) để chọn từ toàn bộ tập hợp tệp một tập hợp con nhất định thỏa mãn điều kiện được chỉ định trong trường này - khớp với mẫu - chính tập hợp con này được hiển thị trong danh sách "Tệp". Danh sách "Thư mục" hiển thị các thư mục con của thư mục hiện tại. Trường văn bản "Lựa chọn" hiển thị tệp (tên của nó) được chọn trong danh sách "Tệp" và trong cùng trường văn bản, người dùng có thể nhập tên đầy đủ của tệp mình cần theo cách thủ công. Bốn nút có thể nhấn được sử dụng để thực hiện các hành động khác nhau:

Ok - chọn tệp được chỉ định;

Bộ lọc - cập nhật danh sách các tệp được hiển thị trong trường văn bản "Tệp" theo mặt nạ hiện tại;

Hủy - đóng cửa sổ tiện ích, không có lựa chọn tệp nào xảy ra;

Trợ giúp - một lời kêu gọi giúp đỡ.

XmMessageBox. Các đối tượng của lớp này nhằm mục đích cung cấp cho người dùng các thông báo phát sinh trong quá trình vận hành chương trình. Tiện ích này là tổng hợp. Nó có một khu vực hiển thị một dòng văn bản (tin nhắn) và một biểu tượng đặc biệt mô tả loại tin nhắn. Ngoài ra, đối tượng còn có ba nút bấm được. Theo mặc định, chúng được gắn nhãn: "Ok", "Hủy" và "Trợ giúp".

Khu vực vẽ Xm. Các đối tượng của lớp này cung cấp cho chương trình một cửa sổ để vẽ và hiển thị thông tin. Bản thân lớp này không cung cấp các tham số có thể được sử dụng trực tiếp để hiển thị đồ họa. Tuy nhiên, danh sách các thủ tục gọi lại có sẵn trong lớp này cho phép bạn nhận được thông báo về nhu cầu vẽ lại cửa sổ tiện ích và về việc nhận tiêu điểm đầu vào.

XmFrame. Các đối tượng của lớp này được sử dụng để làm nổi bật một số đối tượng so với các đối tượng khác bằng cách bao quanh chúng bằng một khung. Điểm đặc biệt của lớp widget này là chúng chỉ có thể có và quản lý một subobject.

XmPanedWindow. Các đối tượng của lớp này có thể kết hợp các vật dụng không đồng nhất. Các đối tượng con được tách biệt với nhau và một phần tử đặc biệt gọi là sash được đặt giữa chúng. Nó trông giống như một hình vuông nhỏ và được sử dụng để thay đổi kích thước các widget con. Vì vậy, nếu một đối tượng của lớp XmPanedWindow có hai đối tượng con, thì bạn có thể thực hiện các thao tác sau: “móc” khung bằng chuột và “kéo” nó theo hướng mong muốn (từ trên xuống hoặc từ trái sang phải) - trong khi kích thước theo chiều dọc (kích thước dọc theo hướng mà nó được "kéo" khung) một đối tượng con sẽ tăng lên "gây thiệt hại" cho đối tượng kia (kích thước của đối tượng kia sẽ giảm), kích thước ngang của cả hai đối tượng con sẽ được giữ nguyên. Kích thước "bên" của một đối tượng thuộc lớp XmPanedWindow được xác định bởi kích thước tương tự tối đa của các đối tượng con của nó.

Cột XmRow. Các đối tượng của lớp này có thể kết hợp các vật dụng không đồng nhất. Các đối tượng con được sắp xếp theo một thứ tự nhất định - dưới dạng ma trận. widget của lớp XmRowColumn là cơ sở để tạo các đối tượng sau:

hộp kiểm - “khối các nút có thể kiểm tra” (tức là các đối tượng của lớp XmToggleButton hoặc lớp XmToggleButtonGadget); Trong số các nút có sẵn trong “khối”, một số nút có thể được chọn (“bật”) cùng một lúc;

hộp radio - “khối nút radio” (tức là các đối tượng XmToggleButton hoặc XmToggleButtonGadget); Trong số các nút có sẵn trong “khối”, mỗi lần chỉ có thể chọn một nút (“bật”);

menu kéo xuống - "menu thả xuống" - cửa sổ menu con xuất hiện sau khi chọn một nút trong menu cấp cao nhất (thanh menu); các mục menu được sắp xếp theo chiều dọc;

menu tùy chọn - nút có menu liên quan; khi bạn nhấp vào nút, một cửa sổ menu sẽ xuất hiện để chọn một giá trị tham số; các mục menu được sắp xếp theo chiều dọc;

menu bật lên - một “menu bật lên”, thường được gọi bằng cách nhấp vào nút chuột thứ ba; cửa sổ menu xuất hiện ở vị trí con trỏ của cô ấy; các mục menu được sắp xếp theo chiều dọc;

thanh menu - menu cấp cao nhất chứa một số nút (đối tượng của lớp XmCascadeButton hoặc XmCascadeButtonGadget), được sử dụng để gọi các menu con khác nhau (menu kéo xuống); Các mục menu được sắp xếp theo chiều ngang.

XmScale. Đối tượng của lớp này là một vùng hình chữ nhật chứa một thanh trượt cố định, bằng cách sử dụng thanh trượt này, người dùng có thể chọn giá trị của tham số liên quan đến đối tượng từ một phạm vi được chỉ định.

XmScrolledWindow. Một đối tượng của lớp này cung cấp khả năng hiển thị và xem một số thông tin (văn bản, hình ảnh, danh sách). Một tiện ích như vậy, theo quy tắc, chứa một tiểu dự án chứa dữ liệu dự định xem (đây có thể là một đối tượng của lớp XmText, XmdrawArea, v.v.). Để xem dữ liệu thuận tiện hơn, các thanh cuộn ngang và dọc có thể được dùng.

Lớp này chứa một lớp con

XmMainWindow. Các đối tượng của lớp này đại diện cho một thành phần giao diện riêng biệt, thường bao gồm các phần sau:

* thực đơn cấp cao nhất,

* cửa sổ lệnh,

* "Không gian làm việc,

* cửa sổ tin nhắn,

* và hai thanh cuộn (ngang và dọc).

Các đối tượng con có thể được phân tách bằng dấu phân cách.

Các lớp XmMenuShell và XmDialogShell. Motif cung cấp lớp đối tượng XmMenuShell để tạo các menu khác nhau. Lớp này kế thừa từ lớp OverrideShell (từ Xt).

Như đã đề cập khi mô tả Xt, lớp TransientShell được sử dụng để tạo các đối tượng chương trình, một mặt, liên hệ trực tiếp với trình quản lý cửa sổ, mặt khác, có các tính năng phân biệt chúng với các cửa sổ cấp cao thông thường. Một trong những tính năng chính của những tính năng này là không thể thu nhỏ tiện ích của lớp TransientShell. Nhưng chúng sẽ bị xóa khỏi màn hình nếu cha mẹ biến thành biểu tượng. Loại widget này thường được sử dụng để tạo các cửa sổ chương trình phụ trợ.

Motif sử dụng các thuộc tính được chỉ định của lớp TransientShell và mở rộng chúng vào lớp dẫn xuất XmDialogShell. Cái sau đóng vai trò là đối tượng shell của hộp thoại.

Cấu trúc hộp thoại trong Motif có thể được biểu diễn như sau:

Đối tượng lớp XmDialogShell

Đối tượng lớp con XmManager, chẳng hạn như XmBulletinBoard hoặc XmForm

Các yếu tố điều khiển khác nhau: nút, trường nhập văn bản, v.v.

Thư viện có một bộ quy trình tạo điều kiện thuận lợi cho việc tạo ra thiết kế được mô tả.

Đối thoại

Như đã nêu, thiết kế của hộp thoại trong Motif như sau: đầu tiên có một đối tượng của lớp XmDialogShell, sau đó bao gồm một widget của một trong các lớp con của lớp XmManager; đối tượng này được sử dụng để lưu trữ các đối tượng khác nhau.

Thư viện cung cấp các thủ tục đặc biệt để tạo các cuộc đối thoại. Chúng khác nhau ở kiểu widget, là con của đối tượng lớp XmDialogShell.

Đầu ra văn bản

Thư viện có số lượng widget khá lớn dùng để hiển thị thông tin văn bản. Đây là XmLabel với các lớp con, XmText, v.v. Để chỉ định các phông chữ có thể sử dụng khi vẽ đường, tài nguyên XmNfontlist được sử dụng. Nó thuộc loại XmFontlist. Ý nghĩa của nó là một tập hợp các cặp “font”/”font tag”.

Thẻ (nhãn) nhằm mục đích làm cho các chương trình độc lập với các phông chữ cụ thể do người dùng chỉ định. Điều này được thực hiện như sau: ứng dụng được tạo theo cách mà tất cả các chức năng hoạt động với các dòng văn bản không chứa phông chữ mà chứa nhãn của chúng. Khi tác vụ được biên dịch và bắt đầu, sự tương ứng giữa các thẻ và phông chữ cụ thể sẽ được xác định. Cái sau được sử dụng để vẽ.

Motif có các công cụ không chỉ để làm việc với các chuỗi văn bản được hiển thị bằng một phông chữ duy nhất mà còn cho phép bạn làm việc với các đối tượng như “chuỗi tổng hợp” - tức là. dòng văn bản sử dụng nhiều phông chữ. Có một bộ công cụ để tạo các chuỗi như vậy, làm việc với chúng và chuyển đổi chúng thành các chuỗi "một phông chữ" thông thường.

Làm việc với hình ảnh

Bản thân Motif hoạt động với hình ảnh, trình bày chúng ở định dạng bên trong, là một bitmap đơn giản, được chỉ định bằng cấu trúc XImage.

Kiểm soát tiêu điểm đầu vào

Motif hỗ trợ hai mô hình lấy nét đầu vào. Đầu tiên trong số chúng là ẩn (con trỏ): tiêu điểm được đặt cho tiện ích mà con trỏ chuột di chuyển vào. Mô hình thứ hai rất rõ ràng: để chuyển tiêu điểm, bạn cần đặt con trỏ chuột vào cửa sổ tiện ích và nhấp vào nút chuột trái. Khi một tiện ích hoặc tiện ích nhận được tiêu điểm đầu vào, đường viền của nó sẽ được đánh dấu.

Ngoài các mô hình chuyển và nhận tiêu điểm đầu vào này, còn có một cơ chế chuyển tiêu điểm đầu vào từ tiện ích này sang tiện ích khác. Các đối tượng có thể được kết hợp thành các nhóm - điều này có thể được thực hiện bằng cách đặt các giá trị cần thiết của các tài nguyên tương ứng hoặc có thể để lại cho hệ thống. Trong trường hợp sau, Motif tự động liên kết tiện ích bằng các quy tắc tích hợp sẵn. Vì vậy, ví dụ, một đối tượng của lớp XmMessageBox chứa ba nhóm: một là đối tượng hộp thoại “chính” (lớp XmForm), thứ hai là “nhãn” trong đó thông báo được hiển thị cho người dùng, nhóm thứ ba là đối tượng có thể nhấn được. nút.

Trọng tâm đầu vào được chuyển cả từ đối tượng này (trong một nhóm) sang đối tượng khác và từ nhóm này sang nhóm khác.

Việc chuyển tiêu điểm trong một nhóm được thực hiện bằng các phím mũi tên và từ nhóm này sang nhóm khác bằng phím tab (đó là lý do tại sao các nhóm này được gọi là nhóm Tab). Khi một nhóm được lấy tiêu điểm, tiêu điểm đầu vào trong nhóm đó sẽ được trao cho đối tượng đầu tiên có thể nhận tiêu điểm (một đối tượng có thể bị ngăn không cho nhận tiêu điểm bằng cách đặt tài nguyên tương ứng thành một giá trị thích hợp). Thứ tự chuyển tiêu điểm đầu vào trong một nhóm giống như thứ tự tạo các tiện ích của nhóm đó. Trong trường hợp này, tổ hợp phím thường sẽ di chuyển tiêu điểm theo hướng ngược lại.

Motif cũng cung cấp một số thủ tục có thể được sử dụng để kiểm soát tiêu điểm đầu vào.

Lesstif Gần đây, một phần mềm miễn phí tương tự Motif đã được phát hành, hoàn toàn tương thích với nó. Nó được gọi là Lesstif. Nó có sẵn miễn phí ở dạng ban đầu và được biên dịch cho nhiều nền tảng khác nhau trên Internet.

Tk/tcl

Tcl - read: - là viết tắt của: "ngôn ngữ lệnh công cụ" (ngôn ngữ lệnh nhạc cụ). Nó bao gồm hai phần: ngôn ngữ và thư viện.

Ngôn ngữ tcl có cú pháp đơn giản và dễ lập trình. Ở dạng ban đầu, tcl là một trình thông dịch. Cho phép bạn tạo các cấu trúc mới, chẳng hạn như chức năng hoặc chương trình, cung cấp cho lập trình viên lành nghề một công cụ mạnh mẽ để phát triển không chỉ các ứng dụng cuối cùng mà còn cả phần mở rộng ngôn ngữ TCL của riêng anh ta, tạo và duy trì phong cách riêng của anh ta.

Thư viện tcl cung cấp khả năng sử dụng trình thông dịch ngôn ngữ TCL trong các chương trình ứng dụng và do đó bao gồm các tập lệnh được viết bằng ngôn ngữ lệnh TCL trong các chương trình. Thư viện chứa bộ phân tích từ vựng cho ngôn ngữ TCL, các hàm thực hiện các lệnh TCL tích hợp và cho phép bạn đính kèm các chương trình con của người dùng (lệnh gọi hàm) vào các lệnh TCL. Sự sắp xếp này có thể thực hiện được cho cả C và C++.

Tk là bộ công cụ tương thích với Motif để phát triển giao diện người dùng đồ họa trong môi trường X Window. Ngoài giao diện chuẩn cho C và C++, nó còn bao gồm giao diện cho tcl, cung cấp khả năng sử dụng các công cụ Tk từ bên trong môi trường trình thông dịch lệnh tcl. Điều này có nghĩa là ngoài lập trình tiêu chuẩn trong C và C++, các phần giao diện của ứng dụng có thể được triển khai dưới dạng tập lệnh bằng ngôn ngữ TCL và các phần giao diện này (hộp thoại, bố cục màn hình, v.v.) có thể được chỉnh sửa linh hoạt trong quá trình thực hiện. hoạt động của chương trình cuối cùng, sử dụng lệnh tcl

Môi trường cửa sổ mong muốn cho phép bạn tạo các ứng dụng có giao diện người dùng đồ họa chỉ bằng ngôn ngữ TCL.

Tài liệu tương tự

    Hệ thống lập trình và khả năng đồ họa của chúng. Phát triển khóa học đa phương tiện nhằm thúc đẩy việc học tập hiệu quả của học sinh cơ bản về chủ đề “Khả năng đồ họa của ngôn ngữ lập trình” (sử dụng ví dụ về ngôn ngữ lập trình Cơ bản và Pascal).

    luận văn, bổ sung 29/12/2010

    Màn hình các thành phần đồ họa, đối tượng hệ thống và chức năng. Một hệ thống phương tiện để người dùng tương tác với thiết bị. Lịch sử giao diện người dùng đồ họa của máy tính cá nhân, phân loại của chúng. Hệ thống cửa sổ X.

    trình bày, thêm vào ngày 22/05/2012

    Khả năng lập trình và đồ họa cơ bản. Các cấu trúc cơ bản cho dạng xem và hai hàm tạo có đối số. Các tọa độ khác của điểm và khởi tạo một điểm mới. Lưu trữ và thay đổi tọa độ góc trên bên trái của hình chữ nhật.

    công việc trong phòng thí nghiệm, thêm vào ngày 01/12/2011

    Đồ họa máy tính các vector. Đồ họa nguyên thủy. Khả năng đồ họa của ngôn ngữ lập trình Pascal. Hướng dẫn học đồ họa bằng ngôn ngữ lập trình Pascal. Vẽ đồ thị hàm số.

    bài tập khóa học, được thêm vào ngày 13/06/2007

    Phát triển chương trình cho hệ điều hành Windows sử dụng VisualC++ (6.0, .NET). Xem xét những điều cơ bản về mô hình hóa phần mềm hoạt động của một thiết bị (ấm đun nước điện). Quy tắc tạo các lớp thiết bị và giao diện đồ họa của nó.

    bài tập khóa học, được thêm vào ngày 03/06/2014

    Đô họa may tinh. Trình bày thông tin đồ họa trên máy tính. Các định dạng đồ họa. Biên tập đồ họa. Đồ họa vector. Tên một phần mềm đồ họa. Đặc điểm của chương trình và giao diện. Khả năng công nghệ và sử dụng chương trình CorelDraw.

    bài tập khóa học, được thêm vào ngày 19/05/2007

    Vai trò của hệ thống máy tính phân tán trong việc giải quyết các vấn đề hiện đại. Hệ thống công cụ DVM để phát triển các chương trình song song. Các công cụ để xây dựng mô hình giao diện đồ họa hình thức. Yêu cầu về giao diện đồ họa của hệ thống DVM.

    bài tập khóa học, được thêm vào ngày 15/10/2010

    Bản chất của việc lập trình sử dụng môi trường Delphi 7 và các khả năng đồ họa cơ bản của nó. Cấu trúc của một mô-đun phần mềm được biên dịch ngoại tuyến và các nguyên tắc của nó. Các kỹ thuật cơ bản để làm việc với các thủ tục đồ họa, xây dựng hình cung, hình tròn và hình elip.

    bài tập khóa học, được thêm vào ngày 16/12/2011

    Các lĩnh vực ứng dụng đồ họa máy tính Các loại đồ họa máy tính. Độ phân giải màu và mô hình màu. Phần mềm tạo, xem và xử lý thông tin đồ họa. Khả năng đồ họa của bộ xử lý văn bản, trình soạn thảo đồ họa.

    kiểm tra, thêm vào ngày 07/06/2010

    Sự phát triển của giao diện người dùng đồ họa. Hệ thống X Window và Trình quản lý cửa sổ. Mô tả về màn hình và ứng dụng KDE và GNOME. Tổng quan về các nguyên tắc cơ bản của tổ chức giao diện trong hệ thống Windows, mô tả gói phần mềm ứng dụng của nó.

Đóng góp của Saleem Gul và Tomas Pavek

Hướng dẫn này bao gồm việc tạo một giao diện người dùng đồ họa đơn giản và thêm chức năng phía máy chủ đơn giản vào đó. Cụ thể, chúng ta sẽ xem xét mã xác định hành vi của các nút và trường trên biểu mẫu Xoay.

Chúng ta sẽ xem xét bố cục và cấu trúc của GUI, sau đó thêm một số nút và trường văn bản. Các trường văn bản được thiết kế để nhận thông tin do người dùng nhập và hiển thị kết quả của chương trình. Nút này sẽ bắt đầu hoạt động của các chức năng được tích hợp trong phần máy khách của chương trình. Ứng dụng đang được tạo là một máy tính đơn giản nhưng có đầy đủ chức năng.

Để có hướng dẫn chi tiết hơn về các tính năng phát triển của GUI Designer, bao gồm video trình diễn các tính năng phát triển khác nhau, hãy xem .

Thời lượng dự kiến: 20 phút

Bài tập 1: Tạo một dự án

Bước đầu tiên là tạo một dự án IDE cho ứng dụng bạn đang phát triển. Hãy đặt tên cho dự án là NumberAddition.

  1. Chọn Tệp > Dự án mới. Bạn cũng có thể nhấp vào biểu tượng Dự án mới trên thanh công cụ IDE.
  2. Trong vùng Danh mục, chọn nút Java. Trong vùng "Dự án", chọn "Ứng dụng Java". Bấm tiếp".
  3. Nhập NumberAddition vào trường Tên dự án và chỉ định một đường dẫn, chẳng hạn như thư mục chính của bạn, làm vị trí dự án.
  4. Chọn hộp kiểm "Sử dụng thư mục riêng để lưu trữ thư viện" và chỉ định vị trí của thư mục thư viện (tùy chọn). Để biết thêm thông tin, hãy xem chia sẻ thư viện với người khác trong tài liệu Phát triển ứng dụng với NetBeans IDE.
  5. Xóa hộp kiểm "Tạo lớp chính" nếu nó được chọn.
  6. Nhấp vào nút "Xong".

Bài tập 2: Tạo giao diện người dùng

Để tiếp tục quá trình tạo giao diện, bạn cần tạo một vùng chứa Java để đặt các thành phần GUI cần thiết khác. Trong hoạt động này, một vùng chứa sẽ được tạo bằng phần tử JFrame. Vùng chứa sẽ được đặt vào một gói mới, gói này sẽ xuất hiện trong nút "Gói nguồn".

Tạo vùng chứa JFrame

  1. Trong cửa sổ Dự án, bấm chuột phải vào nút NumberAddition và chọn Mới > Khác.
  2. Trong hộp thoại Tạo tệp, chọn danh mục Biểu mẫu GUI xoay và loại tệp Biểu mẫu JFrame. Bấm tiếp".
  3. Nhập NumberAdditionUI làm tên lớp.
  4. Chọn gói my.numberaddition.
  5. Nhấp vào nút "Xong".

IDE tạo biểu mẫu NumberAdditionUI và lớp NumberAdditionUI trong ứng dụng NumberAdditionUI và mở biểu mẫu NumberAdditionUI trong Trình tạo GUI. Gói my.NumberAddition thay thế gói mặc định.

Thêm các yếu tố: Tạo giao diện người dùng

Tiếp theo, bằng cách sử dụng cửa sổ "Palette", giao diện bên ngoài của ứng dụng sẽ chứa đầy JPanel. Sau đó, ba phần tử JLabel (nhãn văn bản), ba phần tử JTextField (trường văn bản) và ba phần tử JButton (nút) được thêm vào. Nếu trước đây bạn chưa từng làm việc với trình thiết kế GUI, hãy xem Thiết kế GUI Swing trong NetBeans IDE để biết thông tin về vị trí thành phần.

Sau khi kéo và đặt các phần tử trên, phần tử JFrame sẽ trông giống như hình bên dưới.

Nếu không có cửa sổ Palette ở góc trên bên phải của IDE, hãy chọn Window > Palette.

  1. Để bắt đầu, hãy chọn một bảng từ danh mục Swing Containers trong bảng màu và kéo nó vào JFrame.
  2. JPanel sẽ được đánh dấu. Đi tới cửa sổ Thuộc tính và nhấp vào nút hình elip (...) bên cạnh trường Đường viền để chọn kiểu đường viền.
  3. Trong hộp thoại Border, chọn TitledBorder từ danh sách và nhập Number Addition vào trường Title. Nhấp vào "OK" để lưu các thay đổi của bạn và đóng hộp thoại.
  4. Màn hình bây giờ sẽ hiển thị phần tử "JFrame" trống với tiêu đề "Bổ sung số" như trong hình. Theo hình ảnh, thêm ba JLabels, ba JTextFields và ba JButton vào đó.

Đổi tên các phần tử

Bước này sẽ đổi tên các phần tử đã được thêm vào phần tử JFrame.

  1. Bấm đúp vào jLabel1 và thay đổi thuộc tính ntrcn ("văn bản") thành Số đầu tiên.
  2. Nhấp đúp vào jLabel2 và thay đổi văn bản thành Số thứ hai.
  3. Nhấp đúp vào jLabel3 và thay đổi văn bản thành Kết quả.
  4. Xóa văn bản mặc định khỏi jTextField1. Văn bản được hiển thị có thể được chuyển đổi thành văn bản có thể chỉnh sửa. Để thực hiện việc này, nhấp chuột phải vào trường văn bản và chọn "Chỉnh sửa văn bản" từ menu bật lên. Điều này có thể yêu cầu bạn khôi phục jTextField1 về kích thước ban đầu. Lặp lại bước này cho các trường jTextField2 và jTextField3.
  5. Thay đổi văn bản hiển thị của jButton1 thành Clear. (Để thay đổi nội dung của một nút, nhấp chuột phải vào nút đó và chọn Chỉnh sửa văn bản. Ngoài ra, bạn có thể nhấp vào nút, tạm dừng và nhấp lại.)
  6. Thay đổi văn bản hiển thị của jButton2 thành Add .
  7. Thay đổi văn bản hiển thị của jButton3 thành Exit .

Bây giờ GUI đã hoàn thành sẽ trông giống như hình ảnh bên dưới:

Bài tập 3: Thêm chức năng

Bài tập này sẽ thêm chức năng cần thiết vào các nút Thêm, Xóa và Thoát. Các trường jTextField1 và jTextField2 sẽ được sử dụng để người dùng nhập vào và jTextField3 sẽ được sử dụng để hiển thị kết quả của chương trình. Chương trình được tạo là một máy tính đơn giản. Vậy hãy bắt đầu!

Thêm chức năng vào nút Thoát

Để các nút có thể hoạt động, mỗi nút phải được chỉ định một trình xử lý sự kiện, chịu trách nhiệm phản hồi các sự kiện. Trong trường hợp của chúng tôi, chúng tôi cần xác định sự kiện nhấn nút - bằng cách nhấp chuột hoặc sử dụng bàn phím. Do đó, giao diện "ActionListener" sẽ được sử dụng để xử lý các sự kiện "ActionEvent".

  1. Nhấp chuột phải vào nút "Thoát". Từ menu bật lên, hãy chọn Sự kiện > Hành động > hành động được thực hiện. Xin lưu ý rằng menu chứa nhiều sự kiện khác mà chương trình có thể đáp ứng! Khi bạn chọn sự kiện actionPerformed, IDE sẽ tự động thêm ActionListener vào nút Thoát và tạo một phương thức xử lý để xử lý phương thức trình nghe actionPerformed.
  2. IDE tự động mở cửa sổ Mã nguồn, hiển thị cho bạn vị trí chèn hành động mà bạn muốn nút thực hiện khi bạn nhấp vào nút đó (bằng chuột hoặc bàn phím). Cửa sổ "Mã nguồn" phải chứa các dòng sau: private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) ( //TODO thêm mã xử lý của bạn vào đây: )
  3. Bây giờ hãy thêm mã cho hành động mà nút "Thoát" sẽ thực hiện. Thay thế dòng TODO bằng System.exit(0); . Mã hoàn chỉnh cho nút "Thoát" sẽ trông như thế này: private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) ( System.exit(0); )

Thêm chức năng vào nút "Xóa"

  1. Nhấp chuột phải vào nút "Xóa" (jButton1). Từ menu xuất hiện, chọn "Sự kiện > Hành động > hành động được thực hiện".
  2. Việc nhấp vào nút "Xóa" sẽ khiến tất cả văn bản bị xóa khỏi tất cả các trường văn bản "jTextField". Để thực hiện việc này, hãy thêm mã tương tự như mã ở trên. Mã nguồn hoàn thiện sẽ trông như thế này: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)( jTextField1.setText(""); jTextField2.setText(""); jTextField3.setText(""); )

Mã này xóa văn bản khỏi cả ba JTextFields, để trống chúng.

Thêm chức năng vào nút "Thêm"

Nút "Thêm" sẽ thực hiện ba việc.

  1. Trước tiên, nó lấy dữ liệu đầu vào của người dùng trong các trường jTextField1 và jTextField2 rồi chuyển đổi chúng từ loại "Chuỗi" thành loại "Float".
  2. Sau đó nó sẽ thực hiện phép cộng hai số.
  3. Cuối cùng, nó sẽ chuyển đổi tổng thành Chuỗi và đặt nó vào jTextField3 .
Hãy bắt đầu nào!
  1. Nhấp vào tab Thiết kế ở đầu không gian làm việc để quay lại màn hình Thiết kế biểu mẫu.
  2. Nhấp chuột phải vào nút "Thêm" (jButton2). Từ menu bật lên, hãy chọn Sự kiện > Hành động > hành động được thực hiện.
  3. Thêm mã cho các hành động mà nút "Thêm" sẽ thực hiện. Mã nguồn hoàn thiện sẽ trông như thế này: private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)( // Đầu tiên chúng ta định nghĩa các biến float. float num1, num2, result; // Chúng ta phải phân tích văn bản thành kiểu float .num1 = Float.parseFloat(jTextField1.getText()); num2 = Float.parseFloat(jTextField2.getText()); // Bây giờ chúng ta có thể thực hiện phép cộng. result = num1+num2; // Bây giờ chúng ta sẽ chuyển giá trị của kết quả thành jTextField3. // Đồng thời, chúng ta sẽ // thay đổi giá trị của kết quả từ float thành chuỗi. jTextField3.setText(String.valueOf(result)); )

Bây giờ chương trình đã hoàn toàn sẵn sàng và bạn có thể bắt đầu lắp ráp và thực thi nó.

Bài tập 4: Thực thi chương trình

Để chạy chương trình trong IDE, hãy làm theo các bước sau:

  1. Chọn Chạy > Chạy dự án chính (cách khác, nhấn F6).

    Ghi chú. Nếu bạn mở một cửa sổ cho biết Project NumberAddition không có lớp chính được chỉ định, bạn nên chọn my.NumberAddition.NumberAdditionUI làm lớp chính trong cùng cửa sổ và nhấp vào OK.

Để chạy chương trình bên ngoài IDE, hãy làm theo các bước sau:

Sau vài giây ứng dụng sẽ khởi chạy.

Ghi chú. Nếu việc bấm đúp vào tệp JAR không khởi chạy ứng dụng, hãy xem liên kết tệp JAR trên hệ điều hành của bạn để biết thêm thông tin.

Bạn cũng có thể chạy ứng dụng từ dòng lệnh.

Để chạy ứng dụng từ dòng lệnh, hãy làm theo các bước sau:

  1. Mở dấu nhắc lệnh hoặc cửa sổ đầu cuối.
  2. Tại dấu nhắc lệnh, thay đổi thư mục hiện tại thành thư mục NumberAddition/dist.
  3. Tại dấu nhắc lệnh, nhập câu lệnh sau: java -jar NumberAddition.jar

    Ghi chú.Đảm bảo rằng my.NumberAddition.NumberAdditionUI được đặt làm lớp chính trước khi chạy ứng dụng. Để kiểm tra điều này, hãy nhấp chuột phải vào nút dự án NumberAddition trong bảng Dự án, chọn Thuộc tính từ trình đơn bật lên và chọn danh mục Chạy trong hộp thoại Thuộc tính Dự án. Trường Lớp chính sẽ hiển thị my.numberaddition.NumberAdditionUI .

Công cụ xử lý sự kiện

Hướng dẫn này xem xét việc phản hồi một sự kiện nhấn nút đơn giản. Có nhiều sự kiện mà một ứng dụng có thể phản hồi. Trong IDE, bạn có thể xem danh sách các sự kiện có sẵn mà các phần tử GUI có thể xử lý như sau:

  1. Quay lại tệp NumberAdditionUI.java trong trình chỉnh sửa. Nhấp vào tab "Thiết kế" để xem cấu trúc GUI trong Trình tạo GUI.
  2. Nhấp chuột phải vào bất kỳ thành phần GUI nào và chọn "Sự kiện" từ menu xuất hiện. Bây giờ bạn có thể chỉ cần khám phá nội dung của menu mà không cần chọn bất kỳ mục nào.
  3. Ngoài ra, bạn có thể chọn "Thuộc tính" từ menu "Cửa sổ". Trong cửa sổ Thuộc tính, nhấp vào tab Sự kiện. Tab "Sự kiện" cho phép bạn xem và thay đổi trình xử lý sự kiện được liên kết với thành phần GUI hiện đang hoạt động.
  4. Ứng dụng cũng có thể phản hồi với các lần nhấn phím, nhấp chuột một lần, hai lần hoặc ba lần, chuyển động của con trỏ chuột, thay đổi kích thước cửa sổ và chuyển động tiêu điểm đầu vào. Menu "Sự kiện" cho phép bạn tự động tạo trình xử lý sự kiện cho tất cả các sự kiện này. Phổ biến nhất trong số này là sự kiện "Hành động". (Để biết thêm thông tin, hãy xem cách xử lý các sự kiện trong Hướng dẫn sự kiện Sun Java.)

Các sự kiện được xử lý như thế nào? Bất cứ khi nào bạn chọn một sự kiện từ menu sự kiện, IDE sẽ tự động tạo cái được gọi là trình xử lý sự kiện và liên kết nó với thành phần nhà phát triển. Để tìm hiểu thêm về xử lý sự kiện, hãy làm theo các bước sau:

  1. Quay lại tệp NumberAdditionUI.java trong trình chỉnh sửa. Nhấp vào tab "Nguồn" để xem mã nguồn GUI.
  2. Cuộn xuống để xem các phương thức jButton1ActionPerformed() , jButton2ActionPerformed() và jButton3ActionPerformed() đã được triển khai. Những phương thức này được gọi là xử lý sự kiện.
  3. Bây giờ hãy chuyển sang phương thức initComponents(). Nếu phương thức này bị thiếu, hãy tìm dòng Mã được tạo và nhấp vào dấu + bên cạnh dòng đó để hiển thị phương thức initComponents() ẩn.
  4. Lưu ý khối màu xanh bao quanh phương thức initComponents(). Mã này được IDE tạo tự động và người dùng không thể sửa đổi.
  5. Bây giờ hãy nhìn vào chính phương thức initComponents(). Trong số những thứ khác, nó chứa mã khởi tạo các phần tử GUI và đặt chúng vào biểu mẫu. Mã này được tạo và cập nhật tự động khi bạn đặt và thay đổi các thành phần trong chế độ thiết kế.
  6. Trong phương thức initComponents(), tìm đoạn mã sau: jButton3.setText("Exit"); jButton3.addActionListener(new java.awt.event.ActionListener() ( public void actionPerformed(java.awt.event.ActionEvent evt) ( jButton3ActionPerformed(evt); ) ));

    Tại thời điểm này, đối tượng nghe sự kiện "ActionListener" được thêm vào phần tử GUI, trong trường hợp này là jButton3 . Giao diện "ActionListener" có phương thức "actionPerformed" trên đối tượng "ActionEvent", được triển khai bằng cách gọi trình xử lý sự kiện jButton3ActionPerformed. Nút này hiện phản hồi các sự kiện hành động. Mỗi lần nhấp vào nút, một "ActionEvent" sẽ được tạo và chuyển đến phương thức "actionPerformed" của giao diện trình xử lý sự kiện. Phương thức này sẽ thực thi mã mà nhà phát triển đã cung cấp cho sự kiện đó trong trình xử lý sự kiện.

  7. Thẻ học ứng dụng GUI Java

Ngày 09 tháng 7 năm 2003

Với sự ra đời của nhiều công cụ phát triển ứng dụng trực quan khác nhau, việc viết giao diện đồ họa cho các chương trình đã trở thành một thứ giống như trò chơi của trẻ con. Tôi dùng chuột chọc vào nó và một biểu mẫu xuất hiện; tôi chọc vào nó lần thứ hai và một cái nút xuất hiện. Đối với tôi, có vẻ như hiện nay nhiều người không nghĩ đến một cách lập trình khác trong môi trường đồ họa. Tất nhiên, bạn không thể phản đối sự tiến bộ; khi viết các dự án lớn, tất cả những tiện ích này đều rất hữu ích. Nhưng đó không phải là chủ đề của cuộc trò chuyện này. Đôi khi điều này trở nên vô lý: một ứng dụng nguyên thủy được viết bằng MFC, VCL, v.v. Những chương trình như vậy ngấu nghiến bộ nhớ như lũ mối và với thân hình mập mạp của chúng, chúng chiếm thêm dung lượng đĩa. Theo quy định, các chất tương tự MFC/VCL “nặng” hơn từ 10 đến 20 lần so với các chương trình được viết trên API thuần túy. Và Visual Basic (xin Chúa tha thứ cho tôi vì cụm từ này) với msvbvmXX.dll của nó? Và nhiều tài nguyên hệ thống hơn được tiêu thụ (vài lần). Người dùng nghèo, từ chối bia, tiết kiệm tiền để mua phần cứng mới. Chẳng phải là đáng tiếc cho những điều nghèo nàn sao? Không chỉ lập trình viên mới uống bia? Có một khía cạnh tích cực khác của mã hóa API: lập trình viên trở nên gần gũi hơn với hệ điều hành. Theo đó, anh ấy hiểu và kiểm soát nó tốt hơn. Và thật đơn giản - đó là một hoạt động rất thú vị. Tôi nhắc lại, tất cả những điều trên áp dụng cụ thể cho các chương trình nhỏ, đơn giản, trong các dự án lớn, mọi thứ hoàn toàn khác.

Tôi hy vọng tôi đã thuyết phục được bạn. Đi.

Chúng ta sẽ xem xét việc tạo một giao diện cửa sổ đơn giản với chức năng tối thiểu. Đây sẽ là một cửa sổ đơn giản với hai trường nhập và hai nút. Khi bạn nhấp vào nút "Sao chép", văn bản từ trường nhập đầu tiên sẽ được sao chép sang trường nhập thứ hai. Khi bạn nhấp vào nút "Đóng", chương trình sẽ hoàn thành công việc của nó. Trong tương lai, nó có thể dùng làm mẫu để viết các ứng dụng khác phức tạp hơn. Chúng tôi sẽ giao tiếp bằng C/C++, mặc dù chúng tôi cũng sẽ không xúc phạm Delphi. Nguyên tắc chung là giống nhau, chỉ có cú pháp là khác nhau. Để làm việc với các thông báo hệ thống và chức năng API, bạn cần đưa các tệp tiêu đề vào dự án của mình; trong C/C++ đây là windows.h, trong Delphi đây là các mô-đun cửa sổ và tin nhắn.

Bất kỳ chương trình nào trong hệ điều hành Windows đều bao gồm ba phần chính: chức năng chính, vòng lặp thông báo và chức năng cửa sổ, xử lý tất cả các thông báo được gửi đến cửa sổ.

Chương trình của chúng ta bắt đầu thực thi với hàm WinMain(). Đây là chức năng chính. Hàm WinMain() thường thực hiện các tác vụ sau:

  • Định nghĩa lớp cửa sổ. Đừng nhầm lẫn với lớp OOP.
  • Đăng ký lớp này trong hệ thống.
  • Tạo cửa sổ ứng dụng chính và các điều khiển khác.
  • Hiển thị một cửa sổ trên màn hình.
  • Bắt đầu vòng xử lý tin nhắn.
  • Nó được khai báo theo cách này: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) Hãy xem các tham số:
    • hInstance là một điều khiển cho phiên bản ứng dụng hiện tại.
    • hPrevInstance là một phần điều khiển cho phiên bản trước của ứng dụng, nếu nó đang chạy.
    • lpCmdLine - con trỏ tới dòng chứa các tham số được truyền cho chương trình khi khởi động.
    • nCmdShow - hằng số xác định cách hiển thị cửa sổ. (Xem hằng số SW_).

Trong Delphi, chúng ta sẽ không nhìn thấy một bức tranh như vậy; trong môi trường phát triển này, chức năng chính bị trình biên dịch ẩn khỏi người lập trình. Tất nhiên, mặc dù nó có trong mã cuối cùng. Để đăng ký một lớp cửa sổ, bạn cần điền vào các trường có cấu trúc kiểu WNDCLASS (trong Delphi TWNDCLASS). Với mục đích này, chúng tôi đã khai báo biến wcl. wcl.hInstance = hInstance; Để xử lý phiên bản ứng dụng hiện tại, biến hInstance được khởi tạo bởi hàm WinMain(). Trong Delphi nó được khởi tạo ngầm. wcl.lpszClassName = szWinName; Tên lớp. Chúng tôi đã tạo và khởi tạo trước biến chuỗi szWinName. wcl.lpfnWndProc = WindowFunc; Một con trỏ tới một hàm cửa sổ. wcl.style = 0; Một hằng số xác định kiểu cửa sổ. Cờ CS_ được sử dụng cho việc này, tôi vừa xóa chúng về 0. Bạn có thể chỉ định tổ hợp các cờ bằng thao tác "hoặc" theo bit. wcl.hIcon = LoadIcon(NULL, IDI_ASTERISK); Một điều khiển cho biểu tượng ứng dụng, được trả về bởi hàm LoadIcon(). Tôi đã tải lên một biểu tượng tiêu chuẩn. Xem hằng số IDI_. wcl.hCursor = LoadCursor(NULL,IDC_ARROW); Một điều khiển cho con trỏ ứng dụng, được trả về bởi LoadCursor(). Tôi đã tải mũi tên tiêu chuẩn. Xem hằng số IDC_. wcl.lpszMenuName = NULL; Con trỏ tới một chuỗi xác định tên của tài nguyên menu cho lớp cửa sổ này. Không có thực đơn, không có dấu hiệu. wcl.cbClsExtra = 0; Trường dự trữ. Hãy thiết lập lại. wcl.cbWndExtra = 0; Trường dự trữ. Hãy thiết lập lại. wcl.hbrBackground = (HBRUSH)COLOR_WINDOW; Màu cửa sổ. Hằng số COLOR_WINDOW được chuyển thành kiểu HBRUSH (trong Delphi không cần chuyển). Ngoài ra, bằng cách sử dụng hàm GetStockObject(), bạn có thể đặt màu cọ hoặc hình nền cho cửa sổ. Bây giờ, hãy thoải mái đăng ký lớp cửa sổ.

RegisterClass(&wcl); Một con trỏ tới cấu trúc wcl được truyền dưới dạng tham số cho hàm RegisterClass.

Dòng tiếp theo chúng ta tạo cửa sổ.

hMainWnd = CreateWindow(szWinName, "Một cửa sổ đơn giản trên API.", WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME ^ S_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 300, 170, HWND_DESKTOP, NULL, hInstance, NULL);
  • Tham số đầu tiên là tên của lớp cửa sổ.
  • Tham số thứ hai là tiêu đề cửa sổ.
  • Tham số thứ ba là kiểu cửa sổ. Từ WS_OVERLAPPEDWINDOW tiêu chuẩn, bằng cách sử dụng thao tác xor, tôi đã loại bỏ khả năng chia tỷ lệ cửa sổ và tắt nút phóng to.
  • Thứ tư và thứ năm là vị trí của cửa sổ tính từ bên trái, góc trên của màn hình. Tôi có CW_USEDEFAULT, với giá trị này hệ thống sẽ tự động chọn vị trí cửa sổ.
  • Tham số thứ sáu và thứ bảy lần lượt là chiều rộng và chiều cao của cửa sổ.
  • Tham số thứ tám là cửa sổ chủ sở hữu. Tại cửa sổ chính, chủ sở hữu là desktop (0). Các điều khiển có một cửa sổ chính.
  • Thứ chín là một con trỏ tới tay cầm menu. Không có thực đơn, không có dấu hiệu.
  • Tham số thứ mười là một điều khiển cho phiên bản ứng dụng hiện tại.
  • Thứ mười một - Được sử dụng khi tạo ứng dụng có giao diện MDI. Chúng tôi không cần.
Hàm trả về một điều khiển cho cửa sổ đã tạo, được lưu trong biến hMainWnd.
Tay cầm cửa sổ là một số duy nhất trong hệ thống xác định cửa sổ hoặc điều khiển.

Tiếp theo chúng ta sẽ tạo các điều khiển cần thiết. Tất cả các điều khiển đều là các cửa sổ giống nhau, chúng chỉ có tên lớp khác nhau. Không cần phải đăng ký các lớp điều khiển; chúng đã được xác định trước trong hệ thống. Nút - lớp nút. Trường đầu vào - chỉnh sửa lớp. Chú thích - lớp ststic. Có nhiều lớp tương ứng với các điều khiển tiêu chuẩn. Chúng ta tạo các điều khiển bằng hàm CreateWindow() quen thuộc và hàm CreateWindowEx() lạ. CreateWindowEx() cho phép bạn tạo một cửa sổ với kiểu dáng nâng cao. Chúng tôi sử dụng nó để tạo các trường đầu vào. Hàm này đã thêm tham số đầu tiên, thiết lập kiểu cao cấp nhất này, các tham số còn lại giống như CreateWindow(). Điều khiển là cửa sổ con, chủ sở hữu của chúng là cửa sổ chính.

Khi tạo điều khiển, trong tham số hàm, bạn phải chỉ định bộ mô tả của cửa sổ chính, cũng như kiểu cửa sổ WS_CHILD. Hình thức và chức năng của các điều khiển có thể được điều khiển bằng cách sử dụng các cờ: WS_, ES_, BS_, SS_, kết hợp chúng với thao tác “hoặc” theo bit. Khi tạo các điều khiển, chúng ta khởi tạo các biến tương ứng với các bộ mô tả của chúng, được trả về bởi các hàm CreateWindow() và CreateWindowEx(). Chúng ta sẽ cần những bộ mô tả này để tiếp tục làm việc với các điều khiển. Chúng ta hiển thị cửa sổ đã tạo lên màn hình và vẽ lại.

Hàm GetMessage chọn tin nhắn tiếp theo từ hàng đợi tin nhắn của ứng dụng và gửi nó đến cửa sổ.
  • Tham số đầu tiên là cấu trúc kiểu MSG (trong Delphi kiểu TMSG)
  • Tham số thứ hai là một điều khiển cho cửa sổ mà thông báo được gửi tới. Nếu NULL hoặc 0 thì tất cả các cửa sổ ứng dụng.
  • Thứ ba và thứ tư - cho phép bạn đặt phạm vi tin nhắn nhận được. Nếu là 0 thì tất cả các tin nhắn được gửi đến cửa sổ.
GetMessage - trả về FALSE khi thông báo WM_QUIT xuất hiện, trong trường hợp đó vòng lặp được thoát và ứng dụng thoát. TranslateMessage - dịch mã phím ảo thành tin nhắn trên bàn phím. DispatchMessage - gửi tin nhắn đến chức năng cửa sổ để xử lý.

Chức năng cửa sổ cung cấp chức năng của chương trình bằng cách xử lý các thông báo hệ thống. Hàm cửa sổ là hàm CALLBACK, tức là. được hệ điều hành gọi để phản hồi một tin nhắn mới đến. Hàm cửa sổ được khai báo như sau:

LRESULT GỌI LẠI WindowFunc(HWND hMainWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

  • HMainWnd - xử lý cửa sổ chính.
  • iMsg - số tin nhắn. Xem hằng số WM_.
  • lParam và wParam là các tham số của tin nhắn.

Khi một thông báo xuất hiện, chúng ta có thể so sánh tham số iMsg với một trong các hằng số WM_ và lập trình cho chương trình phản ứng tương ứng.

Ví dụ: Khi nhấn chuột trái trong khi con trỏ chuột đang ở trên vùng client của cửa sổ thì sự kiện WM_LBUTTONDOWN được phát sinh. Hàm cửa sổ được gọi, giá trị của hằng số WM_LBUTTONDOWN được nhập vào tham số iMsg, chúng ta có thể kiểm tra điều kiện và lập trình phản ứng của chương trình mà chúng ta cần.

Bên trong hàm cửa sổ là toán tử lựa chọn thực hiện tác vụ được mô tả ở trên. Toán tử lựa chọn phải có trình xử lý mặc định, được triển khai bởi hàm DefWindowProc(hMainWnd, iMsg, wParam, lParam);

Nếu điều này không được thực hiện, chương trình của chúng ta sẽ chết mà không thể phục hồi. Nhiều thông báo được hệ thống tự xử lý, chẳng hạn như: thay đổi kích thước cửa sổ, thu nhỏ/phóng to cửa sổ, gọi menu hệ thống, v.v. Đây chính là mục đích của DefWindowProc().

Khi làm việc với các điều khiển cửa sổ, một thông báo WM_COMMAND được gửi đến chủ sở hữu cửa sổ, với lParam chứa phần điều khiển của điều khiển và byte cao của tham số wParam là mã định danh của sự kiện được đưa ra trên điều khiển. Ví dụ: khi bạn nhấp vào nút - BN_CLICKED. Xem các hằng số BN_, WM_. Chúng ta có thể đóng chương trình bằng hàm PostQuitMessage(0). Hàm này gửi thông báo WM_QUIT tới cửa sổ.

Một vài lời về cách viết các chương trình như vậy trong Delphi. Tạo một dự án mới, khởi chạy Trình quản lý dự án, xóa Unit1 cùng với biểu mẫu. Nhấn Ctrl + F12 và mở tệp dự án. Chúng tôi xóa mô-đun biểu mẫu khỏi mục sử dụng, thêm cửa sổ và tin nhắn vào đó. Chúng tôi xóa mọi thứ giữa đầu và cuối. Phôi đã sẵn sàng. Bạn có thể viết mã. Không thể viết chương trình bằng API thuần túy mà không có sự trợ giúp, điều này luôn có sẵn. Nếu bạn là Gates, bạn sẽ không nhớ được mọi thứ. Tôi khuyên bạn nên:

  • trước hết - MSDN;
  • Hệ thống trợ giúp Delphi (tệp MSTOOLS.HLP);
  • Có trợ giúp bằng tiếng Nga về API Win32 trên trang web http://www.soobcha.ru/rushelp.
Đó là tất cả.
Chúc may mắn.

Bobachenko Maxim Tải xuống: CreateWnd.zip(2.6K)
kho lưu trữ chứa các tệp windows.cpp và windows.dpr