Giao diện đồ họa và các công cụ để phát triển chúng. Lớp XmGadget chứa các lớp con

Tạo giao diện người dùng đồ họa, trong đó bạn cần đặt các yếu tố đồ họa, chọn cấu trúc tổng thể và luồng ứng dụng, khuyến khích lập trình viên trở thành một nghệ sĩ theo một cách nào đó. Không có quy tắc tiêu chuẩn nào có thể giúp tạo bản trình bày, đặt các phần tử và tổ chức cấu trúc. Một giao diện người dùng đồ họa tốt được coi như một tác phẩm nghệ thuật. Vì thiết kế giao diện không phải là khoa học hơn là nghệ thuật, nên không có quy tắc cứng và nhanh để tuân theo trong lĩnh vực này. Quá nhiều tùy chọn được xác định bởi bản chất của ứng dụng, người dùng và ngữ cảnh.

Tuy nhiên, có một số phương pháp hay nhất mà các nhà phát triển nên làm theo để thiết kế giao diện dễ dàng hơn.

¦ Nên tránh các cấu trúc phức tạp (chẳng hạn như một cây) để liên kết các menu khác nhau. Tốt nhất là không nên bao gồm nhiều hơn sáu menu trong một thanh menu, mỗi thanh sẽ chứa không quá sáu tùy chọn.

¦ Các đối tượng phải có một giá trị nhất quán. Ví dụ, để kích hoạt tất cả các biểu tượng, hãy nhấp đúp vào chuột. Một số giao diện hiện đại không tuân theo khuyến nghị này và chứa các biểu tượng chỉ có hiệu lực sau khi người dùng kéo

phản đối chúng. Các thanh cuộn chỉ nên được sử dụng để cuộn và nếu các biểu tượng thư viện được tạo sẵn được sử dụng, chúng phải được kiểm tra cẩn thận để đảm bảo rằng, chẳng hạn như biểu tượng máy in luôn được sử dụng để in.

¦ Khi kích hoạt tất cả các biểu tượng, như đã lưu ý ở trên, nhấp đúp vào chuột. Và để có được kết quả tương tự cho các biểu tượng của các đối tượng được kích hoạt bằng một cú nhấp chuột, bạn cũng nên lập trình một cú nhấp đúp. Nhiều tùy chọn, chẳng hạn như các tùy chọn từ menu Bảng điều khiển, trông giống như biểu tượng, nhưng là các đối tượng được kích hoạt bằng một cú nhấp chuột. Xem xét cách người dùng có thể hành xử khi làm việc với các đối tượng như vậy (tức là cho phép họ nhấp đúp vào chúng) và giúp họ đạt được kết quả mong muốn.

¦ Các menu giao diện phải phản ánh trạng thái hiện tại của hệ thống. Một trong những nguyên tắc chính hướng dẫn hầu hết những người tạo giao diện người dùng đồ họa là cung cấp quyền truy cập vào tất cả các công cụ giao diện, bất kể hành động của người dùng. Quy tắc dưới cùng phù hợp với các ứng dụng đơn giản, nhưng ít hữu ích hơn đối với những ứng dụng phức tạp hơn.

¦ Các phần tử chung cho các menu khác nhau nên được đặt ở một nơi. Ví dụ, các nút OK và Cancel phải luôn được đặt ở cùng một vị trí tương đối với nhau và chiếm cùng một vị trí trong các hộp thoại khác nhau.

¦ Bạn không nên cố gắng đạt được tính nhất quán của các món trong menu nếu điều này không phù hợp với ý kiến ​​của người dùng. Ví dụ: người dùng thấy rằng việc kéo tệp từ thư mục này sang thư mục khác nằm trên cùng một thiết bị sẽ khiến tệp được chuyển sang thư mục thứ hai.

Họ cũng tin rằng việc kéo một tập tin sang một thiết bị khác sẽ tạo ra một bản sao của bản gốc ở đó. Do đó, việc triển khai chức năng kéo sẽ không nhất quán, tức là khác nhau trong các trường hợp khác nhau. Tuy nhiên, đây là mong muốn của người dùng, điều này phải được tính đến. Phấn đấu cho sự nhất quán chỉ là một khuyến nghị, không phải là một quy tắc cứng và nhanh chóng.

