2009-02-08 35 views
6

Trong Windows khi bạn tạo ra một cửa sổ, bạn phải xác định một (C++)thủ tục thông điệp Window trong Linux vs Windows

LRESULT CALLBACK message_proc(HWND Handle, UINT Message, WPARAM WParam, LPARAM LParam); 

để xử lý tất cả các tin nhắn được gửi từ hệ điều hành đến cửa sổ, giống như bấm phím và như vậy.

Tôi đang tìm cách thực hiện một số đọc về cách hệ thống tương tự hoạt động trong Linux. Có lẽ đó là vì tôi rơi một chút ngắn về thuật ngữ nhưng tôi không tìm thấy bất cứ điều gì về điều này thông qua google (mặc dù Im chắc chắn phải có rất nhiều!).

  • Nó vẫn chỉ là một hàm C duy nhất xử lý tất cả liên lạc?
  • Định nghĩa chức năng có khác nhau trên các WM khác nhau (Gnome, KDE) hay được xử lý ở mức thấp hơn trong hệ điều hành không?

Sửa: Ive nhìn vào các công cụ như QT và wxWidgets, nhưng những khuôn khổ dường như được hướng nhiều hơn đến việc phát triển các ứng dụng GUI rộng. Im thay vì tìm kiếm một cách để tạo ra một cửa sổ cơ bản (hạn chế thay đổi kích thước, biên giới/trang trí) cho đồ họa OGL của tôi và lấy đầu vào trên nhiều nền tảng. Và theo nghiên cứu ban đầu của tôi, loại chức năng này là cách duy nhất để lấy lại đầu vào đó.

Tuyến đường tốt nhất là gì? Đọc, học và sau đó sử dụng QT hoặc WxWidgets? Hoặc học cách các hệ thống hoạt động và thực hiện một số tính năng cơ bản mà tôi muốn?

+0

Nếu bạn cần một cái gì đó đơn giản, bạn có thể thử SDL http://www.libsdl.org/, một thư viện nền tảng nhằm mục đích phát triển trò chơi/ứng dụng đơn giản. – Ismael

+2

Im bắt đầu nhận ra rằng câu hỏi là cách để mở rộng để thực sự có một câu trả lời tốt. – Mizipzor

Trả lời

4

Về nguyên tắc, điều này hoàn toàn giống nhau. Tuy nhiên, nó không có gì để làm với giao tiếp với hệ điều hành (cũng không phải trên win32, sử dụng user32.dll là hoàn toàn tùy chọn)

Ứng dụng GUI có vòng lặp sự kiện ở đâu đó, xử lý tin nhắn từ hàng đợi ở một mức nào đó.

Có rất nhiều thư viện thường được sử dụng để "ẩn" hành vi này - bạn có thể sử dụng chúng (và thực sự, bạn nên). Nếu bất cứ điều gì, hệ thống sự kiện Xlib thậm chí còn tồi tệ hơn so với user32.dll của Win32, và ít được hiểu rộng rãi hơn, do đó ít người sử dụng nó trực tiếp hơn.


Trong Linux hoặc Windows, ứng dụng có thể sử dụng GUI ở mức độ thấp hoặc có thể sử dụng thư viện. Hầu hết sử dụng thư viện. Các ứng dụng cũng có thể chọn không thực hiện và vận hành mà không có GUI (các ứng dụng máy chủ thường làm điều này). Ứng dụng có thể tạo nhiều chuỗi, một trong số đó nằm trong vòng lặp sự kiện và các ứng dụng khác hoạt động khác nhau. Đây cũng là một cách tiếp cận phổ biến.

  • Hầu hết các ứng dụng GUI sử dụng thư viện trình độ cao hơn cho GUI của họ
  • các ứng dụng không tương tác, ví dụ ứng dụng máy chủ, không sử dụng GUI ở tất cả và không sử dụng các thư viện (ví dụ: XLib, user32.dll)
  • Ứng dụng không tự cho vay vào "Vòng lặp sự kiện" (ví dụ: Trò chơi) thường sử dụng riêng biệt để xử lý vòng lặp sự kiện của họ.
  • Những điều này phần lớn là đúng trên Win32 và Linux.
+0

Tốt, tôi đã hy vọng cho một câu trả lời như thế này. Im viết một trò chơi, do đó sẽ không có nhiều sự kiện GUI hoặc hệ thống. Nhưng nếu tôi tuyên bố rằng vòng lặp sự kiện là cách duy nhất để truy xuất dữ liệu đầu vào từ người dùng, bạn có thể chứng minh cho tôi sai không? – Mizipzor

+0

Trò chơi thường có một chuỗi riêng biệt để chạy vòng lặp sự kiện từ vòng chạy logic trò chơi - chuỗi logic trò chơi thường chọn lên dữ liệu trong biến được chia sẻ v.v. từ chuỗi xử lý sự kiện. Tuy nhiên, có những khả năng khác. – MarkR

