クイックスマイリー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