Visual Studio 2017 Visual C++로 VC++/CLI GUI 개발
12321 단어 C++cliVisualStudio
소개
VC++/CLI는 .NET CLR에서 실행되지만 GUI도 개발할 수 있습니다. 그러나 VC++로 GUI를 만드는 사람은 거의 없었는지 이미 오와콘 상태입니다. 이전에는 확실히 더 두껍게 지원되고 있었다고 생각합니다만, 현재는 오마케와 같은 느낌입니다.
또한 Visual Studio 2017에서 개발할 때 문제가 있는 것처럼 보입니다. 예를 들어,
그렇다고 해서 복잡한 GUI를 만드는 것은 추천할 수 없지만, 처리 결과를 콘솔 화면이 아닌 윈도우에 표시하고 싶은 정도라면 사용할 수 있을 것 같습니다.
프로젝트 만들기
Visual C++의 새 프로젝트에는 Windows Forms 응용 프로그램과 같은 옵션이 없습니다. 다음과 같이 빈 프로젝트를 선택합니다.
그림 1 "새 프로젝트"대화 상자
빈 프로젝트가 생성되면 프로젝트를 선택하고 컨텍스트 메뉴의 추가 - 새 항목에서 그림 2와 같이 UI - Windows Form을 선택하고 확인 버튼을 클릭합니다.
그림 2 "새 항목 추가"대화 상자
기본적으로 MyForm.cpp 및 MyForm.h라는 파일이 프로젝트에 추가됩니다. 이 중 MyForm.h가 GUI와 관련이 있으므로 이것을 열면 Fig.3과 같은 오류 화면이 표시됩니다.
그림 3 양식 표시 오류 화면
이것은 한번 빌드를 하면 해소되지만, Fig.4와 같은 에러가 표시됩니다. 이것은 "빈 프로젝트"에 양식을 추가했기 때문에 main 함수가 정의되지 않았기 때문입니다.
그림 4 빌드 오류
MyForm.cpp 를 코드 표시하고 다음과 같이 main 함수를 추가합니다. 혹은 Main.cpp 와 같은 소스를 추가해 거기에 기술해도 상관없습니다. 여기서 네임스페이스는 자체 프로젝트에 맞게 수정해야 합니다.
Code.1 MyForm.cpp의 수정 예
#include <Windows.h>
#include "MyForm.h"
using namespace GUI2;
int main()
{
MSG msg;
Console::WriteLine(L"Starting ..");
// フォームを構築して表示する。
MyForm ^myForm = gcnew MyForm();
myForm->Show();
Console::WriteLine(L"MyForm has shown ..");
// ウィンドウメッセージをディスパッチ
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
Console::WriteLine(L"MyForm destroyed.");
return 0;
}
빌드해 보면, Fig.5와 같은 링커 에러가 대량으로 나옵니다. 이는 프로젝트 속성에서 링커 설정을 수정하여 해결할 수 있습니다.
그림 5 링커 오류
그림 6과 같이 링커를 입력하여 Windows 시스템 DLL을 연결하도록 지시합니다.
그림 6 프로젝트 속성 설정
이제 실행해 보면 그림 7과 같은 화면이 표시됩니다.
그림 7 양식 표시
샘플
그림 7의 화면에서 양식 닫기 버튼 (x)을 클릭해도 응용 프로그램이 종료되지 않습니다.
응용 프로그램을 종료하려면 PostQuitMessage API 함수를 실행하면 되므로 FormClosed 핸들러에서 이 함수를 호출해야 합니다.
변경이 필요한 것은 헤더 파일뿐입니다. FormClosed 이벤트 핸들러를 추가하고 거기에서 PostQuitMessage를 호출합니다. (Code.2 아래)
Code.2 MyForm.h
#pragma once
namespace GUI2 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// MyForm の概要
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクター コードを追加します
//
}
protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~MyForm()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
private:
/// <summary>
/// 必要なデザイナー変数です。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->components = gcnew System::ComponentModel::Container();
this->Size = System::Drawing::Size(300,300);
this->Text = L"MyForm";
this->Padding = System::Windows::Forms::Padding(0);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->FormClosed += gcnew System::Windows::Forms::FormClosedEventHandler(this, &MyForm::MyForm_FormClosed);
}
#pragma endregion
// FormClosed
private: System::Void MyForm_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) {
PostQuitMessage(0);
}
};
}
-
Reference
이 문제에 관하여(Visual Studio 2017 Visual C++로 VC++/CLI GUI 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tadnakam/items/636db24546846da5a425
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <Windows.h>
#include "MyForm.h"
using namespace GUI2;
int main()
{
MSG msg;
Console::WriteLine(L"Starting ..");
// フォームを構築して表示する。
MyForm ^myForm = gcnew MyForm();
myForm->Show();
Console::WriteLine(L"MyForm has shown ..");
// ウィンドウメッセージをディスパッチ
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
Console::WriteLine(L"MyForm destroyed.");
return 0;
}
그림 7의 화면에서 양식 닫기 버튼 (x)을 클릭해도 응용 프로그램이 종료되지 않습니다.
응용 프로그램을 종료하려면 PostQuitMessage API 함수를 실행하면 되므로 FormClosed 핸들러에서 이 함수를 호출해야 합니다.
변경이 필요한 것은 헤더 파일뿐입니다. FormClosed 이벤트 핸들러를 추가하고 거기에서 PostQuitMessage를 호출합니다. (Code.2 아래)
Code.2 MyForm.h
#pragma once
namespace GUI2 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// MyForm の概要
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクター コードを追加します
//
}
protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~MyForm()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
private:
/// <summary>
/// 必要なデザイナー変数です。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->components = gcnew System::ComponentModel::Container();
this->Size = System::Drawing::Size(300,300);
this->Text = L"MyForm";
this->Padding = System::Windows::Forms::Padding(0);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->FormClosed += gcnew System::Windows::Forms::FormClosedEventHandler(this, &MyForm::MyForm_FormClosed);
}
#pragma endregion
// FormClosed
private: System::Void MyForm_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) {
PostQuitMessage(0);
}
};
}
-
Reference
이 문제에 관하여(Visual Studio 2017 Visual C++로 VC++/CLI GUI 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tadnakam/items/636db24546846da5a425텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)