カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2016年09月06日(火)

ミルノ PC フォトフレーム 2.0 実装中、ショートカットキー (キーボードアクセラレーター) の実装を開始

写真閲覧ソフトのミルノ PC フォトフレーム
は、c# というプログラミング言語で実装したのですが、
現在、c++ で書きなおす作業を、コツコツやってます。

写真をミルノに!

試してね♪

昨日から、ショートカットキー (キーボードアクセラレーター)
の実装を開始したのですが、道なかばです。

ショートカットキーってのは、
Ctrl キーを押しながら C を押すと
コピーになるってなヤツです。

単に決めうちのショートカットキーを実装するだけなら、
リソースエディターでちょこちょこと入力すれば、
ほとんど、プログラムを書くまでもなくできあがるのですが、
2.0 から要望の多かったキーカスタマイズ機能、
すなわち、キーボードショートカットを自由に編集する
機能を入れるつもりなので、かなり大変ですわ。

今できたのでは、データー構造とその保存、読み込み、
Windows API 呼び出しによる、
標準的なデーター構造への変換機能です。

うち最後の 2 行は、ACCEL 構造体の配列に
必要なデーターをコピーしてから、
CreateAcceleratorTable
を呼ぶだけなんで簡単です。

変換できてるんで、実行もできてます。

データー構造も、ACCEL 構造体に必要なメンバーを追加して、
1 次元のコレクションにすればいいだけなので簡単ですね。

ちなみに自分は、1次元のコレクションを定義する場合は、
ほとんど std::vector<boost::shared_ptr<CAccel> >
ってな感じのスマートポインターの vector 型を使います。

アクセスもそこそこ速いだろうし、挿入、削除も
それほど遅くないし比較的万能な型だからです。

ちなみに、初心者は、何も考えずに vector 型を
使う傾向がありますが、あながち間違いじゃないです。

普通のプログラムでは、挿入や削除よりも、
値の参照が頻繁に行われる傾向があるためです。

vector は最もシンプルな型なので、
値の参照は、最も速いといえます。

当然、私のよく使う、スマートポインターの
vector よりも速いので、アクセススピードが
問題になる場合には、普通に vector を使います。

で、ちょっと勉強すると、何かしらんけど、
list 最高。みたいな、list 信者が表れます(笑)。

list はもちろん、要素の削除や挿入が
圧倒的に速いですが、ランダムアクセスが遅いし、
メモリー効率も悪いし、案外、最適な場面は少ないです。

なんで、あまりよく調べもせずに、
初心者に list を進めるのはダメですよ。

何か話が脱線したけど、1.x では
キーボードカスタマイズ機能はありません。

なので、カスタマイズ機能が欲しい人は、
2.0 の登場を気長にお待ちくださいね。

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

ご意見・ご要望はこちらからどうぞ
You can contact me by this mail form.

・・・

あぁ、そういえば、vector の素晴らしさを書くつもりじゃなかったわ。

話を元に戻して、最も大変だったのは、
キーボードアクセラレーターのデーター構造を
ファイルに保存、復元するところです。

発行するコマンド ID (アプリケーション定義の 16 ビット非負数値)
を数字のままファイルに書き込んじゃうと、
コマンド ID を変更できなくなって
プログラムが書きづらくなっちゃうんで、
意味のある文字列に変換して保存、復元した方がよさそうです。

最初に考えられるのは、コマンドID に対応する文字列リソース
を使う方法ですが、これは、メニュー選択中にステータスバー
に表示される文字列用になるのが普通なので、あまりよくありません。

コマンドID に何かの数値を足して、その文字列リソース
を使用する手もありますが、リソース ID を浪費するので嫌です。

カスタムリソースタイプを定義して、
そこから読み込む手もありますが
面倒そうなので、やりませんでした。

最後に思いついたのは、メニューリソース
から生成する方法です。例えばこの方法を
使うと、メインメニューのメニュー項目の
文字列を ID として使用することができます。

ただ、普通にメインメニューとかを流用しちゃうと、
リソースの参照言語が、変わると、ID も変わってきちゃいます。

例えば、日本語の言語設定でミルノを終了した後、
OS の設定を英語に変えてから起動すると、
キーボードショートカットの設定が読めなくなってしまいます。

そんなわけで、最終的には、メインメニューの
リソースをコピーしてから、文字列を変更して、
ID 専用のメニューリソースを用意することにしました。

ちなみに、メニュー項目が増えたときに
作り直すのが簡単なように、正規表現で
文字列を置換すれば、簡単に再定義できるようにしました。

そのときに使用する emacs の命令が↓です。

(defun make-id-from-menuitem ()
  "replace MENUITEM definitions to id table"
	(interactive)
  (query-replace-regexp "¥¥([ ¥t]*¥¥)MENUITEM[ ¥t]*¥"[^¥"]*¥"[ ¥t]*,[ ¥t]*ID_¥¥([^ ¥t¥n]+¥¥)" "¥¥1MENUITEM ¥"¥¥2¥", ID_¥¥2"))

↓みたいなのが、

MENUITEM "前のフォルダー、書庫を開く", ID_OPEN_PREV

↓のように置換されます。

MENUITEM "OPEN_PREV", ID_OPEN_PREV

ま、気に入ったら使ってみてくだい。ではでは〜。

あ、そういえば、今日はタイ戦か。
流石に今日は、勝つしかないな。頑張れ!

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


コメント
コメントする