Yêu cầu công thái học đối với giao diện người dùng đồ họa rõ ràng là không đủ với sự phát triển của "đa phương tiện" (đa phương tiện) - các hệ thống tương tác cung cấp công việc với hình ảnh tĩnh và video chuyển động, đồ họa máy tính hoạt hình và văn bản, giọng nói và âm thanh chất lượng cao. Nghiên cứu và phát triển công thái học của các hệ thống này là một nhiệm vụ phức tạp và thú vị về mặt chuyên môn.

Theo lưu ý của B. Tognazzini, hầu hết các nhà quản lý dự án phát triển ứng dụng đang chờ đợi sự hoàn thành của dự án để bắt đầu làm việc trên giao diện. Điều này gợi nhớ đến việc xây dựng một ngôi nhà, khi kiến ​​trúc sư được mời sau khi khung tòa nhà đã được dựng lên. Tất cả các nhà phát triển có một cách tiếp cận khác nhau để tổ chức quá trình tạo giao diện. Tuy nhiên, có những điểm chung mà tất cả các nhà phát triển nên tuân thủ:

1) hiểu chi tiết mục đích của sản phẩm phần mềm bằng cách giao tiếp chặt chẽ với người dùng, thường dành cả ngày làm việc với họ, để hiểu rõ hơn phong cách làm việc và thói quen cá nhân của họ;

2) việc tạo ra một giao diện không phải là công việc của một người mà là của đại diện của ba lĩnh vực: một chuyên gia tìm hiểu ý kiến ​​của người dùng về các yếu tố chính của giao diện và mô tả chúng; nhà phát triển giao diện và người tạo đồ họa;

3) một người có kinh nghiệm nên được chỉ định làm chuyên gia giao diện và trung gian giữa nhóm làm việc và người dùng;

4) kiểm tra, tạo bố cục và kiểm tra lại, bởi vì ngay cả khi đã hiểu hết mục đích của sản phẩm phần mềm, thì cũng không thể lường trước được tất cả các nhu cầu của người dùng.

D.Norman tin rằng giao diện nên được tạo ra bởi những người không tham gia vào quá trình phát triển ứng dụng, vì các nhà phát triển biết quá nhiều về các nguyên tắc của chương trình và điều này chỉ cản trở việc tạo ra một giao diện. Các ưu điểm của giao diện người dùng đồ họa thường được công nhận và có lẽ rất thơ mộng
do đó, nó đã không trở thành đối tượng của sự phân tích nghiêm túc. Quy tắc truyền thống của nhà phát triển phần mềm, theo đó, tính dễ học thường ngăn cản người dùng sau đó sử dụng đầy đủ tất cả các tính năng của chương trình, cũng có liên quan đến giao diện đồ họa. Một ví dụ là sự phát triển của một dự án cho một công ty bảo hiểm của Mỹ, đã sử dụng một ứng dụng bảo hiểm cho Macintosh, được cung cấp với một giao diện đẹp, rất dễ học. Tuy nhiên, sau hai năm làm việc, người dùng cuối đã quá quen thuộc với các chức năng khác nhau của ứng dụng này đến nỗi giao diện người dùng đồ họa chỉ làm họ chậm lại. Sự lựa chọn của một giao diện đồ họa nên được xác định bởi bản chất của nhiệm vụ của người dùng.

Đóng góp bởi Saleem Gul và Tomas Pavek

Trong hướng dẫn này, bạn sẽ học cách tạo giao diện người dùng đồ họa đơn giản và thêm một số chức năng back-end đơn giản vào đó. Đặc biệt, 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 Swing.

Chúng tôi sẽ chia nhỏ 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 đầu vào của người dùng và hiển thị kết quả của chương trình. Nút 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 bạn tạo là một máy tính đơn giản nhưng đầy đủ tính năng.

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

