C ++ and GUI for learning

So, I am instructed to teach a programming course, which includes some materials about programming a graphical interface in C ++. I was wondering what would be the best setup for this? Linux and GCC are my tools of choice.

I never did such a course, I am a good C programmer, but not a C ++ programmer. I need C ++, because the same course should cover OOP, and how difficult it is to be C ++ !? :)

+8
c ++ user-interface
source share
9 answers

FWITW, Bjarne Stropstrups uses FLTK for the same purpose: http://www.stroustrup.com/Programming/sw_stack.html

+1
source share

If the OS and GUI toolkit is your choice, and it should be C ++, and you prefer Linux, then consider the Nokia Qt API,

It is free, open source, cross-platform and high-quality.

+10
source share

moans inward :) C ++ is completely different from C, not just about OOP ...

You might want to teach them a cross-platform GUI, such as wxWidgets or Qt. But this will require you to seriously learn about them first. There is a good book on wxWidgets available as a free PDF (cross-platform GUI programming using wxWidgets) - see http://ptgmedia.pearsoncmg.com/images/0131473816/downloads/0131473816_book.pdf .

The advantage of the cross-platform aspect is that you can use Linux and GCC whatever you like, and their skills will be transferred to other platforms as needed.

(By the way, you might also want to teach them CMake if you want to go down the whole line of portability in a big way ...)

+3
source share

You can do OOP and GUI in C. Look at GTK + .

+3
source share

I am a fan of gtkmm and glade . The graphical interface is not particularly beautiful, but it is the best GUI library from the perspective of a C ++ programmer. It is very easy to use, and that makes sense. In fact, you can create a beautiful graphical interface from scratch, nothing but a text editor and coding. On the other hand, the field designer also created a graphical interface with a graphical interface. gtkmm flawlessly connects to the C ++ standard library, but also provides an ustring class that supports std::string supports a unicode string class. It also comes with libsigC ++ for event handling. libsigC ++ is somewhat similar to Boost.Signals in design. A clear separation of problems in the library - structure, graphical interface and signals, also work well in pedagogical terms.

+3
source share

For “some things” about the graphical interface that you describe as “Drawing, event-based updating ...”, that is, basic concepts, consider the Windows API.

It is easy, it is concrete, and it allows your students to move forward to wrap it all in an OO way that is very educated.

An example that does “Drawing, event-based updating” is drawing a dynamic-sized ellipse (you need to define the three headers included at the top):

 #include <winapi/wrapper/windows_h.h> #include <cppSupport/error_handling.h> // cppSupport::throwX, cppSupport::ExitCode #include <cppSupport/anti_warnings.h> // cppSupport::suppressUnusedWarningFor #include <iostream> #include <string> // std::wstring using cppSupport::throwX; using cppSupport::ExitCode; using cppSupport::suppressUnusedWarningFor; RECT clientRectOf( HWND window ) { RECT result; GetClientRect( window, &result ); return result; } void drawEllipse( HDC dc, RECT const& boundingRect ) { RECT const& r = boundingRect; Ellipse( dc, r.left, r.top, r.right, r.bottom ); } namespace mainWindow { namespace detail { void paint( HWND window, HDC dc ) { drawEllipse( dc, clientRectOf( window ) ); } void onWmDestroy( HWND window ) { suppressUnusedWarningFor( window ); PostQuitMessage( ExitCode::success() ); } void onWmPaint( HWND window ) { PAINTSTRUCT info; HDC const deviceContext = BeginPaint( window, &info ); paint( window, deviceContext ); EndPaint( window, &info ); } LRESULT CALLBACK messageHandler( HWND window, UINT messageId, WPARAM wParam, LPARAM lParam ) { switch( messageId ) { case WM_DESTROY: return HANDLE_WM_DESTROY( window, wParam, lParam, onWmDestroy ); case WM_PAINT: return HANDLE_WM_PAINT( window, wParam, lParam, onWmPaint ); default: return DefWindowProc( window, messageId, wParam, lParam ); } } ATOM registerClass() { WNDCLASS const info = { CS_HREDRAW | CS_VREDRAW, // UINT style; &messageHandler, // WNDPROC lpfnWndProc; 0, // int cbClsExtra; 0, // int cbWndExtra; GetModuleHandle( 0 ), // HINSTANCE hInstance; 0, // HICON hIcon; LoadCursor( 0, IDC_ARROW ), // HCURSOR hCursor; reinterpret_cast<HBRUSH>( COLOR_WINDOW + 1 ), // HBRUSH hbrBackground; 0, // LPCTSTR lpszMenuName; L"MainWindowClass" // LPCTSTR lpszClassName; }; ATOM const result = RegisterClass( &info ); (result != 0) || throwX( "registerWindowClass: RegisterClass failed" ); return result; } ATOM classAtom() { static ATOM const theClassAtom = registerClass(); return theClassAtom; } } // namespace mainWindow::detail HWND create( std::wstring const& title ) { HWND const window = CreateWindow( MAKEINTATOM( detail::classAtom() ), // LPCTSTR lpClassName, title.c_str(), // LPCTSTR lpWindowName, WS_OVERLAPPEDWINDOW, // DWORD dwStyle, CW_USEDEFAULT, // int x, CW_USEDEFAULT, // int y, CW_USEDEFAULT, // int nWidth, CW_USEDEFAULT, // int nHeight, 0, // HWND hWndParent, 0, // HMENU hMenu, GetModuleHandle( 0 ), // HINSTANCE hInstance, 0 // LPVOID lpParam ); (window != 0) || throwX( "createMainWindow: CreateWindow failed" ); return window; } } // namespace mainWindow bool getMessage( MSG& message, HWND window = 0 ) { int const result = GetMessage( &message, window, 0, 0 ); (result != -1) || throwX( "getMessage: GetMessage failed" ); return (result != 0); } ExitCode dispatchWindowMessages() { MSG message; while( getMessage( message ) ) { TranslateMessage( &message ); DispatchMessage( &message ); } assert( message.message == WM_QUIT ); return ExitCode( message.wParam ); } ExitCode cppMain() { HWND const window = mainWindow::create( L"My main window" ); ShowWindow( window, SW_SHOWDEFAULT ); return dispatchWindowMessages(); } int main() { try { return cppMain(); } catch( std::exception const& x ) { std::cerr << "!" << x.what() << std::endl; } return ExitCode::failure(); } 

