2010-11-02 29 views
20

https://stackoverflow.com/questions/149698/what-is-a-good-mfc-starting-bookCách thay thế cho MFC

Rất nhiều ý kiến ​​nhận xét được nâng cấp có nhiều lựa chọn thay thế tốt hơn. Tôi muốn biết chúng có thể là gì.

Yêu cầu chính của tôi là giao diện người dùng sử dụng các tiện ích gốc để phần mềm tự động hóa của chúng tôi có thể hoạt động. Các cửa sổ được vẽ chủ sở hữu khó lái hơn nhiều.

Tôi không đặc biệt thích thiết kế của MFC nên một giải pháp thay thế sẽ tốt. Chỉ có một cái tôi tìm thấy là WX, cái mà chúng tôi đã thử và đang cân nhắc việc từ bỏ. Chúng ta cần thứ gì đó không ép buộc chúng ta chiến đấu với một bó gói nền tảng mà chúng ta không quan tâm. Chúng tôi đang viết một ứng dụng Windows và tiếp thị không cung cấp cho một crap duy nhất về nhắm mục tiêu Mac hoặc Linux (yeah, nó làm cho mông của tôi bị tổn thương quá).

Tôi đã xem xét tùy chọn .NET một chút. Vấn đề là tôi không biết nhiều về nó, nhưng từ những gì tôi có thể nói chúng tôi sẽ phải sử dụng C# để có được rất nhiều các tùy chọn có sẵn với MFC. Ví dụ, bộ công cụ C++/CLI dường như không có cửa sổ docking. Trong thực tế, một tùy chọn WinFroms thẳng lên dường như không. Có vẻ như chúng ta phải tạo một dự án WPF và dường như không phải là tất cả những gì chúng ta thực sự muốn (và chúng ta sẽ có một đống lớn crap để học bên cạnh một bộ công cụ khác). Di chuyển ra khỏi C++ cũng sẽ đòi hỏi rất nhiều gói và tôi không đặc biệt thích kết quả mà tôi đã nhìn thấy từ trình bao bọc tự động.

Vấn đề khác tôi có với tùy chọn .NET là chúng tôi có một ứng dụng vẽ khá mạnh (ngoài việc yêu cầu nhiều biểu mẫu). Tôi biết rằng bạn có thể nhận được kết quả tương tự với các ngôn ngữ JIT như .NET nhưng tôi cũng biết bạn phải cẩn thận hơn nhiều để làm như vậy. Đó là một vấn đề tôi muốn tránh lo lắng về thời gian này.

Vấn đề khác, và có lẽ quan trọng nhất với .NET (ít nhất là chuyển đổi ngôn ngữ) là chúng ta có nguồn cung cấp logic giao diện khổng lồ mặc dù API là thuyết bất khả tri, được viết rất nhiều trong C++.

Vì vậy, các tùy chọn khác là gì? Những người này thực sự có điểm hay họ chỉ la hét chống lại bất cứ thứ gì không phải là ngôn ngữ hoặc bộ công cụ yêu thích của họ?

LƯU Ý:
Sự cố ở đây là gì ?? Tôi nói cụ thể rằng việc chuyển sang các nền tảng khác thậm chí KHÔNG xem xét từ xa và tôi CÓ CÓ cái gì đó sử dụng bộ tiện ích gốc để chúng tôi không phải thay đổi hoàn toàn mọi thứ mà thử nghiệm sử dụng để tự động hóa sản phẩm !!!! Có ai thực sự đọc câu hỏi của tôi không?

+3

Cá nhân tôi không tìm thấy MFC xấu. Đó là một chút lỗi thời và tài liệu của nó không phải là luôn luôn tuyệt vời nhưng tôi thích mã nguồn so với Qt mà tôi nghĩ là một mớ hỗn độn để hiểu. Khi có để gỡ lỗi, có thể hiểu làm thế nào nó hoạt động dưới mui xe có thể được tốt đẹp (ngay cả khi bạn mất một số của nó khi MFC gọi các chức năng cửa sổ mà không có nguồn). Tôi không có kinh nghiệm với các framework khác nhưng tôi chỉ muốn nói không làm mất uy tín MFC quá nhanh. Nó không thực sự tuyệt vời nhưng nó không phải là xấu. – n1ckp

+0

Chủ yếu là tôi đang cố gắng tìm giải pháp thay thế. Có một điều mà phiền tôi rất nhiều về MFC mặc dù và đó là một thực tế là bạn có thể không có vẻ để đính kèm xử lý bên ngoài với nó. Trình xử lý "Message" không chỉ nằm trong bản đồ tĩnh, chúng phải là thành viên của lớp trực quan mà bạn đang tạo. Bạn không thể tạo tường lửa trình biên dịch bằng cách có hành vi bị chi phối bởi các đối tượng ẩn bên ngoài tệp .cpp. Đóng gói thực sự không có sẵn. Cũng không phải là một fan hâm mộ của một số đối tượng được tự xóa và những người khác không ... chỉ học được rằng một ngày hôm qua. Thiếu trình quản lý bố cục cũng không tuyệt vời. –

