[C++] 231 wxWidgets : 外部サイトへのハイパーリンク

[M1 Mac, Big Sur 11.7.2, clang 13.0.0, wxWidgets 3.2.0, NO IDE]

ちょうどいいサンプルをGitHubに見つけ、早速活用させていただきました。見にくいですが青字部分がリンクになっています。

wxWidgetsに対する興味が増してきたので自分のFLTKアプリを移植しようか考えたものの、wxButtonの色設定ができないのであきらめました。OSのLook&Feelに依存している分、自由度は低いようです。

となるとFLTKにHyperLink機能実装となりますが、Fl_Widgetよりさらに上の概念を構築する必要がありハードルはかなり高そうです。

#include <wx/debug.h>
#include <wx/app.h>
#include <wx/frame.h>
#include <wx/hyperlink.h>
#include <wx/panel.h>
#include <wx/sizer.h>
#include <wx/stattext.h>

namespace Examples {
  class Frame : public wxFrame {
  public:
    Frame() : wxFrame(nullptr, wxID_ANY, "HyperlinkCtrl example") {
      panel->SetSizer(boxSizerLinks);
      boxSizerLinks->Add(staticText1, 0, wxSTRETCH_NOT, 0);
      boxSizerLinks->Add(hyperlinkCtrl1, 0, wxSTRETCH_NOT, 0);
      boxSizerLinks->Add(staticText2, 0, wxSTRETCH_NOT, 0);
      boxSizerLinks->Add(hyperlinkCtrl2, 0, wxSTRETCH_NOT, 0);
    }
    
  private:
    wxPanel* panel = new wxPanel(this);
    wxBoxSizer* boxSizerLinks = new wxBoxSizer(wxVERTICAL);
    wxStaticText* staticText1 = new wxStaticText(panel, wxID_ANY, " Googleへのリンク");
    wxHyperlinkCtrl* hyperlinkCtrl1 = new wxHyperlinkCtrl(panel, wxID_ANY, "Google", "https://www.google.com/");
    wxStaticText* staticText2 = new wxStaticText(panel, wxID_ANY, " Yahoo!へのリンク");
    wxHyperlinkCtrl* hyperlinkCtrl2 = new wxHyperlinkCtrl(panel, wxID_ANY, "Yahoo!", "https://www.yahoo.co.jp/");
  };

  class Application : public wxApp {
    bool OnInit() override {
      (new Frame())->Show();
      return true;
    }
  };
}

wxIMPLEMENT_APP(Examples::Application);

参考サイト

[C++] 230 ウィジェットツールキットwxWidgetsを試す Makefile

[M1 Mac, Big Sur 11.7.2, clang 13.0.0, wxWidgets 3.2.0, NO IDE]

FLTKにはハイパーリンク機能がないことが判明したため、wxWidgetsからの機能移植を模索しています。

wxWidgets導入自体は今年8月に済ませていたので、参考サイトから簡単なコードを拝借してMakefileを自作しビルドしてみました。

GitHubのソースからビルドしたwxWidgetsが不完全であることが分かり、Homebrew版に切り替えました。ただHomebrew版はdylibしかなく、静的ライブラリは別途ビルドする必要があるようです。

マクロが多くて初心者泣かせのサンプルコードでしたが、まあそのうち慣れるでしょう。

FLTKに比べてかなり多機能なのにこれもまたクセが強すぎるためか、ユーザー数はさほど多くないようです。

# コンパイラ
COMPILER = clang++
DEBUG = -g

# フラグ
CPPFLAGS = $(shell wx-config --inplace --cxxflags) -std=c++17
LDFLAGS = $(shell wx-config --inplace  --libs) -lc++

# includeパス(-I)
INCLUDE = -I./include -I/Volumes/DATA_m1/code/cpp/mylib/include \
-I/opt/homebrew/Cellar/wxwidgets/3.2.0_1/include/wx-3.2

# ライブラリ(-l)
LIBRARY0 =

# ライブラリパス(-L)
LIBRARY = -L/opt/homebrew/Cellar/wxwidgets/3.2.0_1/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = test

# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY0) $(LDFLAGS) $(LIBRARY)
	cp $(TARGETDIR)/$(TARGET) $(TARGET)
	rm -f $(TARGET)

# 全ソース強制コンパイル
.PHONY:all
all: clean $(TARGET)

# 全ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET)

参考サイト