Visual Studio 2017 Visual C++로 VC++/CLI GUI 개발

12321 단어 C++cliVisualStudio

소개



VC++/CLI는 .NET CLR에서 실행되지만 GUI도 개발할 수 있습니다. 그러나 VC++로 GUI를 만드는 사람은 거의 없었는지 이미 오와콘 상태입니다. 이전에는 확실히 더 두껍게 지원되고 있었다고 생각합니다만, 현재는 오마케와 같은 느낌입니다.

또한 Visual Studio 2017에서 개발할 때 문제가 있는 것처럼 보입니다. 예를 들어,
  • 일부 컨트롤이 제대로 작동하지 않습니다. (적어도 C# 및 VB.NET과 다르게 작동합니다.)
  • 윈도우 프로 시저를 수동으로 작성해야합니다.
  • 양식 디자인 화면을 처음 열 때 항상 오류가 발생합니다. .
  • 프로젝트의 속성을 수동으로 수정해야합니다.

  • 그렇다고 해서 복잡한 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);
        }
        };
    }
    

    -

    좋은 웹페이지 즐겨찾기