Thời lượng ước tính: 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ụ của IDE.
  2. Trong vùng Danh mục, chọn nút Java. Trong khu vực "Dự án", chọn "Ứng dụng Java". Nhấn tiếp".
  3. Nhập NumberAddition vào trường Project Name và cung cấp một đường dẫn, chẳng hạn như trong thư mục chính của bạn, làm vị trí của 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 dùng Khác trong tài liệu Phát triển ứng dụng với NetBeans IDE.
  5. Loại bỏ hộp kiểm "Tạo Lớp Chính" nếu nó được chọn.
  6. Nhấp vào nút "Hoàn tất".

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 trong đó các phần tử GUI bắt buộc khác sẽ được đặt. Trong hành động này, vùng chứa sẽ được tạo bằng cách sử dụng phần tử JFrame. Vùng chứa sẽ được đặt trong một gói mới, gói này sẽ được hiển thị dưới nút "Gói Nguồn".

Tạo vùng chứa JFrame

  1. Trong cửa sổ Projects, nhấp chuột phải vào nút NumberAddition và chọn New> Other.
  2. Trong hộp thoại tạo tệp, hãy chọn danh mục Biểu mẫu Swing GUI và loại tệp Biểu mẫu JFrame. Nhấn 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 "Hoàn tất".

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

Thêm phần tử: Tạo giao diện người dùng

Tiếp theo, sử dụng cửa sổ "Palette", giao diện bên ngoài của ứng dụng được lấp đầy bởi một 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 bạn chưa làm việc với Trình tạo GUI trước đây, hãy xem Phát triển 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ẽ giống như hình dưới đây.

Nếu IDE không có cửa sổ Palette ở góc trên bên phải, 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 dấu chấm lửng (...) bên cạnh trường "Đường viền" để chọn kiểu đường viền.
  3. Trong hộp thoại "Viền", chọn "TitledBorder" từ danh sách và nhập Số cộng vào trường "Tiêu đề". Nhấp vào nút OK để lưu các thay đổi của bạn và đóng hộp thoại.
  4. Màn hình lúc này sẽ hiển thị phần tử "JFrame" trống với tiêu đề "Phép cộng số" như trong hình. Thêm ba JLabels, ba JTextFields và ba JButtons vào nó như được hiển thị.

