Last time we saw how to load a string resource into a wstring. As already explained, ATL/MFC’s CString does offer very convenient methods for Win32 C++ programming. So, how can you load a string resource into a CString instance?
Well, it’s very simple! Just pass the string ID to a CString constructor overload with a proper type cast:
// Load string with ID IDS_MY_STRING from resources
// into a CString instance
CString myString( (PCTSTR) IDS_MY_STRING );
You can even #define a simple preprocessor macro that takes the string resource ID and and creates a CString object storing the string resource:
#define _S(stringResId) (CString((PCTSTR) (stringResId)))
When you need to pass a (localized) string loaded from resources to a Win32 API or ATL/MFC class member function that expects a string pointer (typically in the form of LPCTSTR/PCTSTR, i.e. const TCHAR*), then you can simply use the convenient macro defined above:
// Show a message-box to the user,
// displaying strings loaded from resources
MessageBox(nullptr,
_S(IDS_SOME_MESSAGE_FOR_THE_USER),
_S(IDS_SOME_TITLE),
MB_OK);
How does that work?
Well, first the _S macro defined above creates a (temporary) CString object and loads the string resource into it. Then, the implicit LPCTSTR conversion operator provided by CString is invoked by the C++ compiler, so the (read-only) string pointer is passed to the proper parameter of the MessageBox API.
See how simple is that compared to using std::wstring, where we needed to create an ad hoc non-trivial function to load wstring from resources!