2013-01-20 11 views
7

Là một fan của trình soạn thảo văn bản đa nền tảng, Sublime Text 2, tôi đã thực hiện một số nghiên cứu về cách nó được phát triển. Các nhà phát triển đã lưu ý rằng nó là 99% C++ với một số GTK cho Linux và nó sử dụng một bộ công cụ giao diện người dùng tùy chỉnh mà ông gọi là "Sublime GUI". Đây là trích dẫn từ devC++ custom UI ToolKit - Tùy chọn cho lớp trừu tượng nền tảng chéo

Bản thân văn bản cao cấp 2 sử dụng bộ công cụ giao diện người dùng tùy chỉnh. Có rất nhiều ứng dụng mà điều này có thể không có ý nghĩa, nhưng nó không phải là một lựa chọn không hợp lý cho Sublime Text, nơi tôi luôn biết rằng rất nhiều các điều khiển giao diện người dùng sẽ phải được tùy chỉnh bất kể bộ công cụ (ví dụ, điều khiển văn bản và điều khiển tab). Bộ công cụ giao diện người dùng nằm ở trên cùng của lớp trừu tượng nền tảng chéo, đó là một sự kết hợp của chức năng nền tảng chứ không phải là mẫu số chung thấp nhất.

Câu hỏi của tôi là, một số tùy chọn cho lớp trừu tượng nền tảng chéo là gì? Tôi cho rằng điều này ở mức thấp hơn GTK, QT, SDL. Tôi đang cố gắng tìm ra cách một người sẽ tạo ra một bộ công cụ giao diện người dùng tùy chỉnh mà có thể là nền tảng chéo và chỉ phải viết mã một lần.

Tôi đánh giá cao những lợi ích của Bộ công cụ giao diện người dùng, nhưng nếu tôi muốn bị bẩn tay và hỗ trợ ứng dụng của mình trên Windows, Linux, Mac, tôi không chắc chắn nên bắt đầu từ đâu.

Trả lời

4

Tôi đoán câu hỏi quan trọng nhất là cách vẽ và nhận các sự kiện bàn phím và chuột.

Như tôi đã nhìn thấy nó có hai phương pháp để vẽ:

  1. Tạo một bối cảnh OpenGL và vẽ các vật dụng của bạn với OpenGL. Giống như glui.
  2. Sử dụng cơ sở hạ tầng bản vẽ gốc. Giống như GDI+ trên cửa sổ, XLib trên X11.

Tất nhiên bạn sẽ cần phải triển khai những điều nhất định cho từng nền tảng. Với OpenGL bạn cần phải viết bối cảnh (WGL, GLX, ..) xử lý cho mỗi nền tảng, trong khi với cơ sở hạ tầng bản vẽ bản địa bạn cần nhiều công việc hơn. Vì tất cả các cơ sở hạ tầng vẽ là duy nhất, bạn có thể muốn viết một bản tóm tắt cho bản vẽ và sau đó triển khai các widget của bạn với lớp trừu tượng vẽ của bạn.

Đối với xử lý sự kiện, tôi nghĩ bạn cũng sẽ cần phải viết tóm tắt của riêng bạn vì xử lý sự kiện là duy nhất cho mỗi nền tảng.

Cuối cùng, bạn cũng nên có một lớp trừu tượng để tạo cửa sổ chính trong đó bạn vẽ các tiện ích của mình và từ đó bạn sẽ nhận được các sự kiện.

Khi đi với OpenGL, bạn có thể bắt đầu với glut, đã xử lý việc tạo cửa sổ và xử lý sự kiện.

Lưu ý rằng tôi chưa bao giờ thực hiện bất kỳ điều gì như thế này. Tuy nhiên, tôi có lẽ sẽ thử phương pháp OpenGL vì tôi tin rằng đó là công việc ít hơn để đạt được mục tiêu.

+0

Dựa trên những gì tôi thấy có thể sử dụng GDI và XLib. Sử dụng một cái gì đó như Fraps bạn sẽ thấy thông tin gỡ lỗi nếu CPU đang được sử dụng, nhưng không có thông tin gỡ lỗi hiện tại. Vì vậy, tôi tin rằng nó đang làm phần mềm dựng hình. Cũng chạy gDEbugger có 0 cuộc gọi OpenGL. Mặc dù tôi chỉ thử nghiệm trên Windows, vì vậy có thể OpenGL được sử dụng trên các nền tảng khác, mặc dù tôi nghi ngờ điều đó. – leetNightshade

1

Có rất nhiều bộ công cụ GUI mà làm việc trên nền tảng (Tk, QT và GTK đến tên một vài)

Nếu bạn muốn viết riêng của bạn, mặc dù nó sẽ không phải là một bộ công cụ mức thấp hơn so với GTK , QT hoặc tương tự.

Bạn có thể phơi bày một giao diện tương tự như sau

void draw_window(mywindow *mw, char *name){ 
    non platform specific code goes here (maybe arg parsing, etc.) 

#IFDEF windows 
    windows specific code goes here 
#ENDIF 
#IFDEF macosx 
    mac specific code goes here 
#ENDIF 
#IFDEF linux 
    linux specific code goes here 
#ENDIF 

    non platform specific code goes here (tidying up, recording state, etc.) 
} 

Trong mỗi bộ phận nền tảng cụ thể mà bạn có thể cử đến một bộ công cụ gui cho nền tảng đó hoặc sử dụng bất cứ giao diện có sẵn (ví dụ; X11 cho Unix) .

Khi bạn biên dịch mã bạn chỉ định các nền tảng mục tiêu, và điều này sẽ xác định ifdef phần được biên soạn trong.

Tất nhiên điều này là quá đơn giản, và tuyệt vời chăm sóc sẽ phải được thực hiện để giao diện bạn phơi bày không phải là quá đau đớn để lập bản đồ lên tương đương nguyên bản.

+0

là có bất kỳ hướng dẫn nào giải thích một cửa sổ cơ bản với ít thành phần tạo ra. Chỉ để có được một ý tưởng. – programmer

+0

Có #ifdefs trong mã là khó để duy trì, do đó, không bao giờ là một ý tưởng tốt. Nó sẽ là tốt hơn để có một trừu tượng cho bản vẽ mà sau đó được sử dụng ở đây. Tất nhiên, sự trừu tượng này vẫn phụ thuộc vào hệ điều hành, nhưng giảm thiểu thành một phần nhỏ và chuyên dụng trong thư viện của bạn. Đó là btw. chính xác những gì Qt làm. Nếu bạn nhìn vào các phần phụ thuộc vào nền tảng, bạn sẽ nhận thấy rằng 98% Qt là nền tảng độc lập. Vì vậy, chỉ cần sử dụng Qt, đó là sự lựa chọn đúng. – dhaumann