Đổ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. Nhấp đúp vào jLabel1 và thay đổi ntrcn (thuộc tính "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 có thể chỉnh sửa. Để thực hiện việc này, hã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 kích thước ban đầu của jTextField1. 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 văn bản của nút, hãy 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 Thêm.
  7. Thay đổi văn bản hiển thị của jButton3 thành Thoát.

Bây giờ, giao diện đồ họa đã hoàn thành sẽ giống như trong hình bên dưới:

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

Trong bài tập này, bạn 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à 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 ra 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 trở nên hoạt động, mỗi nút trong số chúng phải được chỉ định một trình xử lý sự kiện sẽ 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, cần phải xác định sự kiện nhấp vào nút - bằng cách nhấp bằng chuột hoặc bằng bàn phím. Do đó, giao diện "ActionListener" sẽ được sử dụng, được thiết kế để xử lý các sự kiện "ActionEvent".

  1. Nhấp chuột phải vào nút "Thoát". Chọn Sự kiện> Hành động> hành động Đã thực hiện từ menu bật lên. Xin lưu ý rằng menu có nhiều sự kiện khác mà chương trình có thể đáp ứng! Khi sự kiện actionPerformed được chọn, IDE sẽ tự động thêm một trình nghe 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 nơi bạn muốn chèn hành động mà nút sẽ thực hiện khi nó được nhấp (sử dụ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) (// VIỆC CẦN LÀM thêm mã xử lý của bạn tại đây:)
  3. Bây giờ chúng ta 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ã nút "Thoát" đã hoàn thành sẽ giống như sau: 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 "Clear" (jButton1). Từ menu xuất hiện, chọn "Sự kiện> Hành động> hành động Đã thực hiện".
  2. Việc nhấp vào nút "Xóa" sẽ dẫn đến việc xóa tất cả văn bản khỏi tất cả các trường văn bản "jTextField". Để làm điều này, hãy thêm mã tương tự như ở trên. Mã nguồn hoàn thành sẽ giống như sau: 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 Trường JText, khiến chúng trố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. Đầu tiên, nó lấy dữ liệu được nhập bởi người dùng trong jTextField1 và jTextField2 và chuyển nó từ kiểu "String" sang kiểu "Float".
  2. Sau đó nó sẽ thực hiện phép cộng hai số.
  3. Và 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!
  1. Bấm 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). Chọn Sự kiện> Hành động> hành động Đã thực hiện từ menu bật lê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 thành sẽ giống như sau: 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 cú pháp 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ừ một số thực thành một 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 xây dựng và thực thi nó.

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

Để chạy một chương trình trong IDE, hãy làm như sau:

  1. Chọn Run> Run Main Project (cách khác, nhấn F6).

    Ghi chú. Nếu bạn mở một cửa sổ cho biết rằng Project NumberAddition không có tập hợp lớp chính, hãy chọn my.NumberAddition.NumberAdditionUI làm lớp chính trong cùng một cửa sổ và bấm OK.

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

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

Ghi chú. Nếu bấm đúp vào tệp JAR không khởi chạy ứng dụng, hãy xem cấu hình các 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 như sau:

  1. Gọi một dòng lệnh hoặc cửa sổ đầu cuối.
  2. Tại dòng 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 my.NumberAddition.NumberAdditionUI được đặt làm lớp chính trước khi chạy ứng dụng. Để xác minh điều này, hãy bấm chuột phải vào nút dự án NumberAddition trong bảng điều khiển Dự án, chọn Thuộc tính từ menu bật lên và chọn danh mục Chạy từ hộp thoại Thuộc tính dự án. Trường Lớp Chính sẽ hiển thị my.numberaddition.NumberAdditionUI.

Cơ chế xử lý sự kiện

Hướng dẫn này xem xét phản ứng với một sự kiện nhấp vào nút đơn giản. Có rất nhiều sự kiện mà một ứng dụng có thể phản hồi. Bạn có thể xem danh sách các sự kiện có sẵn trong IDE có thể được xử lý bởi các phần tử GUI 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 GUI Builder.
  2. Nhấp chuột phải vào bất kỳ phần tử GUI nào và chọn "Sự kiện" từ menu xuất hiện. Giờ đây, 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à sửa đổi các trình xử lý sự kiện được liên kết với phần tử GUI hiện đang hoạt động.
  4. Ứng dụng này cũng có thể phản hồi các thao tác nhấn phím, nhấp một lần, hai lần hoặc ba lần, di chuyển con trỏ chuột, thay đổi kích thước cửa sổ và di chuyển 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ác phương pháp hay nhất về xử lý sự kiện trong Hướng dẫn sự kiện của Sun Java.)

Các sự kiện được xử lý như thế nào? Bất cứ khi nào một sự kiện được chọ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ề quy trình 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 và xem các phương thức jButton1ActionPerformed (), jButton2ActionPerformed () và jButton3ActionPerformed () được triển khai. Các phương thức này được gọi là trình xử lý sự kiện.
  3. Bây giờ chuyển sang phương thức initComponents (). Nếu không có phương thức này, hãy tìm dòng Mã đã tạo và nhấp vào dấu + bên cạnh dòng này để hiển thị phương thức initComponents () ẩn.
  4. Lưu ý hộp màu xanh lam xung quanh phương thức initComponents (). Mã này do 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à sửa đổi các phần tử trong chế độ thiết kế.
  6. Trong phương thức initComponents (), hãy tìm đoạn mã sau: jButton3.setText ("Thoát"); 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, trình 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" của đối tượng "ActionEvent", được thực hiện bằng cách đơn giản 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 kích hoạt 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 thực thi mã do nhà phát triển cung cấp cho sự kiện đó trong trình xử lý sự kiện.

  7. Giáo trình Ứng dụng Java GUI

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

