Visual Studio 2019にはC++のためのフォームデザイナーがない件
Visual Studio 2019を利用してC++でWindowsフォームアプリを作成しようと「新しいプロジェクトの作成」で「Windowsデスクトップアプリケーション」を選んでみたものの、フォーム・デザイナーが見当たらないことに気が付いた。ユーザー・インターフェイスはソースコードを直接いじれということか。これは厳しい。
C++を諦めてC#でフォームをデザインしろというのが常識的な対処法になるのかもしれないが、それでもC++で作る必要があるという隙間需要を考慮し、今回はこの問題に対処する二通りの対処法をインターネット上で見つけることができたので紹介したいと思う。
Visual Studio Installerでは、「.NETデスクトップ開発」と「C++によるデスクトップ開発」にチェックを入れてインストールしておいたのだけれど、これだけではデフォルトで「ビルドツールC++/CLIサポート」がインストールされないようだ。これを追加インストールする必要がまずあった。その手順は次のとおり。
対処法1 コードを追加する方法
- Visual Studio Installerをまず起動した。
- 「インストール済み」のVisual Studio **** 2019に対して「変更」を選んだ。
- 「ワークロード」タブで「.NETデスクトップ環境」と「C++によるデスクトップ環境」の両方にチェックが入っていることを確認した。
- 「個別のコンポーネント」タブを選び、「C++/CLI」として検索した。そうするとビルドツールのC++/CLIサポートの一覧が表示された。
- この執筆時点では「v142ビルドツール(14.27)のC++/CLIサポート」がどうやら最新版のように見えたのでこれにチェックを入れた。
- そうしておいてからそのダイアログ・ボックス右下の「変更」ボタンを押した。
これでダウンロードとインストールが自動的に行われるので、しばらくの間待つ。
インストールが完了したが、「警告あり」と表示されてしまった。「問題の表示」によればMicrosoft.VisualStudio.AspNetDiagnosticPack.Msiのインストールに失敗したらしい。ここではこの問題には対処せず、無視して次の手順に進んだ。
- Visual Studio Installerを終了し、Visual Studio 2019を起動した。
- 「新しいプロジェクトの作成」を選んで「テンプレートの検索」でCLRを検索した。
- その検索によって表示された一覧の中から「CLR 空のプロジェクト(.NET Core)」を選んだ。「CLR 空のプロジェクト(.NET Framework)」を選んでもよい。
.NET Frameworkと.NET Coreとの違いについてはここでは触れない。
- プロジェクト名はProject1とした。フレームワークは.NET Framework 4.7.2とした。そして「作成」ボタンを押した。
- ソリューション・エクスプローラーの中にあるプロジェクト名(ここではProject1)の上で右クリック・メニューを開いて「追加」-「新しい項目」を選んだ。
そうすると「新しい項目の追加」ダイアログボックスが開く。
- Visual C++というカテゴリーの中の「UI」または「CLR」を選んだ。
- そして「Windowsフォーム」を選んだ。
- 「名前」はMyForm.hのまま、場所もそのままにして「追加」を押した。
ここで「データが失われる可能性を防ぐため、デザイナーの読み込み前に以下のエラーを解決する必要があります。」と表示され、「1個のエラー」として「この操作を完了するために必要なデータは、まだ利用できません。 (HRESULT からの例外:0x8000000A) 」と表示されてしまった。
なんらかのエラーが発生したため、Windowsフォーム・デザイナーの読み込みにどうやら失敗したらしい。
この問題を無視してこのプロジェクトもしくはソリューションを異端閉じて再度プロジェクトを開けばフォーム・デザイナーが起動したが、そのままだと予期せぬエラーに遭遇する危険性があるらしい。
そこでこの問題に対処するために次のような対処法があるという情報をマイクロソフトの開発者ネットワークのフォーラム内にて見つけることができた。ただし、根本的な対処法になるのか、ただの回避策なのかは未確認。なにか問題が生じたらまたこのブログに書き留めたいと思う。
ともかくその対処法の手順は次のとおり。
- Visual Studio 2019のトップメニューにある「プロジェクト」-「Project1(プロジェクト名)のプロパティ」を選んだ。
- 「Project1プロパティページ」というダイアログボックスが開くので、その左側のメニュー一覧から「リンカー」というカテゴリーを選んだ。
- 「リンカー」というカテゴリーの中の「システム」を選び、「サブシステム」という項目の値を「Windows (/SUBSYSTEM:WINDOWS)」とした。
- 「リンカー」というカテゴリーの中の「詳細設定」を選び、「エントリポイント」の値をMainとした。
- OKボタンを押して「Project1プロパティページ」を閉じた。
- ソリューション・エクスプローラーの一覧の中から「ソースファイル」というカテゴリーを選び、MyForm.cppというファイルを開いた。
- 「#include "MyForm.h"」というコードの下に次のコードをコピー&ペーストした。
//このコードを追加 using namespace System; using namespace System::Windows::Forms; [STAThreadAttribute] void Main(array<String^>^ args) { Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); //下のProject1はこのプロジェクト名 //MyFormはこのフォーム名 Project1::MyForm form; Application::Run(%form); }
このコード中にあるプロジェクト名Project1という部分は、ここで作成したプロジェクトの名前Project1とと一致している。その隣りのMyFormは追加したフォーム名と一致している。異なる場合は修正が必要。
- これらのコードを保存した後、このプロジェクトまたはソリューションを一端終了した。その際に「上書き保存」を選んだ。
- そして再度このプロジェクトを読み込んだ。
- MyForm.hを開くとフォーム・デザイナーが読み込まれていた。
左側のツールボックスを表示するとそこに各種コントロールの一覧があるので、それらを選択してWindowsフォーム上に配置していけばいい。
プロパティ・ウィンドウにプロパティ一覧が表示されないときには、例えばMyForm.hを再度開き直す必要があるかもしれない。
マイクロソフト社の開発者ネットワークのフォーラム内のここにこの問題の詳しい対処法が紹介されている。ただし英文。
この対処法の最大の欠点はプロジェクトを新たに作成するたびにこの手順を踏まなければいけないこと。サブフォームを追加するときにも同じエラーが生じるが、この場合は無視しても問題ないと思われる。
代替案として非公式の拡張機能をインストールする方法がある。
対処法2 拡張機能をインストールする方法
この問題に対処するもう一つの方法としてRichard Kaiser氏が提供している拡張機能を利用することがある。
- Visual Studio 2019のトップメニューから「拡張機能」-「拡張機能の管理」を選ぶ。
- 「拡張機能の管理」ダイアログボックスが開くので、「オンライン」というカテゴリーを選んでC++/CLRを検索する。
- 「C++/CLR Windows Forms for Visual Studio 2019」という拡張機能が表示されるはずなので、それをダウンロードする。
- ダウンロードが完了したら、そのダイアログボックスを閉じてVisual Studio 2019を終了する。
この時点でVSIXインストーラが自動的に作動するのでその指示に従う。
- デジタル署名がないこと、そしてライセンス契約に同意するのならば、Modifyボタンを押す。そうでなければCancelボタンを押す。
依存関係も含めて自動的にインストールしてくれるはず。
- インストールが完了したらVisual Studio 2019を再び起動する。
- 「新しいプロジェクトの作成」において「CppCLR_WinFormProject」を選ぶ。
この後の手順は従来どおり。
この拡張機能はあまり知られていないようだし、しかもデジタル署名がないことが気になったので利用しなかった。
Visual StudioのC++プロジェクトではダイアログエディタというものがあります。フォームエディタと同じと言っていいでしょう。
返信削除Windowsデスクトップアプリケーションで新しいプロジェクトを作ったとした場合、ソリューションエクスプロラーでリソースファイル(*.rcファイル)と開くと、リソースビューが開きます。リソースビューの中で、新しいダイアログを作ってGUIで編集したり、メニューや文字列テーブルなども作成・編集可能です。
そのコメント何が言いたいんです?この記事と関係ないやんw
削除ご助言に感謝申し上げます。
返信削除大変参考になりました。
返信削除ありがとうございます。