wxWidgets에서 윈도우 제목 변경하기 위해선 wxWidets에서 이런 기능을 지원해준다.

 

1
    SetTitle("Test");
cs

 

 이렇게 하면, Test라는 타이틀을 적용하는것이 가능하다.

 

 

 이렇게 적용이 가능하다.

 이걸 이용해서 파일을 읽어 오면, 파일의 이름을 적용하는 방법이 가능해진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
void MyFrame::OnOpen(wxCommandEvent& event)
{
    wxFileDialog openFileDialog(this, _("Open TXT file"), """",
        "TXT files (*.txt)|*.txt", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
    if (openFileDialog.ShowModal() == wxID_CANCEL)
        return// 사용자가 취소했을 때
 
    // 파일을 열고 텍스트 컨트롤에 내용을 로드합니다.
    {
        // 열린 파일의 이름을 타이틀로 설정합니다.
        SetTitle(openFileDialog.GetFilename());
    }
}
cs

 

 

Posted by JunkMam
,

 

 옵션을 띄우는 간단한 장치로 Dialog를 적용하는 것이 있다.

 간단하게 옵션창을 띄우기 위해서 창에 관련된 정보를 다음과 같이 처리하기 위해서 "wxDialog"을 사용하는 방법이 있다.

 

SettingDialog.h라는 파일을 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
 
#include <wx/wx.h>
 
#ifndef __WX_WIDGETS_SETTING_DIALOG_H__
#define __WX_WIDGETS_SETTING_DIALOG_H__
 
// ID 값 정의
enum
{
    ID_Settings = wxID_HIGHEST + 1 // 사용자 정의 ID
};
 
class SettingsDialog : public wxDialog
{
public:
    SettingsDialog(wxWindow* parent, wxWindowID id, const wxString& title,
        const wxPoint& pos = wxDefaultPosition,
        const wxSize& size = wxDefaultSize,
        long style = wxDEFAULT_DIALOG_STYLE);
};
 
#endif
cs

 

여기서 간단한 방법을 적용하는 방법으로 다음과 같이 한다.

 

Setting.Dialog.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#include <wx/wx.h>
 
#include "SettingsDialog.h"
 
SettingsDialog::SettingsDialog(wxWindow* parent, wxWindowID id, const wxString& title,
    const wxPoint& pos,
    const wxSize& size,
    long style)
    : wxDialog(parent, id, title, pos, size, style) {
 
    // 설정 대화 상자의 내용을 여기에 구성
    // 예: 설정 옵션을 위한 컨트롤 추가
    new wxStaticText(this, wxID_ANY, "Settings Placeholder", wxPoint(2020), wxDefaultSize);
    // OK 및 Cancel 버튼 추가
    CreateStdDialogButtonSizer(wxOK | wxCANCEL);
 
}
cs

 

이렇게 하면, wxWidgets에서 제공해주는 wxDialog를 적용이 가능하다.

 

제대로 적용한다면, 다음과 같이 사용한다.

 

wxMain.h에 다음과 같이 수정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#pragma once
#include "wx/wx.h"
#include <wx/filedlg.h>
#include <wx/textctrl.h>
#include <wx/splitter.h>
 
#include "SettingsDialog.h"
 
enum
{
    ID_QUIT,
};
 
enum {
    MY_EVENT_ID = 10001,
};
 
// ID 값 정의
enum
{
    ID_Settings_Menu = wxID_HIGHEST + 1 // 사용자 정의 ID
};
 
class MyApp : public wxApp
{
public:
    virtual bool OnInit();
};
 
class MyFrame : public wxFrame
{
public:
    MyFrame(const wxString& title);
 
    void OnQuit(wxCommandEvent& event);
 
private:
    wxTextCtrl* textControl;
 
    void OnOpen(wxCommandEvent& event);
    void OnSave(wxCommandEvent& event);
    void OnButtonClick(wxCommandEvent& event);
 
    void OnSettings(wxCommandEvent& event);
};
 
cs

 

 

main에 제대로 적용하기 위해서

wxMain.cpp을 다음과 같이 수정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "wxMain.h"
 
wxIMPLEMENT_APP(MyApp);
 
bool MyApp::OnInit()
{
    MyFrame* frame = new MyFrame("Serial Graph");
    frame->Show(true);
    return true;
}
 
MyFrame::MyFrame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    wxMenu* menuFile = new wxMenu;
    menuFile->Append(wxID_OPEN, "&Open\tCtrl-O""Open a file");
    menuFile->Append(wxID_SAVE, "&Save\tCtrl-S""Save the file");
    menuFile->AppendSeparator();
    menuFile->Append(ID_QUIT, "E&xit\tAlt-X""프로그램 종료");
 
    wxMenu* menuOptions = new wxMenu;
    menuOptions->Append(ID_Settings, "&Options""Options Setting");
 
    wxMenuBar* menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");
    menuBar->Append(menuOptions, "&Options");
 
    SetMenuBar(menuBar);
 
    textControl = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
 
    // sizer를 생성하여 텍스트 컨트롤의 크기를 조정합니다.
    wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
    sizer->Add(textControl, 1, wxEXPAND | wxALL, 0); // wxEXPAND는 컨트롤이 sizer의 가능한 모든 공간을 차지하도록 합니다. 1은 비율을 의미하며, 이 경우 다른 컨트롤이 없으므로 전체 크기를 차지합니다.
 
    // 프레임에 sizer를 설정합니다.
    this->SetSizer(sizer);
    this->Layout(); // sizer를 강제로 다시 계산하여 적용합니다.
 
 
    CreateStatusBar();
    SetStatusText("Ready");
 
    // 이벤트 핸들러 연결
    Bind(wxEVT_MENU, &MyFrame::OnQuit, this, ID_QUIT);
    Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN);
    Bind(wxEVT_MENU, &MyFrame::OnSave, this, wxID_SAVE);
 
    Bind(wxEVT_MENU, &MyFrame::OnSettings, this, ID_Settings);
}
 
void MyFrame::OnQuit(wxCommandEvent& event)
{
    Close(true);
}
 
void MyFrame::OnOpen(wxCommandEvent& event)
{
    wxFileDialog openFileDialog(this, _("Open TXT file"), """",
        "TXT files (*.txt)|*.txt", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
    if (openFileDialog.ShowModal() == wxID_CANCEL)
        return// 사용자가 취소했을 때
 
    // 파일을 열고 텍스트 컨트롤에 내용을 로드합니다.
    textControl->LoadFile(openFileDialog.GetPath());
}
 
void MyFrame::OnSave(wxCommandEvent& event)
{
    wxFileDialog saveFileDialog(this, _("Save TXT file"), """",
        "TXT files (*.txt)|*.txt", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
    if (saveFileDialog.ShowModal() == wxID_CANCEL)
        return// 사용자가 취소했을 때
 
    // 현재 텍스트 컨트롤의 내용을 파일에 저장합니다.
    textControl->SaveFile(saveFileDialog.GetPath());
}
 
void MyFrame::OnSettings(wxCommandEvent& event)
{
    SettingsDialog dialog(this, wxID_ANY, "Settings");
    if (dialog.ShowModal() == wxID_OK)
    {
        // 사용자가 설정을 변경하고 OK를 클릭했을 때의 처리
        SetStatusText("Settings Updated");
    }
}
cs

 

 이렇게 해서 적용하면, 제대로 동작하는걸 확인이 가능하다.

 

 

 이렇게 해서 메뉴가 추가되고,

 

 

 이런창이 띄워지면서 처리가 가능하다.

 

 

 

wxWidget_VS_2023_11_29_0830_ex00.zip
1.05MB

Posted by JunkMam
,

wxMain.h

#pragma once
#include "wx/wx.h"
#include <wx/filedlg.h>
#include <wx/textctrl.h>
#include <wx/splitter.h>

enum
{
    ID_QUIT,
};

enum {
    MY_EVENT_ID = 10001,
};

class MyApp : public wxApp
{
public:
    virtual bool OnInit();
};

class MyFrame : public wxFrame
{
public:
    MyFrame(const wxString& title);

    void OnQuit(wxCommandEvent& event);

private:
    wxTextCtrl* textControl;

    void OnOpen(wxCommandEvent& event);
    void OnSave(wxCommandEvent& event);
    void OnButtonClick(wxCommandEvent& event);
};

 

 

wxMain.c

#include "wxMain.h"

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    MyFrame* frame = new MyFrame("Serial Graph");
    frame->Show(true);
    return true;
}

MyFrame::MyFrame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    wxMenu* menuFile = new wxMenu;
    menuFile->Append(wxID_OPEN, "&Open\tCtrl-O", "Open a file");
    menuFile->Append(wxID_SAVE, "&Save\tCtrl-S", "Save the file");
    menuFile->AppendSeparator();
    menuFile->Append(ID_QUIT, "E&xit\tAlt-X", "프로그램 종료");

    wxMenuBar* menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");

    SetMenuBar(menuBar);

    textControl = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);

    // sizer를 생성하여 텍스트 컨트롤의 크기를 조정합니다.
    wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
    sizer->Add(textControl, 1, wxEXPAND | wxALL, 0); // wxEXPAND는 컨트롤이 sizer의 가능한 모든 공간을 차지하도록 합니다. 1은 비율을 의미하며, 이 경우 다른 컨트롤이 없으므로 전체 크기를 차지합니다.

    // 프레임에 sizer를 설정합니다.
    this->SetSizer(sizer);
    this->Layout(); // sizer를 강제로 다시 계산하여 적용합니다.


    CreateStatusBar();
    SetStatusText("Ready");

    // 이벤트 핸들러 연결
    Bind(wxEVT_MENU, &MyFrame::OnQuit, this, ID_QUIT);
    Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN);
    Bind(wxEVT_MENU, &MyFrame::OnSave, this, wxID_SAVE);
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
    Close(true);
}

void MyFrame::OnOpen(wxCommandEvent& event)
{
    wxFileDialog openFileDialog(this, _("Open TXT file"), "", "",
        "TXT files (*.txt)|*.txt", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
    if (openFileDialog.ShowModal() == wxID_CANCEL)
        return; // 사용자가 취소했을 때

    // 파일을 열고 텍스트 컨트롤에 내용을 로드합니다.
    textControl->LoadFile(openFileDialog.GetPath());
}

void MyFrame::OnSave(wxCommandEvent& event)
{
    wxFileDialog saveFileDialog(this, _("Save TXT file"), "", "",
        "TXT files (*.txt)|*.txt", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
    if (saveFileDialog.ShowModal() == wxID_CANCEL)
        return; // 사용자가 취소했을 때

    // 현재 텍스트 컨트롤의 내용을 파일에 저장합니다.
    textControl->SaveFile(saveFileDialog.GetPath());
}
Posted by JunkMam
,

 윈도우 창에서 하단에서 작은 창이 존재하면서 상태값이 표시되는 부분이 있는데.

 이것을 StatusBar라고한다.

 

 wxWidgets에서는 StatusBar를 추가하기 위해서 다음의 함수를 지원해준다.

 

CreateStatusBar();

 

 

 이렇게 하면, 다음과 같은 창이 띄워진다.

 

 

 

그리고, 이 상태 값을 글자로 표시하기 위해서는 다음의 함수를 지원한다.

 

    SetStatusText("");

 

 

 이걸 제대로 적용한 전체 소스이다.

 wxMain.h

#pragma once
#include "wx/wx.h"
#include <wx/filedlg.h>
#include <wx/textctrl.h>
#include <wx/splitter.h>

enum
{
    ID_QUIT,
};

enum {
    MY_EVENT_ID = 10001,
};

class MyApp : public wxApp
{
public:
    virtual bool OnInit();
};

class MyFrame : public wxFrame
{
public:
    MyFrame(const wxString& title);

    void OnQuit(wxCommandEvent& event);

private:
    wxTextCtrl* textControl;

    void OnOpen(wxCommandEvent& event);
    void OnSave(wxCommandEvent& event);
    void OnButtonClick(wxCommandEvent& event);
};

 

 

 wxMain.c

#include "wxMain.h"

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    MyFrame* frame = new MyFrame("Serial Graph");
    frame->Show(true);
    return true;
}

MyFrame::MyFrame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    wxMenu* menuFile = new wxMenu;
    menuFile->Append(wxID_OPEN, "&Open\tCtrl-O", "Open a file");
    menuFile->Append(wxID_SAVE, "&Save\tCtrl-S", "Save the file");
    menuFile->AppendSeparator();
    menuFile->Append(ID_QUIT, "E&xit\tAlt-X", "프로그램 종료");

    wxMenuBar* menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");

    SetMenuBar(menuBar);
    wxPanel* panel1 = new wxPanel(this, wxID_ANY);

    textControl = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);

    CreateStatusBar();
    SetStatusText("Ready");

    // 이벤트 핸들러 연결
    Bind(wxEVT_MENU, &MyFrame::OnQuit, this, ID_QUIT);
    Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN);
    Bind(wxEVT_MENU, &MyFrame::OnSave, this, wxID_SAVE);
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
    Close(true);
}

void MyFrame::OnOpen(wxCommandEvent& event)
{
    wxFileDialog openFileDialog(this, _("Open TXT file"), "", "",
        "TXT files (*.txt)|*.txt", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
    if (openFileDialog.ShowModal() == wxID_CANCEL)
        return; // 사용자가 취소했을 때

    // 파일을 열고 텍스트 컨트롤에 내용을 로드합니다.
    textControl->LoadFile(openFileDialog.GetPath());
}

void MyFrame::OnSave(wxCommandEvent& event)
{
    wxFileDialog saveFileDialog(this, _("Save TXT file"), "", "",
        "TXT files (*.txt)|*.txt", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
    if (saveFileDialog.ShowModal() == wxID_CANCEL)
        return; // 사용자가 취소했을 때

    // 현재 텍스트 컨트롤의 내용을 파일에 저장합니다.
    textControl->SaveFile(saveFileDialog.GetPath());
}

 

 상태바를 컨트롤하기 위해서 SetStatusText등을 사용하면, 상태값을 적용할 수 있다.

 

Posted by JunkMam
,

 

 wxWidgets에서 윈도우에 존재하는 패널에서 간단한 버튼을 넣을려고한다.

 

    wxButton* myButton = new wxButton(panel1, wxID_ANY, wxT("Click Me"), 
                                      wxPoint(10, 10), wxDefaultSize, 0);

 

 이렇게 하면, 간단한 버튼이 생성되고, panel1에 추가 된다.

 

 버튼을 눌렀을때는 button에 wxEVT_BUTTON이라는 이벤트가 발생한다.

 그래서, myButton에 Bind하여 이벤트를 인식하도록 한다.

 

    myButton->Bind(wxEVT_BUTTON, &MyFrame::OnQuit, this);

 

이렇게 하면, OnQuit 메소드를 호출하여 동작하고, 개별로 동작했으면 좋겠으면 다음과 같이 작성하면 된다.

    myButton->Bind(wxEVT_BUTTON, &MyFrame::OnButtonClick, this);

 

이렇게 하면, OnButtonClick이라는 함수에서 동작하게 된다.

 

OnButtonClick은 개발자가 임의로 제작하면 되기에 '선언'과 '정의'를 하면, 해당 버튼이 클릭이 되었을때, 메소드를 호출하게 된다.

void MyFrame::OnButtonClick(wxCommandEvent& event)
{
    // 버튼 클릭 시 수행할 작업
    wxMessageBox("버튼이 클릭되었습니다!", "알림", wxOK | wxICON_INFORMATION, this);
}

 

 이렇게 되면, 버튼을 클릭했을때, 이벤트를 처리하면서 알림창이 뜨게 된다.

 

 

Posted by JunkMam
,

 wxWidgets에서 글자를 표시하기 위해서는 wxStaticText라는 클래스를 조작할 수 있어야한다.

 wxStaticText를 추가하기 위해서는 다음과 같은 소스를 추가하면 된다.

    // 정적 텍스트 생성
    wxStaticText* labelText = new wxStaticText(panel1, wxID_ANY, "Text", wxPoint(20, 60), wxDefaultSize);

 

 

 이 labelText에서 값을 누르면, 값이 변경되길 원한다면, 버튼에서 사용했던 OnButtonClicked에서 다음과 같이 수정해주면 된다.

 

void MyFrame::OnButtonClick(wxCommandEvent& event)
{
    // 버튼 클릭 시 수행할 작업
    wxMessageBox("버튼이 클릭되었습니다!", "알림", wxOK | wxICON_INFORMATION, this);
    labelText->SetLabel("Test Text");
}

 

 

 여기서 중요한 점은 labelText가 전역변수여야한다.

 그래서, 전체 소스를 본다면

#include "wxMain.h"

wxIMPLEMENT_APP(MyApp);

// 정적 텍스트 생성
wxStaticText* labelText;
bool MyApp::OnInit()
{
    MyFrame* frame = new MyFrame("Serial Graph");
    frame->Show(true);
    return true;
}

MyFrame::MyFrame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    wxMenu* menuFile = new wxMenu;
    menuFile->Append(ID_QUIT, "E&xit\tAlt-X", "프로그램 종료");

    wxMenuBar* menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");

    SetMenuBar(menuBar);
    wxPanel* panel1 = new wxPanel(this, wxID_ANY);

    // 버튼 추가
    wxButton* myButton = new wxButton(panel1, wxID_ANY, wxT("Click Me"),
        wxPoint(10, 10), wxDefaultSize, 0);

    // 정적 텍스트 생성
    labelText = new wxStaticText(panel1, wxID_ANY, "Text", wxPoint(20, 60), wxDefaultSize);

    // 이벤트 핸들러 연결
    Bind(wxEVT_MENU, &MyFrame::OnQuit, this, ID_QUIT);
    myButton->Bind(wxEVT_BUTTON, &MyFrame::OnButtonClick, this);
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
    Close(true);
}

void MyFrame::OnButtonClick(wxCommandEvent& event)
{
    // 버튼 클릭 시 수행할 작업
    wxMessageBox("버튼이 클릭되었습니다!", "알림", wxOK | wxICON_INFORMATION, this);
    labelText->SetLabel("Test Text");
}

 

 이렇게 변경된다.

Posted by JunkMam
,

 

Visual Studio에서 wxWidgets을 적용하기 위해서 설정.

 

 wxWidget에서 Visual Studio를 적용하기 위해선 제대로 지원을 해주지 않기 때문에 빈 프로젝트를 만들어 줘야한다.

 

이렇게 빈 프로젝트를 생성해준다.

 

그 다음은 'Visual Studio와 wxWidgets 연동하기.'여기에 설명되어 있는 방식으로 wxWidgets을 설정 해줘야한다.

 

여기서 외부 종속성에서 wxWidgets에 관련된 경로가 찾아지는데 시간이 걸린다.

 

간단하게 윈도우를 출력하는걸 표현하기 위해서 wxMain.h을 만들고, 다음과 같이 작성해보자.

#pragma once
#include "wx/wx.h"

enum
{
    ID_QUIT,
};

enum {
    MY_EVENT_ID = 10001,
};

class MyApp : public wxApp
{
public:
    virtual bool OnInit();
};

class MyFrame : public wxFrame
{
public:
    MyFrame(const wxString& title);

    void OnQuit(wxCommandEvent& event);
private:
};

 

 간단한 wxMain.cpp 관련된 정의를 다음과 같이 구현한다.

#include "wxMain.h"

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    MyFrame* frame = new MyFrame("Serial Graph");
    frame->Show(true);
    return true;
}

MyFrame::MyFrame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title)
{
    wxMenu* menuFile = new wxMenu;
    menuFile->Append(ID_QUIT, "E&xit\tAlt-X", "프로그램 종료");

    wxMenuBar* menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");

    SetMenuBar(menuBar);

    wxSplitterWindow* splitter = new wxSplitterWindow(this);
    wxPanel* panel1 = new wxPanel(splitter, wxID_ANY);
    wxPanel* panel2 = new wxPanel(splitter, wxID_ANY);

    splitter->SplitVertically(panel1, panel2);

    // 이벤트 핸들러 연결
    Bind(wxEVT_MENU, &MyFrame::OnQuit, this, ID_QUIT);
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
    Close(true);
}

 

이렇게 하면, 다음과 같은 창이 띄워진다.

 

 

 

Posted by JunkMam
,

 wxWidgets에서 GUI 어플리케이션을 개발할때, 메뉴를 추가하는건 다음을 필요로한다.

 

 1. 메뉴바 생성.

    wxMenuBar* menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");

 

 wxWidgets에서 지원해주는 클래스로 wxMenuBar라는 클래스가 있다. 이 클래스는 윈도우 상단에 위치하는 메뉴바를 나타내는 것으로 여기서 메뉴의 항목이라는 부분이 있게 된다.

 

 윈도우의 'F'를 단축키를 가지는 'File'이라는 메뉴를 추가 할 수 있게 된다.

 여기서 하위 메뉴를 추가하고자한다면, 다음과 같은 작업을 하면된다.

    wxMenu* menuFile = new wxMenu;
    menuFile->Append(ID_QUIT, "E&xit\tAlt-X", "프로그램 종료");

 

이것을 메뉴를 추가를 이상없이 적용하고 위해선 다음과 같이 한다.

    SetMenuBar(menuBar);

 

 이렇게 하면, 윈도우에 적용하게 된다.

 

 각 메뉴에 대해서 이벤트를 처리하는 방법은 다음과 같다.

 

    // 이벤트 핸들러 연결
    Bind(wxEVT_MENU, &MyFrame::OnQuit, this, ID_QUIT);

 

 wxEVT_MENU라는 것은 MENU에 대한 이벤트를 적용하는 것이 있다.

 MyFrame::OnQuit라는 클래스의 메소드를 바로 연결해서 이벤트 처리하는 기능을 넣을 수 있다.

Posted by JunkMam
,

기본적으로 wxWidgets에선 minGW나 Cygwin을 연동해서 사용하는 것들이 대부분이였다.

하지만, Windows에서 제대로 컴파일이 안되거나 적용이 안되는 문제점이 있는 부분이 있어서 수정하기 위해 연동하는 방법을 기록하도록 한다.

 

VS(Visual Studio)와 wxWidgets과정은 다음과 같다.

1. VS 설치

2. wxWidgets 소스 설치

 

여기서 VS 설치는 간단하게 MS 사이트에서 제공해주는 프로그램을 다운받아서 설치하면 된다.

https://visualstudio.microsoft.com/ko/downloads/

이미지 썸네일 삭제
Visual Studio Tools 다운로드 - Windows, Mac, Linux용 무료 설치

Visual Studio IDE 또는 VS Code를 무료로 다운로드하세요. Windows 또는 Mac에서 Visual Studio Professional 또는 Enterprise Edition을 사용해 보세요.

visualstudio.microsoft.com

이 사이트에 들어가면, 다음과 같은 페이지로 넘어가게 되는데.

여기서, 커뮤니티 혹은 Professional을 다운 받으면된다.

여기서 커뮤니티를 사용하면, 로그인으로 계속 갱신하면서 30일 평가판을 계속 쓸 수 있기 때문에

커뮤니티를 다운받는걸 추천한다.

대표사진 삭제

사진 설명을 입력하세요.

여기서 VS와 연동해야되는 이유는 MS 컴파일러를 사용해야되는 경우가 있어서(라이브러리가 MS 컴파일러만 지원해준다거나 하는 문제점이 있다면, 그걸 못 쓰는 경우도 있다.) MS 컴파일러를 지원 가능하다면, VS를 굳이 쓸 필요가 없다.

 

wxWidgets는 다음과 같은 사이트에 들어가면, 간단하게 다운 받을 수 있다.

여기서 wxWidgets는 기본적으로 MinGW 기준으로 작성되어 있는게 많기 때문에 소스를 다운 받는게 좋다.

https://www.wxwidgets.org/downloads/

Downloads - wxWidgets

Downloads Not using C++? Get wxWidgets from the wxPython , wxPerl , or wxHaskell download sites. When installing wxWidgets on Windows or macOS, we always recommend building the library from source yourself, and only provide the source package for most platforms. On some platforms, we have provided a...

www.wxwidgets.org

 

wxWidgets에서 Source Code에서 Window Zip이나 WIndow 7z을 다운받은 후에 압축을 풀어준다.

 

VS 설치 완료하고, wxWidgets의 source code를 다운 받았다면, 다음과 같은 과정을 거친다.

 

VS을 킨 후에 도구 > 명령툴 > 개발자 PowerShell 을 클릭해서 Powershell을 킨다.

 

다음과 같은 명령어를 작성한다.

cd <wxWidgets's Path>\wxWidgets-3.2.4\build\msw

nmake /f makefile.vc BUILD=release SHARED=1 TARGET_CPU=X86
 

 

여기서 nmake가 MS에서 지원해주는 Make 프로그램이다.

 

 

이걸 완료되면,

wxWidgets에 압축을 푼 곳에서 lib 파일에 vs_dll(SHARED=1)이나 vs_lib(SHARED=0)의 폴더가 발생하고, 필요한 라이브러리들이 완성된다.

여기서 BUILD는 release와 debug로 나뉘어지고, 컴파일할때, 사용되는 라이브러리를 말한다.

디버깅을 제대로 사용할려면, debug을 사용하는게 가장 좋다.

SHARED는 1과 0으로 TRUE와 FALSE로 나뉜다.

TRUE가 되면, 동적 라이브러리인 DLL형식으로 빌딩이 되는것이고, FALSE가 되면, 정적 라이브러리인 LIB형태로 빌딩이 된다.

TARGET_CPU는 사용되는 컴파일러에 따라서 달라지는데.

내가 잘못 설정했는진 모르겠지만, x86(32bit)만 컴파일이 제대로 되서, 이렇게 사용한다.

 

빌딩이 잘 되었다면, VS에서 프로젝트 아무거나 적용한 후에

속성을 들어가면, 속성 페이지에서 변경된다.

VS++ 디렉토리에서 '포함 디렉터리'에서 수정하는데.

'$(wxWidgets)\include\msvc;$(wxWidgets)\include'을 추가하면, MSVC에 header 파일과 included될 wxWidgets의 라이브러리를 호출이 가능하다.

여기서 중요한건 $(wxWIdgets)을 설정해야되는데.

wxWidgets을 설정하는건 '내 컴퓨터' '내 PC'에서 오른쪽 버튼을 눌러서 속성에 들어가. '고급 시스템 설정'에 들어간다.

 

 

이렇게 wxWidgets라는 변수에 wxWidgets를 설치한 경로를 설정하면, 문제 없이 처리하게 된다.

Posted by JunkMam
,