Với sự ra đời của các công cụ phát triển ứng dụng trực quan khác nhau, việc viết các giao diện chương trình đồ họa đã trở thành một loại trò chơi của trẻ em. Tôi chọc bằng chuột - một cái khuôn xuất hiện, chọc vào lần thứ hai - cái nút đã được rút ra. Với tôi, dường như nhiều người không nghĩ về 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ể chống lại tiến độ; 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 cuộc trò chuyện không phải về điều đó. Đôi khi nó đến mức phi lý, một ứng dụng nguyên thủy được viết bằng MFC, VCL, v.v. Các chương trình như vậy ăn bộ nhớ như mối và chiếm thêm dung lượng ổ đĩa với phần thân béo của chúng. Theo quy định, các chất tương tự MFC / VCL "nặng" hơn các chương trình được viết bằng API thuần túy từ mười đến hai mươi lần. Điều gì về Visual Basic (Chúa tha thứ cho tôi vì cụm từ này) với msvbvmXX.dll của nó? Có, và tài nguyên hệ thống được tiêu thụ nhiều hơn (nhiều lần). Người dùng nghèo, từ chối uống bia, đang tiết kiệm tiền giấy để mua phần cứng mới. Đó không phải là điều đáng tiếc cho những người nghèo? Không chỉ có lập trình viên mới uống bia? Có một thời điểm tích cực hơn trong 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 đó, nó hiểu và kiểm soát nó tốt hơn. Và vâng, nó chỉ là rất nhiều niềm vui. Tôi nhắc lại, tất cả những điều trên áp dụng riêng cho các chương trình nhỏ, đơn giản, trong các dự án lớn thì mọi thứ hoàn toàn khác.

Tôi hy vọng tôi đã thuyết phụ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. Nó 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 thứ hai. Khi bạn nhấp vào nút "Đóng", chương trình sẽ kết thúc công việc của mình. Trong tương lai, nó có thể dùng làm khuôn 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ỉ khác về cú pháp. Để làm việc với các thông báo hệ thống và các hàm API, bạn cần bao gồm các tệp tiêu đề trong dự án của mình; trong C / C ++ nó là windows.h, trong Delphi nó là các mô-đun cửa sổ và tin nhắn.

Bất kỳ chương trình Windows nào cũng 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 tôi bắt đầu 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:

  • Chỉ định lớp cửa sổ. Không nên nhầm lẫn với lớp OOP.
  • Đăng ký lớp học này với hệ thống.
  • Tạo cửa sổ chính của ứng dụng 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 một vòng lặp thông báo.
  • Nó được khai báo theo cách này: int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) Hãy xử lý các tham số:
    • hInstance là một xử lý đối với phiên bản ứng dụng hiện tại.
    • hPrevInstance - Xử lý phiên bản trước của ứng dụng, nếu đang chạy.
    • lpCmdLine - con trỏ tới một chuỗi chứa các tham số được truyền cho chương trình khi khởi động.
    • nCmdShow - một hằng số xác định cách cửa sổ được hiển thị. (Xem hằng số SW_).

