[wxWidgets] Compiling wxWidgets for MS Windows

Posted on Dec 30, 2014

1. Get the latest source code from https://www.wxwidgets.org/downloads/ (ver 3.0.2 as of Dec 30, 2014) and unzip it somewhere.

2. Go to ./build/msw

3. Compile
– For MS Visual Studio, find a solution file for your VS version (e.g., wx_vc12.sln) and build.
– For MinGW, open a cmd window and set the bin folder of MinGW in the beginning of your PATH environment variable, like the following example.

1
set "PATH = C:\GNU\mingw64\bin;%path%"

Then, run the following commands, depending on the version you want to build.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@ release DLL
mkdir ..\..\lib\gcc_dll\mswu\wx
mingw32-make -f makefile.gcc CXXFLAGS="-std=gnu++11" BUILD=release SHARED=1 UNICODE=1 MSLU=0 clean
mingw32-make -f makefile.gcc CXXFLAGS="-std=gnu++11" BUILD=release SHARED=1 UNICODE=1 MSLU=0
 
@ debug DLL
mkdir ..\..\lib\gcc_dll\mswud\wx
mingw32-make -f makefile.gcc CXXFLAGS="-std=gnu++11" BUILD=debug SHARED=1 UNICODE=1 MSLU=0 clean
mingw32-make -f makefile.gcc CXXFLAGS="-std=gnu++11" BUILD=debug SHARED=1 UNICODE=1 MSLU=0
 
@ release static LIB
mkdir ..\..\lib\gcc_lib\mswu\wx
mingw32-make -f makefile.gcc CXXFLAGS="-std=gnu++11" BUILD=release SHARED=0 UNICODE=1 MSLU=0 clean
mingw32-make -f makefile.gcc CXXFLAGS="-std=gnu++11" BUILD=release SHARED=0 UNICODE=1 MSLU=0
 
@ debug static LIB
mkdir ..\..\lib\gcc_lib\mswud\wx
mingw32-make -f makefile.gcc CXXFLAGS="-std=gnu++11" BUILD=debug SHARED=0 UNICODE=1 MSLU=0 clean
mingw32-make -f makefile.gcc CXXFLAGS="-std=gnu++11" BUILD=debug SHARED=0 UNICODE=1 MSLU=0

Continue…

[wxWidgets] Add an icon from .ico file

Posted on Dec 21, 2014

YourApp.rc

1
2
3
mondrian ICON "mondrian.ico" // identifier ICON filename
 
#include "wx/msw/wx.rc"

YourApp.cpp

1
2
3
4
5
6
7
// In the constructor,
MyDialog::MyDialog(wxWindow* parent)
{
    ...
 
    SetIcon(wxICON(mondrian)); // the same identifier that you put in the rc file
}

[wxWidgets] Add “About…” to the system menu

Posted on Dec 21, 2014

Original post: https://forums.wxwidgets.org/viewtopic.php?f=20&t=13921

MyDialog.h

1
2
3
4
5
6
7
class MyDialog : public wxDialog
{
    ...
 
    // Override MSWTranslateMessage
    bool MSWTranslateMessage(WXMSG* pMsg);
};

MyDialog.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Include aboutdlg.h
#include <wx/aboutdlg.h>
 
MyDialog::MyDialog(wxWindow* parent)
{
    ...
 
    // Add the menu item, "About...", to the system menu
    HMENU hSystemMenu = ::GetSystemMenu((HWND__*)GetHWND(), FALSE);
    ::AppendMenu(hSystemMenu, MF_SEPARATOR, 0, wxT(""));
    ::AppendMenu(hSystemMenu, MF_STRING, wxID_ABOUT, wxT("About..."));
    ::DrawMenuBar((HWND__*)GetHWND());
}
 
// implement the message handler
bool MyDialog::MSWTranslateMessage(WXMSG* pMsg)
{
    if (WM_SYSCOMMAND==pMsg->message && wxID_ABOUT==pMsg->wParam)
    {
        wxAboutDialogInfo di;
        di.SetName(wxT("My App"));
        di.SetVersion(wxT("1.00"));
        di.SetDescription(wxT("This app does cool trix!"));
 
        wxAboutBox(di);
 
        return true; // Message processed
    }
 
    return wxDialog::MSWTranslateMessage(pMsg);
}

Conversion between UTF-16 and UTF-8 in C++

Posted on Jun 5, 2014

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <fstream>
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
 
// Unicode representation in MS Windows uses the 2-byte wchar_t type.
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> utfconv;
 
// string conversion
std::wstring wide = L"Hello, World! 안녕하세요?"// wide string with utf-16 encoding
std::string narrow = utfconv.to_bytes(wide);     // conversion from utf-16 to utf-8
wide = utfconv.from_bytes(narrow);               // back from utf-8 to utf-16
 
// conversion during file I/O
std::wofstream fout;                             // wide output stream
fout.open("test.txt", fout.out);
fout.imbue(std::locale(fout.getloc(), new std::codecvt_utf8_utf16<wchar_t>));
fout << wide << std::endl;                       // this stream is stored as utf-8
fout << utfconv.from_bytes(narrow) << std::endl; // the same as the above line
fout.close();
 
std::wifstream fin;
fin.open("test.txt", fin.in);
fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf8_utf16<wchar_t>));
std::wstring hello, world, anyoung, tline;
fin >> hello >> world >> anyoung;      // utf-8 stream is converted to utf-16 string
std::getline(fin, tline);              // read out the end of the line
std::getline(fin, tline);              // read the next line
fin.close();