5

Hoàn toàn khác và hoàn toàn khác. Đó là thủ tục cửa sổ là 100% cụ thể cho hệ điều hành Windows. Đối với Linux, nó sẽ phụ thuộc vào trình quản lý cửa sổ (gnome, kde - như bạn đã đề cập). Nếu bạn muốn phát triển nhiều nền tảng, bạn có thể muốn xem xét những thứ như QT.

Bạn có thể muốn có một cái nhìn tại các URL sau:

http://www.qtsoftware.com/products/appdev
http://en.wikipedia.org/wiki/Qt_toolkit

7

Vâng ở mức rất cơ bản bạn có giao thức X Window http://en.wikipedia.org/wiki/X_Window_System_core_protocol, mà chúng ta có thể khá phức tạp để xử lý nếu bạn muốn làm bất kỳ ứng dụng nào. Tiếp theo trên stack có Xlib http://en.wikipedia.org/wiki/Xlib là một trình bao bọc "thuận tiện" xung quanh giao thức X, nhưng vẫn phức tạp cho các ứng dụng "cuộc sống thực". Đó là trên đầu trang của Xlib mà hầu hết các khung công tác khác được xây dựng, cố gắng đơn giản hóa phát triển ứng dụng. Thông tin chi tiết nhất là: Xt, Gtk, Qt, v.v.

Giống như trong cửa sổ bạn có "vòng lặp sự kiện", và nếu bạn muốn bạn có thể thực hiện trên nó một phép ẩn dụ GetMessage/DispachMessage để bắt chước hành vi cửa sổ. Bằng cách đó bạn có thể có một WNDPROC, nhưng nguyên bản X không cung cấp những thứ như vậy.

Trước khi phát minh lại bánh xe là thích hợp hơn để xem xét các ứng dụng tương tự, những gì chúng đang sử dụng.

Nếu bạn cần một cái gì đó đơn giản, bạn có thể thử SDL http://www.libsdl.org/, một thư viện nền tảng nhằm mục đích phát triển trò chơi/ứng dụng đơn giản. Một lựa chọn khác là thư viện trò chơi Allegro http://www.talula.demon.co.uk/allegro/.

+0

Bạn có thể giải thích câu cuối cùng đó không? Tôi nghĩ WNDPROC là vòng lặp sự kiện. Và trong vòng lặp đó, tạo các sự kiện của riêng tôi để phần còn lại của ứng dụng không biết hệ điều hành nào chạy trên đó là thứ tôi đang lên kế hoạch. Đó có phải là cái gọi là hệ thống công văn không? – Mizipzor

+0

Windows có vòng lặp thông báo http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx. Đôi khi điều này bị ẩn bởi khung mà bạn đang sử dụng, nghĩa là MFC, .NET, v.v. – Ismael

+0

Đối với mỗi chuỗi bạn có hàng đợi thư, nơi các thư WM_XXX được lưu trữ khi chúng được tạo, vòng lặp thông báo có trách nhiệm xem thông báo này và cung cấp cho họ proc cửa sổ thích hợp. – Ismael

2

Như đã nêu trong xhantt, những gì truyền tải các thư tương đương bạn đang tìm kiếm là Hệ thống cửa sổ X. Mà, thực sự, có thể là một chút phức tạp.

Với XLib, bạn sẽ cần phải xử lý các sự kiện đăng ký và dequeuing trong vòng lặp chính của bạn. Xem XLib manual để biết mô tả đầy đủ về cách tiến hành. Nhưng đừng quên rằng bạn sẽ chỉ bắt cửa sổ và các sự kiện đầu vào theo cách này. Không phải mọi thông báo OS.

Bạn cũng có thể tìm kiếm XCB thư viện mới hơn và dễ dàng hơn.

Nếu bạn xây dựng ứng dụng của mình trên hai thư viện đó, nó sẽ chạy trơn tru dưới (hầu như, chúng tôi không bao giờ có thể quá chắc chắn) mọi WM. Và bạn sẽ không yêu cầu bất kỳ sự phụ thuộc nào mà hầu hết người dùng Linux không có trong quá trình cài đặt của họ. Nếu bạn đi với Qt, GTK, vv ... Nó sẽ được dễ dàng hơn và làm việc theo bất kỳ WM, nhưng họ có thể không có thư viện được cài đặt.

+0

Sự kiện cửa sổ và đầu vào là đủ. Như đã nói, tôi chỉ muốn một cửa sổ để vẽ một số OGL và lắng nghe đầu vào, cho một trò chơi đơn giản.Cảm ơn các liên kết đến XCB, Ill nhìn lên đó. – Mizipzor

Các vấn đề liên quan