Trong Delphi, chúng ta sẽ không thấy một bức tranh như vậy, trong môi trường phát triển này, hàm chính bị trình biên dịch ẩn khỏi lập trình viên. Mặc dù, tất nhiên, nó hiện diện trong mã cuối cùng. Để đăng ký một lớp cửa sổ, cần điền vào các trường của cấu trúc kiểu WNDCLASS (trong Delphi TWNDCLASS). Chúng tôi đã khai báo biến wcl cho điều này. wcl.hInstance = hInstance; Một xử lý đối với 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 biến chuỗi szWinName trước đó. wcl.lpfnWndProc = WindowFunc; Một con trỏ đến một chức năng cửa sổ. kiểu wcl = 0; Một hằng số chỉ định kiểu của cửa sổ. Đối với điều này, các cờ CS_ được sử dụng, tôi chỉ cần đặt lại chúng. Bạn có thể chỉ định tổ hợp các cờ bằng thao tác bitwise "hoặc". wcl.hIcon = LoadIcon (NULL, IDI_ASTERISK); Xử lý biểu tượng của ứng dụng, như được trả về bởi hàm LoadIcon (). Tôi đã tải lên biểu tượng mặc định. Xem hằng số IDI_. wcl.hCursor = LoadCursor (NULL, IDC_ARROW); Xử lý con trỏ ứng dụng do hàm LoadCursor () trả về. Tôi đã tải lên một mũi tên chuẩn. Xem hằng số IDC_. wcl.lpszMenuName = NULL; Con trỏ đến một chuỗi chỉ định tên của tài nguyên menu cho lớp cửa sổ này. Không có menu, không có con trỏ. wcl.cbClsExtra = 0; lĩnh vực dành riêng. Đã được thiết lập. wcl.cbWndExtra = 0; lĩnh vực dành riêng. Đã được thiết lập. wcl.hbrBackground = (HBRUSH) COLOR_WINDOW; Màu cửa sổ. Hằng số COLOR_WINDOW được ép kiểu HBRUSH (không cần ép kiểu Delphi). Ngoài ra, bằng cách sử dụng hàm GetStockObject (), bạn có thể đặt màu cọ cửa sổ hoặc hình nền. Nào, hãy mạnh dạn đăng ký lớp window.

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

Với dòng tiếp theo, chúng tôi tạo cửa sổ của chúng tôi.

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 cửa sổ.
  • Tham số thứ ba là kiểu cửa sổ. Từ WS_OVERLAPPEDWINDOW tiêu chuẩn, 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 - vị trí của cửa sổ 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 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à màn hình nền (0). Điều khiển có cửa sổ chính.
  • Thứ chín là một con trỏ đến trình điều khiển trình đơn. Không có menu, không có con trỏ.
  • Tham số thứ mười là một xử lý đối với 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 với giao diện MDI. Chúng tôi không cần.
Hàm trả về một xử lý cho cửa sổ đã tạo, được lưu trữ trong biến hMainWnd.
Tay nắm cửa sổ là một số duy nhất trong hệ thống xác định một 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ó một tên lớp khác nhau. Các lớp điều khiển không cần phải đăng ký, chúng đã được xác định trước trong hệ thống. Nút - nút lớp. Trường nhập - chỉnh sửa lớp. Chữ khắc là lớp quyết liệt. Có nhiều lớp tương ứng với các điều khiển tiêu chuẩn. Chúng tôi tạo các điều khiển bằng cách sử dụng hàm CreateWindow () quen thuộc và hàm CreateWindowEx () không quen thuộc. CreateWindowEx () cho phép bạn tạo một cửa sổ với kiểu mở rộng. Chúng tôi sử dụng nó để tạo các trường đầu vào. Trong hàm này, tham số đầu tiên đã được thêm vào, thiết lập kiểu rất mở rộng này, các tham số còn lại giống như đối với CreateWindow (). Điều khiển là cửa sổ con, chủ nhân của chúng là cửa sổ chính.

Khi tạo điều khiển, trong các tham số hàm, bạn phải chỉ định bộ mô tả cửa sổ chính, cũng như kiểu cửa sổ WS_CHILD. Sự xuất hiện 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 bitwise "hoặc". Khi tạo điều khiển, chúng tôi khởi tạo các biến tương ứng bằng các chốt điều khiển của chúng, các biến này được trả về bởi các hàm CreateWindow () và CreateWindowEx (). Chúng tôi sẽ cần các bộ mô tả này để làm việc thêm với các điều khiển. Chúng tôi hiển thị cửa sổ chúng tôi đã tạo trên màn hình và vẽ lại nó.

Chức năng 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à cửa sổ điều khiển mà thông báo được dự định. 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. Nếu 0, thì tất cả các thư đượ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 sẽ thoát và ứng dụng sẽ thoát. TranslateMessage - dịch mã phím ảo thành tin nhắn bàn phím. DispatchMessage - Gửi một tin nhắn đến một chức năng cửa sổ để xử lý.

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

LRESULT CALLBACK 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ố thông báo.

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

