クイックスマイリー2 (クイックスマイリー Version 2)の内部主要データ構造
クイックスマイリー2の内部データ管理は配列では管理せず,以下の構造で
文字を管理しています.そのため,メモリー及び項目識別IDが尽きるまで
いくつでも追加を行うことができます.
また,この構造を採用しているため,挿入・移動・削除に(配列などと比べて)時間がかかりません.(移動は階層構造が移動するだけで,データまで移動しない)
: データ構造の結合.
: データ参照.(ポインタによる参照)
※実際には,クリップボード履歴の項目は,通常データ管理の中に1データを指し,そのデータの種類がクリップボード履歴
だと,クリップボード履歴の方へ参照する,といった形になっています
言語はC++ですが,classではなく structを使用しています.デフォルトでpublicになるから
使用しているだけです.classで最初にpublic:をつけてもよいのですが・・・
オブジェクト指向というよりは,手続き型とオブジェクト指向の良いとこ取りの
ための工夫です(他の関数で再起呼び出しの関数を使うので,こちらの形のほうが良い)
階層構造とデータの分離について..
階層構造内部にデータを持たせない理由は,データ1つに対して,複数の階層構造からの参照を可能にするためである.
そうすることの利点は,編集などで部分的に階層を切り出して,移動させ,別の階層の下に貼り付けるなどの操作が
容易になるからである.(データの移動量も少なく,処理を早く行える利点もある)また,
クリップボード履歴を複数の個所で参照させるという,ほかでは見られない変な
機能も実現のために複雑になったり,重複データを持ったりする必要はない.そして,ショートカットキーをすべての
項目に1つづつもたせることができるが,これを有効,無効などをする時も,線形リスト構造ならば,
わざわざ階層をさまよいながら,すべてのデータを探す必要もない.つまり,階層構造と,線形リスト構造の良いとこを
うまく組み合わせた形となっている.
なお,データ構造管理にはSTLを使っています.STLは本当に便利ですばらしい.これは習得する価値がある.
なお,旧クイックスマイリー(version 1.xx)は,線形list構造を自作していた.最適な形にはなっていたものの
汎用性に乏しかった
ツリー構造に使用している 実際の1データのデータ管理の構造体.クイックスマイリーのメニュー階層構造を
支えている最も重要な構造体.ファイルとの読み書きは,外部関数ですが・・・.これ以外にも項目の移動はまた
別の外部関数を用いています.Win32のTreeコントロールは相互,メニューへは出力のみの変換を装備していて
このメンバー関数1つ呼ぶだけで,Tree構造に割り当てたり,Tree構造から取得したり,さらに階層構造のメニューを
生成したりできる.
struct Items
{
AData* pData; // このTreeの項目が指す1データ(ほかの所でリスト構造で管理している部分への参照のみ)
deque<Items> child; // 自分の下に所属するアイテム一覧
// 可変長の配列 リスト構造(list)が望ましいが,コンパイルエラーがでる.(回避する方法があるのだろうな...)
// vectorを使うぐらいならdequeの方がメモリ効率が良い.
Items() : pData(NULL){}
void ReleaseBuf();
void CreateOneData(const string& text, const string& data_p, /*BYTE bVKCode, BYTE bfMods*/WORD wVK, BYTE mode, BYTE bExtKey); // ※all_datasに追加していないデータ
HTREEITEM SetToTree(HTREEITEM hParent = NULL, HTREEITEM hIAfter = TVI_LAST); // 編集ツリーにせってい(再起呼び出し関数と,言っても,childのメンバーを呼ぶだけだけど...)
void SetFromTree(HTREEITEM hParent = NULL); // 編集ツリーから設定(再起呼び出し関数と,言っても,childのメンバーを呼ぶだけだけど...)
HMENU SetToMenu(HMENU hParent = NULL); // メニューを生成 hParent をNULLにすると トップメニューを作ります(再起呼び出し関数と,言っても,childのメンバーを呼ぶだけだけど...)
void FoceReleaseDatas(); // 参照しているデータを消去(編集中に削除時,呼び出す(再起呼び出し関数と,言っても,childのメンバーを呼ぶだけだけど...))
};
通常データ管理及び,クリップボード履歴データ管理に使用している1データを管理する構造体
すべて他の場所にリスト構造で管理している.
2つのリストを持っている.通常用と,クリップボード履歴用.どちらのリストも1データはこれ1つづつ.
struct AData
{
string text; // 表示文字
string data; // 内部データ
WORD wVK; // ショートカットキー設定
BYTE mode; // 項目用途
BYTE bExtKey; // ショートカットキー設定(Windowsキーの組み合わせ)
int image_index; // イメージリストの中の使うアイコンのナンバー
WORD id; // この データに関連付けされた 識別 id
AData(WORD ini_id = 0xffff);
~AData();
void RegHotKey(); // ショートカットキー作動開始
void UnRegHotKey(); // ショートカットキー作動停止
int GetIconIndex(bool bHasChild = false, bool bNoUpdate = false);
// アイコンイメージをロード(ロード済みならその) イメージリストの中の使うアイコンのナンバーを返す
};
実は,まだまだ,いろいろなことが書かれていませんねぇ(^^;
クイックスマイリーは,標準C++とWin32APIを直接呼び出しで作成されていて,Win32APIまで,標準C++STLまでの
すべてのコードを自分で書き,もっとも効率の良い書き方をしているために,高性能であるにもかかわらず
サイズが小さい.
外部DLLなしで,マウスの位置をいかに取得しているか?・・・ひ・み・つ(笑)
タスクトレイアイコンからの右クリックで,貼り付けまでたどり着けるには?・・・ひとひねり(^^;
メニューの識別IDはどのように管理されているか?・・・ヒント:IDは再利用していますよ〜
アイコン付きメニューは標準ではないはず・・・実はオーナードローでかかれている.(そのままですね(^^;)
日付時刻が,メニュー表示時に変わるのは相当めんどくさいはず・・・オーナードローだから,実は簡単(^^;
高機能で,たくさんのことができるのに,シンプル&簡単.(これは,アイデアを使うしか突破不能(^^;)
旧バージョンとのデータの互換性がない...階層構造の採用に対して,旧式を引き継ぎにはかなり悩んだが,新型は拡張可能にすることを決断したために互換性をあきらめた
顔文字のクイックスマイリー,しかし popKmart顔文字集を標準で使っているのは?・・・管理者popさんと,昔チャットで知り合ったから(^^
顔文字を入力すためだったソフトが,ここまで進化した理由とは・・・ユーザー様からのリクエストが多かったからです.(^^.特に完全な階層構造は,多くの人の悲願でした.
登録可能個数が桁外れだが,本当にそこまで登録できるのか?・・・あくまでも理論値です...どちらかというと,Win32APIのコントロールや,メモリの方,Win9x系ではシステムリソースが尽きるはずです.
アルゴリズム的には,上の図のや,コード・説明を見れば(分かる人なら^^;)分かると思うのですが,無制限となっています.が,Win32とい
プラットフォーム固有の事情(メニューの項目を識別するIDが16bitにつき,65536種類しか識別不能)により,無理やり制限をつけているといった感じです.
qs2.iniの基本設定ファイルの編集の仕方
内部は通常のWindowsのINIファイル形式です.
[Font] -- フォント設定のセクション フォント設定でほぼできます.実は私も良く知りません(^^;
; Windowsの LOGFONT構造体と同じです.
Height=-12
Width=0
Escapement=0
Orientation=0
Weight=400 -- 400で普通の太さ,700で太文字になります.(こんな感じ)
Italic=0 -- ここを1にすると 斜自体.(こんな感じ)
Underline=0 -- ここを1にすると アンダーライン.(こんな感じ)
StrikeOut=0 -- ここを1にすると 文字消し.こんな感じ
CharSet=128
OutPrecision=3
Quality=1
PitchAndFamily=50
FaceName=MS UI Gothic -- 使うことを推奨するフォント名.この名前のフォントが見つからないと,上の設定より似ているフォントを探します
[Clip] クリップボード履歴に関する設定です
counts=20 -- 保持個数です.
ret_counts=-1 -- 表示形式を何回で折り返すかの設定です.-1で 通常になります.
ダイレクト編集をするためのマニュアル
qs2_text.ini 及び org_text.ini データファイルフォーマットについて
qs2_text.iniは現在のツリー構造を保存しています.org_text.iniは,qs2_text.iniが無い時,代わりに読み込みます.
実際に,設定を行い更新をして確認すると 分かると思います
qs2_text.iniを編集し終わったら,設定のメニューの「その他」から「メニューのダイレクト編集完了」を
選択するか,設定画面をキャンセルで閉じると,設定ファイルを再読み込みします
仕様:
1行1項目形式.ただし { と } の行はサブ階層の始まりと終わりをあらわす.{ の直前の行が,フォルダの項目となる.ただし,1行目の次に { をつけてはならない.(動作の保証をしない)
1行目は,特別で,ルート項目をあらわす.項目用途と文字と内容が無視される.
空行はあっても良い
1行のデータの形式
行の先頭のタブは何個あってもすべて無視される.
行の詳細データはタブで区切られる.データ区切りのタブは必ず1文字で無ければならない.2つ以上続くと,タブの間を空のデータとして認識される(ただし,エクセルで編集すると,−や,=で始まる文字は,壊れます(涙))
タブ区切りで後ろのデータは,省略可能である.途中で切れても動作の保証をする. 最悪,項目用途だけ記述することも可能である.(何もなければ空行とみなす)
つまり,拡張が容易な仕様となっている.
データ内の文字では,タブは\t,改行は\r\n, \は \\ となっている.
数値データは10進数です.
数字データのところに数字以外を設定すれば,数値0と,みなされる.なお数値0は基本的に安全です.
1データ目:項目用途を表す.項目用途の選択と同じで,一番上が 0 となっている.具体的には次のとおり
・・・ 0 : 表示と同じ文字入力
・・・ 1 : 表示と別の文字を入力
・・・ 2 : プログラム実行・URLを開く
・・・ 3 : 項目区切り(横線)
・・・ 4 : 項目区切り(縦線)
・・・ 5 : この設定画面表示
・・・ 6 : ------------
・・・ 7 : クリップボード・最近使用した履歴
・・・ 8 : 日付・時刻入力拡張
・・・ 9 : クリップボード履歴編集
・・・10 : プログラムを終了
・・・11以上は,上位バージョンのために予約.指定した場合の動作の保証はしない
2データ目:メニューに表示する文字そのもの
3データ目:コメントや,内容,実行する文字など.
4データ目:項目ごとのショートカットキーの設定.数値です.0なら,何も設定されていません.下位8ビットに仮想キーコード,上位8ビットにシフト等の状態が入っています(詳細は非公開とさせていただきますが,暗号化などを行っていないので解析すれば分かると思います.).データを直接設定は行わないほうが良いでしょう.どうしても行いたい場合は,ここにキーのキャラクターコード,そしてシフト等の状態は次の5データ目で設定すると良いでしょう.
5データ目:シフトキー等のフラグ及び,項目が開いているかどうか等.数値.次の値を合計して設定する
・・・ +1: ショートカットキー割り当てに+Windowsキーを使うチェックをON
・・・ +2: ショートカットキー割り当てに+Shiftキーを使う (設定画面で保存すると,ここには設定しない.4データ目に入る)
・・・ +4: ショートカットキー割り当てに+Ctrlキーを使う(設定画面で保存すると,ここには設定しない.4データ目に入る)
・・・ +8: ショートカットキー割り当てに+Altキーを使う(設定画面で保存すると,ここには設定しない.4データ目に入る)
・・・ +16: 設定画面この項目がフォルダ時,このフォルダが開いている状態を表す(+16だと開く,足さないと閉じる).
・・・ それ以外は,上位バージョンのために予約.指定した場合の動作の保証はしない
6データ目:項目ごとのマウスカーソルの位置
・・・ 0 :なし
・・・ 1 :画面左上隅
・・・ 2 :画面左下隅
・・・ 3 :画面右上隅
・・・ 4 :画面右下隅
・・・ 5以上は上位バージョンのために予約.指定した場合の動作の保証はしない
7データ目以降は上位バージョンのために予約.現在のバージョンでは無視.設定しないでください.
設定画面で保存すると,階層が深くなるほ行の先頭にどタブを付け足します.(自動でインデントをつける)
簡単・シンプル・強力・フルカスタマイズ・そして最強ではなく 究極を目指す.
開発コードネーム「クイックスマイリー2」.
Programed by Sato-Si.(1998-2001) mail@sato-si.com
クイックスマイリー ご使用 ありがとうございます m(_ _)m