EDIT : Well, perhaps the best place is to place these three headings. This is not a good (complete) answer without them. So.

[WinAPI / wrapper / windows_h.h] :

 // Copyright (c) 2010 Alf P. Steinbach #ifndef WINAPI_WRAPPER_WINDOWSH_H #define WINAPI_WRAPPER_WINDOWSH_H //#include <progrock/cppx/devsupport/better_experience.h> #ifdef _MBCS # error _MBCS was defined, only Unicode is supported. #endif #undef UNICODE #undef _UNICODE #undef STRICT #undef NOMINMAX #define UNICODE #define _UNICODE #define STRICT #define NOMINMAX #ifdef _WIN32_WINNT # if _WIN32_WINNT < 0x5000 # error _WIN32_WINNT < 0x5000, pre-Windows 2000 is not supported. # endif #else # define _WIN32_WINNT 0x5000 #endif #ifdef _WIN32_IE # if _WIN32_IE < 0x5000 # error _WIN32_IE < 0x5000, that old browser / Windows shell is not supported. # endif #else # define _WIN32_IE 0x5000 #endif #include <windows.h> #include <windowsx.h> //------------------------------------------------- g++ fixups: #ifndef BS_TYPEMASK # define BS_TYPEMASK 0x0000000F #endif #ifndef BS_PUSHBOX # define BS_PUSHBOX 0x0000000AL #endif #ifndef EN_ALIGN_LTR_EC # define EN_ALIGN_LTR_EC 0x0700 # define EN_ALIGN_RTL_EC 0x0701 #endif #ifndef LBS_COMBOBOX # define LBS_COMBOBOX 0x8000L #endif #endif 

[cppsupport / error_handling.h] :

 #ifndef CPPSUPPORT_ERROR_HANDLING_H #define CPPSUPPORT_ERROR_HANDLING_H //-------------------------------- Dependencies: #include <assert.h> // assert #include <stdexcept> // std::runtime_error, std::exception #include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE #include <string> // std::string, std::wstring //-------------------------------- Interface: namespace cppSupport { inline bool throwX( std::string const& s ) { throw std::runtime_error( s ); } struct ExitCode { int value; explicit ExitCode( int v ): value( v ) {} operator int() const { return value; } static ExitCode success() { return ExitCode( EXIT_SUCCESS ); } static ExitCode failure() { return ExitCode( EXIT_FAILURE ); } }; } // namespace cppSupport #endif 

[cppsupport / anti_warnings.h] :

 #ifndef CPPSUPPORT_ANTI_WARNINGS_H #define CPPSUPPORT_ANTI_WARNINGS_H //-------------------------------- Dependencies: // -- None. //-------------------------------- Interface: namespace cppSupport { template< class Type > void suppressUnusedWarningFor( Type const& ) {} } // namespace cppSupport #endif 

Greetings and hth.

+1
source share

If you are using C ++ and Linux, consider gtkmm. The GNOME Desktop is based on GTK +, and gtkmm is the official C ++ shell for the GTK + library. It comes with good documentation and, which may be important for training, tries to use the standard C ++ library as much as possible.

Another popular choice for Qt (which is also a very good toolkit, especially if you need cross-platform compatibility) has reprofiled most of the standard library, which probably makes it not a good choice if you teach the C ++ standard.

+1
source share

For linux, I can recommend ultimate ++ and qt . I personally use qt and I think this is not bad, with the exception of some real WTF stuff.

As for C ++, I would not argue so easily. c and c ++ are completely different.

0
source share

OpenGL graphics with most languages ​​are a great start. It's free, open source, the concepts are easy to explain, and the API is well tested, powerful, and even available on mobile platforms such as iPhone or Android. Highly recommend.

0
source share

Source: https://habr.com/ru/post/650056/


All Articles