Ví dụ: khi nhấn nút chuột trái trong khi con trỏ chuột ở trên vùng máy khách của cửa sổ, sự kiện WM_LBUTTONDOWN sẽ kích hoạt. Hàm window được gọi, giá trị của hằng 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 chương trình mà chúng ta cần.

Bên trong hàm window là một câu lệnh select thực hiện tác vụ trên. Câu lệnh lựa chọn phải chứa một trình xử lý mặc định, được thực thi bởi 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 tôi sẽ chết và không đi vào cuộc sống. Nhiều thông báo do 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. Đó là những gì DefWindowProc () dành cho.

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 cửa sổ chủ sở hữu, trong đó lParam chứa phần xử lý 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 trong điều khiển. Ví dụ: khi 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 một thông báo WM_QUIT đến cửa sổ.

Vài lời về cách viết các chương trình như vậy trong Delphi. Chúng tôi 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 đích sử dụng, thêm cửa sổ và thông báo ở đó. Xóa mọi thứ giữa bắt đầu và kết thúc. Việc chuẩn bị đã sẵn sàng. Bạn có thể viết mã. Không thể viết chương trình trên một API thuần túy mà không có sự trợ giúp, điều này phải luôn sẵn sàng. Nếu bạn là Gates, bạn không thể nhớ tất cả mọi thứ. Giới thiệu:

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

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

Phát triển GUI

Phương tiện tương tác chính của người dùng với chương trình là giao diện người dùng đồ họa (GUI). GUI của bất kỳ sản phẩm phần mềm nào là một trong những yếu tố quan trọng tạo nên sự phổ biến của nó.

Tạo giao diện người dùng có thẩm quyền là một quá trình tốn nhiều công sức và đòi hỏi sự chú ý tối đa đến từng chi tiết. Giao diện được tạo ra sẽ phát huy tối đa khả năng của chương trình nhưng đồng thời không gây quá tải cho người dùng với vô số menu, nút, hình ảnh và văn bản.

Trên thực tế, lập trình các ứng dụng Windows liên quan đến việc sử dụng rộng rãi các công cụ và trình hướng dẫn khác nhau. Do đó, có tính đến các tiêu chuẩn của hệ điều hành đã chọn, công cụ phần mềm sẽ có giao diện dạng cửa sổ. Điều này chủ yếu là do cửa sổ là thành phần chính của giao diện đồ họa trong các hệ điều hành (OS) thuộc họ Windows. Chúng là các khu vực hình chữ nhật có cài đặt, thuộc tính và kiểu riêng của chúng.

Phần đồ họa của khối đào tạo bao gồm bốn loại cửa sổ:

Cửa sổ chính - chứa tất cả các yếu tố điều hướng thông qua chương trình, cũng như thông tin bổ sung cần thiết để thuận tiện cho việc làm việc với PS;

Cửa sổ quản lý Infobase - bao gồm tất cả các yếu tố điều khiển của thành phần thông tin của công cụ phần mềm. Chúng cung cấp việc bổ sung các bài kiểm tra, thông tin, người dùng và quản trị viên mới, cho phép bạn thao tác với dữ liệu mới được tạo hoặc hiện có;

Windows để làm việc với các tính năng phần mềm - cung cấp công việc với các chức năng chính của khối đào tạo, chẳng hạn như vượt qua các bài kiểm tra và nghiên cứu bài giảng;

Windows để hiển thị thông tin và thống kê - được sử dụng để hiển thị nhiều loại thông tin khác nhau, cũng như số liệu thống kê và đồ thị.

Cửa sổ chương trình chính sẽ chứa các điều khiển và đầu ra thông tin sau:

Tiêu đề của cửa sổ, chứa tên của chương trình và mục đích của cửa sổ;

Các nút menu hệ thống chịu trách nhiệm thay đổi kích thước, thu nhỏ và đóng chương trình;

Khu vực cửa sổ có chức năng duy nhất là trang trí và cần thiết phải tuân theo quyết định thiết kế tổng thể;

Khu vực chào mừng;

