Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

WinForms aplikace ve Visual C++

20.2.2017

Pokud chcete pro vývoj aplikace použít technologii WinForms (.NET Framework) a psát v jazyce C++, tak v aktuálně (v době psaní tohoto článku) nejnovější verzi Microsoft Visual Studia 2015 se při zakládání nového projektu typu „Visual C++ -> CLR“ již nenabízí možnost přímo vytvořit WinForms aplikaci. Je tedy nutné si projekt vytvořit a nakonfigurovat „ručně“. Dobrou zprávou je že po vytvoření projektu nám Visual Studio stále nabízí podporu pro vizuální vývoj WinForms aplikace napsané v C++. Ostatně možnost vytvořit CLR aplikaci v C++ zůstala zachována pro projekt typu „Class library“, jejíž vývoj je pokud jde o použití vizuálních nástrojů v principu stejný jako u exe aplikace. Takže jak na to?

  • Založíme nový projekt typu Visual C++ -> CLR -> Empty Project.
  • Nejprve pomocí volby „Project → Add New Item → UI – Windows Form“ přidáme do projektu hlavní okno aplikace, zapouzdřené třídou odvozenou od Form – nazveme ji např. FormHlavni. Po tomto se nám pravděpodobně objeví chybová hláška ve smyslu že nelze otevřít vizuální návrhář. Po „rebuildu“ projektu a kliknutí na soubor FormHlavni.h v Solution Exploreru by se již měl otevřít vizuální návrhář našeho „formuláře“.
  • Dále je potřeba vytvořit vstupní bod procesu, tj, vytvořit ve zdrojovém kódu funkci „main“, bude vypadat třeba takto:
    [STAThread]
    int main(array<System::String^> ^/*args*/)
    {
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);
    WinFormsCpp::FormHlavni f;
    Application::Run(%f);
    return 0;
    }
    Tento kód můžeme umístit přímo do zdrojového souboru FromHlavni.cpp nebo lépe do samostatného souboru main.cpp.
  • Přidáme si podporu pro tzv. "předkompilované hlavičky": do projektu přidáme soubory stdafx.cpp a stdafx.h. Do souboru "stdafx.h" vložíme jediný řádek:
    #include "stdafx.h"
    
    a soubor stdafx.h může vypadat takto:
    #pragma once
    using namespace System;
    using namespace System::Security::Permissions;
    using namespace System::Reflection;
    using namespace System::Windows::Forms;
  • Když máme připravené soubory pro předkompilované hlavičky, otevřeme nastavení projektu Project -> Properties -> C/C++ -> Precompiled Headers a vpravo v poli "Precompiled Header" zvolíme "Use (/Yu)". Ověříme si že v poli "Precompiled Header File" je uveden soubor stdafx.h, pokud ne, zapíšeme ho tam. Dále musíme vybrat vlastnosti souboru stdafx.cpp, kde u výše uvedené volby "Precompiled Header" zvolíme "Create (/Yc)".
  • Soubor stdafx.h musíme také vložit (#include) na začátek zdrojového souboru FormHlavni.cpp (a do všech případných následně vytvořených zdrojových souborů).
  • Dále musíme nastavit tzv. vstupní bod aplikace na výše uvedenou funkci main. To provedeme v nastavení vlastností projektu, tj. volbo z menu: Project -> Properties (nahoře vybereme že chceme nastavovat pro všechny konfigurace a všechny cílové platformy) -> Linker -> Advanced -> do pole "Entry Point" napíšeme "main" (tj. název vstupní funkce - samozřejmě zde bez uvozovek).
  • Musíme také nastavit tzv. "subsystém", konkrétně to že se nejedná o konzolovou aplikaci (tento typ projektu je nastaven při výše uvedené volbě "CLR Empty project". Toto změníme opět v nastavení linkeru (viz. předchozí bod) kde vybereme volbu "Systém" a vpravo v poli "SubSystem" vybereme variantu "Windows (/SUBSYSTEM:WINDOWS)

Tím by mělo být vše hotovo a po "rebuildu" projektu by se po spuštění měl zobrazit hlavní "formulář" stejně jako u WinForms aplikace vytvořené v jazyce C# nebo Visual basic.

Zde si můžete stáhnout ukázkový projekt pro MS Visual Studio 2015:  winforms-cpp-25-2-2016.zip