{"id":158219,"date":"2012-11-11T18:34:03","date_gmt":"2012-11-11T14:34:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=158219"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=158219","title":{"rendered":"<span class=\"post_title\">\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 SteamWorks. \u0427\u0430\u0441\u0442\u044c 3<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"https:\/\/partner.steamgames.com\/public\/images\/logo_steamworks.gif\" align=\"left\"\/> \u0422\u0435\u043c\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b Screenshots,UserStats \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 wxWidgets.\u041c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c GUI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 Windows, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f.<br \/>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"http:\/\/www.wxwidgets.org\/\">wxWidgets<\/a>. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e <b>2.8.12<\/b>, \u0440\u0430\u0441\u043f\u0430\u043a\u0443\u0439\u0442\u0435 \u0430\u0440\u0445\u0438\u0432 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u0431\u043e\u0440\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"cpp\"> &quot;\u041f\u0443\u0442\u044c \u0434\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438&quot;\\build\\msw\\wx.dsw  <\/code><\/pre>\n<p>  \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 VS20xx x86 Native Tools Command Prompt \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435:<\/p>\n<pre><code class=\"cpp\">nmake \/f makefile.vc <\/code><\/pre>\n<p>  \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 mingw:<\/p>\n<pre><code class=\"cpp\">mingw32-make -f makefile.gcc <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a build \u043e\u043a\u043e\u043d\u0447\u0435\u043d \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 lib \u0438 include \u0444\u0430\u0439\u043b\u044b \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0443\u0442\u044c \u0434\u043e \u043d\u0438\u0445 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 wxWidgets \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"cpp\">#include &quot;wx\/wx.h&quot; <\/code><\/pre>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0424\u0443\u043d\u043a\u0446\u0438\u044f OnInit() \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">class MyApp: public wxApp {     virtual bool OnInit(); }; <\/code><\/pre>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0430 \u2014 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">class MyFrame: public wxFrame { public:      MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);     void OnQuit(wxCommandEvent& event);     void OnAbout(wxCommandEvent& event);     void OpenFile(wxCommandEvent& event);     void InitializeSteam(); \/\/\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f SteamWorks \tvoid WriteImage(wxString CurrentDocPath); \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0435\u0439\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \tvoid ShowAchievements(); \/\/ \u0412\u044b\u0432\u043e\u0434 \u043d\u0435\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0439 \u0432 EditBox. \tCSteamAPILoader loader;     ISteamUserStats002* userStats; \tISteamScreenshots001* screenShots; \tISteamClient012* Client;     wxTextCtrl *MainEditBox;     wxString CurrentDocPath;     DECLARE_EVENT_TABLE() }; <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f id \u043f\u0443\u043d\u043a\u0442\u0430\u043c \u043c\u0435\u043d\u044e.<\/p>\n<pre><code class=\"cpp\">enum {     ID_Quit = 1,     ID_About,     ID_Open, \tTEXT_Main  }; \/\/\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u0435\u043d\u044e BEGIN_EVENT_TABLE(MyFrame, wxFrame)     EVT_MENU(ID_Quit, MyFrame::OnQuit) \/\/ \u0412\u044b\u0445\u043e\u0434.     EVT_MENU(ID_About, MyFrame::OnAbout) \/\/ \u041e\u043a\u043d\u043e \u043e \u043d\u0430\u0441.     EVT_MENU(ID_Open, MyFrame::OpenFile) \/\/ \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0444\u0430\u0439\u043b\u0430. END_EVENT_TABLE()  IMPLEMENT_APP(MyApp) \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c main \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 wxWidgets. <\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 OnInit \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.<\/p>\n<pre><code class=\"cpp\">bool MyApp::OnInit() { \twxInitAllImageHandlers(); \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \tputenv(&quot;SteamAppId=1250&quot;); \/\/ 1250 Appid = KillingFloor - \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.     MyFrame *frame = new MyFrame( _(&quot;Fake Uploader&quot;), wxPoint(50, 50), \/\/ \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.                                   wxSize(1024,768) );     frame-&gt;Show(true); \/\/ \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u043f\u043e\u043a\u0430\u0437 \u0444\u0440\u0435\u0439\u043c\u0430.     SetTopWindow(frame); \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043d\u0430\u0448 \u0444\u0440\u0435\u0439\u043c.     return true; } <\/code><\/pre>\n<p>  \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c SteamWorks.<\/p>\n<pre><code class=\"cpp\">MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)     : wxFrame( NULL, -1, title, pos, size ) {     \/\/ \u0421\u0442\u0440\u043e\u0438\u043c \u043c\u0435\u043d\u044e     wxMenu *menuFile = new wxMenu;     menuFile-&gt;Append(ID_Open,                      _(&quot;&Open and write&quot;), _(&quot;Open an existing file&quot;));     menuFile-&gt;Append( ID_About, _(&quot;&About...&quot;) );      wxMenuBar *menuBar = new wxMenuBar;     menuBar-&gt;Append( menuFile, _(&quot;&File&quot;) );       SetMenuBar( menuBar );      CreateStatusBar();     SetStatusText( _(&quot;Welcome to Steam fake image uploader&quot;) ); \/\/ C\u0442\u0440\u043e\u043a\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0432\u043d\u0438\u0437\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.     SetBackgroundColour(wxColour(240,240,240)); \/\/\u0426\u0432\u0435\u0442 \u0431\u044d\u043a\u0433\u0440\u0430\u0443\u043d\u0434\u0430.   \tMainEditBox = new wxTextCtrl(this, ID_MainText, &quot;&quot;, wxDefaultPosition, wxDefaultSize,                                  wxTE_MULTILINE | wxTE_RICH , wxDefaultValidator, wxTextCtrlNameStr); \/\/\u041d\u0430\u0448 Edit Box \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \tInitializeSteam();  } <\/code><\/pre>\n<p>  \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) {      Close(TRUE); } <\/code><\/pre>\n<p>  About \u0434\u0438\u0430\u043b\u043e\u0433 \u0432 \u043c\u0435\u043d\u044e.<\/p>\n<pre><code class=\"cpp\">void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) {     wxMessageBox( _(&quot;Fake uploader by Dinisoid&quot;),                   _(&quot;Fake uploader&quot;),                   wxOK | wxICON_INFORMATION, this); } <\/code><\/pre>\n<p>  \u0414\u0438\u0430\u043b\u043e\u0433 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Open.<\/p>\n<pre><code class=\"cpp\">void MyFrame::OpenFile(wxCommandEvent& WXUNUSED(event)) {    \/\/ \u0420\u0435\u0436\u0438\u043c \u043c\u0443\u043b\u044c\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438.     wxFileDialog *OpenDialog = new wxFileDialog(this, wxFileSelectorPromptStr, wxEmptyString, wxEmptyString, _(&quot;Images|*.png;*.bmp;*.gif;*.tiff;*.jpg;*.jpeg&quot;), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);       if (OpenDialog-&gt;ShowModal() == wxID_OK) \/\/ \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0431\u0440\u0430\u043b \u0444\u0430\u0439\u043b\u044b.         {             CurrentDocPath = wxT(&quot;C:\/&quot;);             CurrentDocPath = OpenDialog-&gt;GetPath();             SetTitle(wxString(&quot;Choosen - &quot;) &lt;&lt; OpenDialog-&gt;GetFilename()); \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \t\t\twxArrayString paths; \t\t\tOpenDialog-&gt;GetPaths(paths); \t\t    for(unsigned int i = 0; i &lt; paths.GetCount(); i++) \/\/ \u0446\u0438\u043a\u043b \u043f\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c. \t\t    { \t\t\tWriteImage(paths[i]); \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430. \t\t    }         } } <\/code><\/pre>\n<p>  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u043a\u0430\u0437\u0430 \u043d\u0435\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0439.<\/p>\n<pre><code class=\"cpp\">void MyFrame::InitializeSteam() {        Client = (ISteamClient012 *)loader.GetSteam3Factory()(STEAMCLIENT_INTERFACE_VERSION_012, NULL);     if ( !Client )         {             printf(&quot;Unable to get ISteamClient.&quot;);         }      HSteamPipe pipe = Client-&gt;CreateSteamPipe();      if ( !pipe )         {             printf(&quot;Unable to get pipe&quot;);         }      HSteamUser user = Client-&gt;ConnectToGlobalUser( pipe );      if ( !user )         {             printf(&quot;Unable connect to global user&quot;);         }    screenShots =  (ISteamScreenshots001*)Client-&gt;GetISteamScreenshots(user, pipe, STEAMSCREENSHOTS_INTERFACE_VERSION_001);    userStats = (ISteamUserStats002 *)Client-&gt;GetISteamUserStats(user, pipe, STEAMUSERSTATS_INTERFACE_VERSION_002);    ShowAchievements(); } <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u0435\u0439\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.  <\/p>\n<pre><code class=\"cpp\">void MyFrame::WriteImage(wxString CurrentDocPath) {  \twxImage image(CurrentDocPath);     \/\/wxMessageOutput::Get()-&gt;Printf(&quot;%d %d&quot;, image.GetWidth(),image.GetHeight()); \/\/ \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f       ScreenshotHandle hScreen = screenShots-&gt;WriteScreenshot(image.GetData(), image.GetWidth() * image.GetHeight() * 3, image.GetWidth(), image.GetHeight());     Sleep(100);  } <\/code><\/pre>\n<p>  \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0432 EditBox-e.  <\/p>\n<pre><code class=\"cpp\">void MyFrame::ShowAchievements() {  \tCGameID Kfgame(1250); \/\/ id \u0438\u0433\u0440\u044b. \tuserStats-&gt;RequestCurrentStats(Kfgame); \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443     uint32 maxAchievements = userStats-&gt;GetNumAchievements(Kfgame); \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0439 \tbool data;     if (maxAchievements &gt; 0)         {             for (uint32 x = 0; x &lt; maxAchievements; x++)                 {                     const char *name = userStats-&gt;GetAchievementName(Kfgame, x);                     userStats-&gt;GetAchievement(Kfgame,name,&data); \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 \u0438 \u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441.                     if(!data) \/\/ \u0435\u0441\u043b\u0438 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d                         { \t\t\t\t\t\t\tMainEditBox-&gt;AppendText(wxString(name) + &quot;\\n&quot;); \/\/ \u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0438\u043c\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0432 EditBox                                                         \/\/userStats-&gt;SetAchievement(GameID,AchName);                                                        \/\/ \u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f.                         }                 }         }     userStats-&gt;StoreStats(Kfgame); \/\/\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 } <\/code><\/pre>\n<p>  <a href=\"http:\/\/steamcommunity.com\/sharedfiles\/filedetails\/?id=106004161&amp;insideModal=1\">\u041f\u0440\u0438\u043c\u0435\u0440<\/a> \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0412\u0438\u0434\u0438\u043c \u0438\u043c\u0435\u043d\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0439 \u0432 Main Edit Box, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0447\u0435\u0440\u0435\u0437 File-&gt;Open and write.<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/e66\/050\/94f\/e6605094fce9a390af5a63448e922b0b.png\"\/>    \t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/158219\/\"> http:\/\/habrahabr.ru\/post\/158219\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"https:\/\/partner.steamgames.com\/public\/images\/logo_steamworks.gif\" align=\"left\"\/> \u0422\u0435\u043c\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b Screenshots,UserStats \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 wxWidgets.\u041c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c GUI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 Windows, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-158219","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/158219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=158219"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/158219\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=158219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=158219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=158219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}