Khu vực hiển thị ngày trong tuần, ngày giờ hiện tại;

Thanh công cụ người dùng chứa các nút để truy cập các chức năng chính của chương trình;

Bảng quản trị, bao gồm một nút để truy cập các kiểm soát quản trị của PS;

Thanh trạng thái hiển thị thông tin về tất cả các chế độ của chương trình.

Sơ đồ cửa sổ chính của giao diện đồ họa (cửa sổ cho tài khoản quản trị) được thể hiện trong Hình 3.2

Hình 3.2 - Sơ đồ cửa sổ chính của giao diện đồ họa: 1 - tiêu đề cửa sổ; 2 - các nút menu hệ thống; 3 - khu vực tiêu đề cửa sổ; 4 - thanh trạng thái; 5 - khu vực chào đón; 6 - khu vực đầu ra của ngày trong tuần, ngày và giờ; 7 - hội đồng quản trị; 8 - bảng điều khiển người dùng; 9 - nút để truy cập giai đoạn học tập; 10 - nút để truy cập giai đoạn thử nghiệm; 11 - nút để hiển thị số liệu thống kê và đồ thị; 12 - lối ra; 13 - nút để truy cập phần quản trị của ứng dụng

Có tính đến hướng của phần mềm đã phát triển, một số giải pháp đồ họa phi tiêu chuẩn đã được phát triển để thu hút sự chú ý và quan tâm nhiều hơn đến ứng dụng. Ngoài ra, điều này cho phép bạn có được một số loại cá nhân giữa phần còn lại của mảng các chương trình có chủ đề và trọng tâm tương tự.

Một trong những giải pháp này có thể được gọi là đầy màu sắc và tạo ra một thiết kế độc đáo, các yếu tố giao diện, không có điểm tương tự nào trong lĩnh vực này. Chúng ta đang nói về chèn hoạt hình dựa trên hoạt ảnh flash. Với sự giúp đỡ của họ, việc thiết kế tên của tất cả các cửa sổ chức năng chính, các phần tử điều hướng, giao diện của biểu mẫu đăng ký và ủy quyền được thực hiện. Những ưu điểm chính của sự phát triển này là: việc thực hiện một giao diện dễ chịu và thân thiện; đơn giản hóa đáng kể việc sử dụng chương trình, cả ở người dùng và ở cấp quản trị.

Một trong những lợi thế chính giữa các chương trình tương tự, cả trong phần mềm và triển khai đồ họa, là tổ chức vượt qua các bài kiểm tra theo yêu cầu. Để vượt qua loại kiểm tra này, người dùng cần phải tập hợp các truy vấn SQL từ các phần tử riêng biệt, độc lập. Tùy thuộc vào loại yêu cầu cần được biên dịch dựa trên các điều kiện của nhiệm vụ đề xuất, một đa giác nhất định được hình thành để lắp ráp. Đa giác chứa các trường cho các toán tử thay thế được kéo vào chúng bằng chuột từ một khối riêng biệt và các trường đầu vào cho tên của bảng, trường và điều kiện.

Thống kê người dùng được thực hiện dưới dạng đồ thị, được xây dựng tùy thuộc vào kết quả mà anh ta thu được. Mỗi bài kiểm tra có động lực riêng của nó. Biểu đồ chứa tất cả các nhãn cần thiết, được triển khai bằng cách sử dụng thành phần TChart và do đó có rất nhiều điều khiển được tích hợp vào thành phần theo mặc định và do đó, được triển khai trong ứng dụng.

Ngoài ra, để có hình ảnh thân thiện hơn, các kiểu tiêu đề bảng đã được thay thế, thay vì những kiểu được triển khai trong môi trường phát triển mặc định.

Do đó, các giải pháp đồ họa đã thực hiện có thể đạt được kết quả như mong đợi từ chính ý tưởng thiết kế GUI. Giao diện được tạo ra sẽ tối đa hóa khả năng của chương trình, nhưng đồng thời không gây quá tải cho người dùng với vô số menu, nút, hình ảnh và văn bản.