+0

Roberts: Vâng, tôi không hoàn toàn chắc chắn về phản đối của bạn nhưng tôi nghĩ rằng bạn có thể bỏ qua bằng cách sử dụng bản đồ tĩnh với overidding một số chức năng MFC (hãy xem http://stackoverflow.com/questions/978071/how-to-redirect -mfc-messages-to-another-object). Ngoài ra đối với các đối tượng tự xóa, tôi nghĩ rằng Qt là tồi tệ hơn về khía cạnh đó. Tôi không cố gắng bán cho bạn MFC mặc dù, tôi sẽ được hạnh phúc để có một lựa chọn tốt quá. Kinh nghiệm của tôi với Qt là từ việc tiếp quản từ các lập trình viên nghèo sử dụng nó vì vậy tôi có một chút thiên vị nhưng nó đã không thực sự thuyết phục tôi nó là tốt hơn (tôi muốn nói tương đương có thể?). – n1ckp

Trả lời

11

Qt là câu trả lời thực sự duy nhất cho bộ công cụ gui dựa trên C++ tại thời điểm này (ít nhất là cho các ứng dụng toàn màn hình). Ngay cả đối với các ứng dụng hoàn toàn là windows, nó cũng đáng giá - nó cũng có tích hợp tuyệt vời với studio trực quan (có được vs-addin) và được ghi lại rất tốt

wx có một số điểm đẹp, một là nó rất giống với MFC được sử dụng, nhưng với Qt đi lợi thế thực sự của LGPL wx đã bị mất.

Chỉnh sửa Tiện ích Qt không phải là nguồn gốc HƯỚNG DẪN họ sử dụng API tạo kiểu gốc để chúng không thể phân biệt được với các tiện ích gốc - nếu bạn sử dụng kiểu mặc định.

+0

QT có sử dụng bộ tiện ích gốc không? –

+0

@ Noah: không, Qt có bộ tiện ích con riêng, đó là một tiện ích rất thú vị. –

+0

@Noah, Qt không sử dụng các tiện ích gốc, nhưng nó hiển thị các tiện ích giống như Windows theo mặc định, trên Windows. –

1

Tôi đã thấy Qt được sử dụng khá rộng rãi. Cá nhân tôi đã không sử dụng Qt, nhưng tôi thấy rất nhiều câu hỏi về nó, nhiều hơn so với wXwidgets hoặc MFC. Tôi bắt đầu với điều đó.

3

MFC không phải là xấu trong ngày của nó nhưng nó là nhận được một chút cũ. Một ví dụ điển hình là các bộ sưu tập đã được thay thế bằng các bộ sưu tập STL tốt hơn nhiều. Tuy nhiên bạn đã hỏi về công cụ GUI. Có WTL (Thư viện mẫu Windows) mà tôi tin rằng bây giờ đã được mở nguồn. Nhiều dấu chân nhẹ hơn so với MFC nhưng nó được thiết kế để làm việc theo cùng một cách - ví dụ. Hầu hết các lớp đều có cùng tên và tên phương thức.

Mặt khác, tôi đã tìm thấy tài liệu tương đối nhỏ và nó dường như không hoạt động tốt với Visual Studio Wizards. Điều này có thể là vấn đề của tôi mặc dù - nhận được nó làm việc với các thuật sĩ VS sẽ là khá quan trọng IMHO.

+3

Đó là sự hiểu biết của tôi rằng WTL thực sự là một wrapper cho ATL, được thực hiện chủ yếu để làm cho việc viết COM dễ dàng hơn. Chúng ta sẽ cần trò chuyện với các đối tượng COM trong một vài khu vực rất địa phương nhưng không phải là toàn bộ. Việc thiếu sự hỗ trợ và tài liệu khiến tôi lo lắng. Tôi cũng lo ngại rằng nó không bao gồm hỗ trợ cho các yếu tố "gói tính năng" năm 2008, mà chúng tôi chắc chắn sẽ sử dụng rất nhiều. Tôi có sai về bất kỳ thứ gì trong số này không? –

+1

+1 để thực sự trả lời câu hỏi được hỏi. –

+0

Re. Hỗ trợ cho các tính năng mới: Khá có thể, tôi đã không sử dụng WTL trong sự tức giận trong một vài năm, vì vậy tôi không thể nói một trong hai cách. Đối với dev mới tôi chuyển sang phía tối (C#) trong đó có một số yếu tố GUI đẹp. – winwaed

4

Biểu mẫu Windows sẽ hoạt động tốt với C++/CLI. Các dạng Windows cũng xảy ra là một trình bao bọc xung quanh các tay cầm WIN32.

Không có sự khác biệt về khả năng của C#/Windows Forms so với C++/Windows Forms. (Họ chỉ biên dịch khác nhau) Cũng giống như bạn có thể làm những việc tương tự với C# và VB.NET ...

Nếu bạn đang tìm kiếm các cửa sổ lắp ghép, có một số thư viện của bên thứ ba thực hiện việc này. (Một số là mã nguồn mở, một số bạn có thể mua.) Vì CLR, bạn có thể trực tiếp bao gồm các hội đồng viết bằng một ngôn ngữ khác.

+0

Vậy chúng là gì ... enum xin vui lòng –

2

Tôi ở cùng vị trí: ứng dụng lớn, mã gốc, sử dụng MFC cho giao diện người dùng. Tôi không thấy bất kỳ lựa chọn thay thế thực sự hấp dẫn nào, hoặc lý do để chuyển sang bất kỳ thứ gì khác.

Điều đó đang được nói, hãy để tôi đưa ra ý kiến. Nếu tôi đang thực hiện một dự án mới, cần bảo tồn/kế thừa rất nhiều mã nguồn gốc, tôi sẽ xem xét cố gắng thực hiện một giao diện WPF với ứng dụng chính (C++/CLI). Điều này đã được thực hiện với Visual Studio 2010, và nó chủ yếu là hiệu suất, vì vậy nó ít nhất có thể. WPF có một số lợi ích UI, và nó có thể dễ dàng hơn để làm việc và thử nghiệm (từ một phối cảnh tự động hóa), vì nó là mã CLR. Tôi không chắc nó sẽ có giá trị đầu tư và học tập đường cong, nhưng đó là thay thế tôi sẽ xem xét cho một ứng dụng tinh khiết-Windows hiện đại với rất nhiều mã nguồn gốc.

Hy vọng điều đó sẽ hữu ích.

2

Để cung cấp một cái gì đó tôi không thấy đề cập trong câu trả lời khác:

Từ âm thanh của nó, lý do duy nhất của bạn cho cần điều khiển có nguồn gốc là phần mềm tự động hóa. Và lý do duy nhất để cần phần mềm tự động hóa đó là để thử nghiệm. Tôi sẽ giả định một số thử nghiệm tự động đang được sử dụng để đảm bảo phần mềm hoạt động như dự định.

Nếu đó là trường hợp, thì đây là điều cần xem xét: Có một mẫu thiết kế hợp lý phổ biến trong lĩnh vực C#/WPF được gọi là Model-View-ViewModel. Nếu không đi vào chi tiết quá mức ở đây, ý tưởng cơ bản là bạn có thể tách các điều khiển GUI thực (View) khỏi mã xử lý cách các điều khiển đó tương tác với phần còn lại của logic nghiệp vụ trong ứng dụng. Mã đó là cái gọi là ViewModel. Trong số những thứ khác, bản thân nó cho phép thiết kế ViewModel (và tất cả logic còn lại của ứng dụng) có thể được kiểm tra thông qua các phương pháp thử nghiệm đơn vị điển hình mà không cần phải có các điều khiển GUI.

Vì vậy, bất kỳ thử nghiệm nào phần mềm tự động được sử dụng để có thể được thay thế bằng mã kiểm tra đơn vị thẳng.

Tuy nhiên, kinh nghiệm của riêng tôi trong lĩnh vực này không gần như rộng rãi như tôi muốn. Vì vậy, nếu bạn xem xét điều này ở tất cả, tôi đề nghị nghiên cứu sâu hơn. Khi bắt đầu, các thuật ngữ googling như "Model-View-ViewModel" và "MVVM" cuối cùng sẽ mang lại một số cuộc thảo luận chi tiết hơn về phần đó.

+0

MVC là một phương pháp rất phổ biến và cũ và chúng tôi sử dụng nó khá một chút. Nó sẽ là đơn vị được thử nghiệm nếu tôi không được bảo để cắt góc: \ Nhưng ngay cả với tất cả các thử nghiệm đơn vị trên thế giới có hai vấn đề: 1) Mã xem không thể được kiểm tra đơn vị. 2) bạn vẫn cần chấp nhận và thử nghiệm tích hợp. Giống như các bài kiểm tra đơn vị, chúng phải được tự động hóa và chạy ít nhất trên mọi bản phát hành tiềm năng (mỗi đêm hoặc lâu hơn trong một phương thức nhanh). Ngay cả với tất cả mọi thứ dường như làm việc hoàn hảo khi ngoài bạn có thể bỏ lỡ những thứ mà chỉ quay lên trong sử dụng và bạn vẫn muốn có phản hồi nhanh chóng mà tự động cung cấp. –

+0

Cảm ơn ý tưởng, +1 –