[C++] 23 FLTK : Fl_Inputのカーソルずれ対策

Fl_Input内のテキストを編集しようとした際にカーソルにずれがあることが発覚しました。このずれた位置からでないと正確に編集できません。

Mac版ExcelのVisual Basic Editorでも似たような現象があり、VBAからPythonに移行するきっかけとなりました。

今回も私にとっては一発レッド案件でしたが、フォントをデフォルトのFL_HELVETICAから日本語フォントに変更することで解消しました。

// main関数で設定

Fl::set_font(FL_HELVETICA, "Osaka");
修正前
修正後

[C++] 22 split関数の自製

C++にはsplit関数というものがないのでネット情報から拝借しました。他にも色々方法があります。

下記コードではsplit関数でファイル名の拡張子を取り出し、checkImage関数によりpngであれば1、jpgであれば2、それら以外は-1を返します。

C++11から採用のregex_search関数で大文字・小文字に関係なく検索しています。

C/C++は型変換が面倒ですね。C/C++を常用していれば慣れるのでしょうが、たまに使う程度だと都度調べることになるので疲れます。一覧表を用意したいところです。

#include "process_image.h"
#include <string>
#include <vector>
#include <regex>

// split関数
std::vector<std::string> split(std::string str, char del) {
    int first = 0;
    int last = str.find_first_of(del);
 
    std::vector<std::string> result;
 
    while (first < str.size()) {
        std::string subStr(str, first, last - first);
 
        result.push_back(subStr);
 
        first = last + 1;
        last = str.find_first_of(del, first);
 
        if (last == std::string::npos) {
            last = str.size();
        }
    }
	return result;
}

int checkImage(const char* filename){
	std::string filename_str = std::string(filename);
    char del = '.';
	
	std::vector<std::string> list = split(filename_str, del);
	std::string extension = list.back();

	std::regex png("png", std::regex_constants::icase);
	std::regex jpg("jpg", std::regex_constants::icase);
    std::smatch m;

	if (std::regex_search(extension, m, png)){
		return 1;
	} else if (std::regex_search(extension, m, jpg)){
		return 2;
	} else {
		return -1;
	}
}

参考サイト