[C++] 141 FLTK : 線の描画 Lineクラスの引数追加

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

[C++] 139の続きです。

前の記事では線の座標と長さを引数で設定しましたが、色や線種・太さを追加しました。

x()関数をヒントにrgb()関数とstyle()関数を作成し、これらの戻り値で設定値を取得できるようにしました。

引数が多いとコードを見てもどの引数が何を設定しているのか分かりにくいので、後ろ5つは省略可能にしました。デフォルトは太さ1の黒い実線になります。

右の縦線はデフォルト設定の黒い実線
#include <FLstd.h>
#include <cppstd.h>
#include <Line.h>

Line::Line(int x,int y, int w,int h, int r, int g, int b, int styletype, int stylewidth):Fl_Widget(x,y,w,h){
	r_ = r, g_ = g, b_ = b;
	styletype_ = styletype, stylewidth_ = stylewidth;
}
Line::~Line(){}
void Line::draw(){
	vector<int> rgb1 = rgb();
	fl_color(fl_rgb_color(rgb1[0], rgb1[1], rgb1[2]));

	vector<int> style1 = style();
	fl_line_style(style1[0],style1[1]);

	int x1 = x(), y1 = y();
	int x2 = x()+ w(), y2 = y()+ h();
	fl_line(x1,y1,x2,y2);
}
#pragma once
#include <FLstd.h>
#include <cppstd.h>

class Line: public Fl_Widget
{
	int r_, g_, b_;
	int styletype_, stylewidth_;
public:
	Line(int x,int y, int w,int h, int r = 0, int g = 0, int b = 0, int styletype = 0, int stylewidth = 1);
	~Line();
	void draw();
	vector<int> rgb() const {return {r_,g_,b_};}
	vector<int> style() const {return {styletype_, stylewidth_};}
};
#include "Line.h"

Line *line1 = new Line(40,171,309,0,211,207,217,0,1);
Line *line2 = new Line(349,10,0,195); // デフォルトの黒い実線
Line *line3 = new Line(278,131,71,0,211,207,217,0,1);
Line *line4 = new Line(278,131,0,41,211,207,217,0,1);

[C++] 140 ウィジェットツールキットwxWidgetsの導入

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

最近FLTKの独特な仕様に振り回されることが多くなってきたので、他のウィジェットツールキットも試してみます。

前からチェックしていたwxWidgetsを導入してみました。インストールだけならHomebrewでできます。最新の3.2.0をインストールしました。

brew install wxwidgets

ソースコードやサンプル、デモを確認したい場合はGitHubからダウンロードしてビルドします。3.2.0はなぜかpngフォルダが空なので3.1.7をダウンロードしました。

コマンドは以下の通りです。

# 本体のビルド
mkdir build-cocoa-debug
cd build-cocoa-debug

../configure --with-opengl --disable-shared --enable-monolithic \
--with-libjpeg --with-libtiff=builtin --with-libpng --with-zlib \
--with-mac --disable-sdltest --enable-unicode --enable-display \
--enable-propgrid --disable-webview --prefix=/Users/[ユーザ名]/Dev/wxWidgets-staticlib \
CXXFLAGS="-std=c++0x" --with-libiconv=/usr

make

# サンプルとデモのビルド
cd samples; make;cd ..
cd demos;   make;cd ..

wxWidgetsはOSのLook&Feelを採用しており、macOSの場合はCocoa風になります。

[C++] 139 FLTK : 線の描画 fl_line

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

4月に書いた[C++] 48の記事以降、その内容が最善な方法ではないと自覚していて、ずっともやもやしていたのですが、ようやくシンプルに線を描けるようになりました。

Fl_Widgetを継承したLineクラスのdraw()関数内でx()関数、y()関数、w()関数、h()関数を使うことで解決しました。

x()ではなくgetx()だったら瞬時に意味を理解していたと思いますが、引数の有無でgetとsetを使い分けるのがFLTKの仕様ですから慣れるしかないです。

FLTKはいいツールだというのに、こういった癖の強いところでC++ユーザーに受け入れられないのではと思います。せめてLineクラスは標準Widgetとして用意しておくべきでしょう。

GUI内に4本の線を描画
#include <Line.h>

Line::Line(int x,int y, int w,int h):Fl_Widget(x,y,w,h){
}
Line::~Line(){}
void Line::draw(){
	fl_color(fl_rgb_color(211,207,217));
	fl_line_style(0,1);
	int x1 = x(), y1 = y();
	int x2 = x()+ w(), y2 = y()+ h();
	fl_line(x1,y1,x2,y2);
}
#pragma once
#include <FLstd.h> // 自製
#include <cppstd.h> // 自製

class Line: public Fl_Widget
{
public:
	Line(int x,int y, int w, int h);
	~Line();
	void draw();
};
#include "Line.h"

Line *line1 = new Line(40,171,309,0);
Line *line2 = new Line(349,10,0,195);
Line *line3 = new Line(278,131,71,0);
Line *line4 = new Line(278,131,0,41);

参考サイト