う〜ん,まだまだお膳立てが終わらないのだ。実装の検討に入る前に、幾つかクリアしとかなければならない問題がある…事に気付いた。以前も書いた様に、ここに書いている文章は、おいらの個人的な覚え書きとして、書いている部分が多いので、今回は特につまらないと思うが悪しからず。
- 問題点と状況整理
- 初期化中,通常使用時の関数,クラスの利用
前回定義した、INITCASE1,2,3及び通常時(CwccMain)と、今後の拡張も加味して、終了時(CwccExit()=WinMain終了直前)という状態を考慮し、CwccPrintf()を代表とする、現行までの関数(及びクラス)と、今回追加しようとしている関数の利用制限を掛けなければならない。即ち、メインコンソールが生成されていない時点で、CwccPrintf()を使ってもらっては困るのだ…。こんなもん,ユーザの判断にまかせれば…とは思ったが、バグの原因になる物件を、そのまま放置するのも納得行かなかったので、とりあえずの対策は入れる事にした。という訳で、次の様な表になる。
| INITCASE1 | INITCASE2 | INITCASE3 | CwccMain | CwccExit
| CwccPrintf等,従来の関数&クラス
| × | × | × | ○ | ×
|
void PresetUserDesignClass(CwccUserDesign *tmp) ;
| ○ | × | × | × | ×
| void CwccSetFont(char *FontFace,int FontHeight,BOOL BOLD) ;
| ○ | ○ | × | × | ×
| void CwccSetFont(char *FontFace,int FontHeight,
BOOL BOLD,long FFColor=0l) ;
| ○ | ○ | × | × | ×
| void CwccSetFont(LOGFONT *USERFONT) ;
| × | ○ | × | × | ×
| void CwccColors(COLORREF FFColor,COLORREF TextBk,HBRUSH BgColor) ;
| × | ○ | × | × | ×
| void CwccColors(COLORREF FFColor,COLORREF TextBk,COLORREF BgColorRef) ;
| × | ○ | × | × | ×
| void CwccColors(COLORREF FFColor,COLORREF TextBGRef) ;
| × | ○ | × | × | ×
| void UseCwccESCConsole(int widthx,int heighty) ;
| ○ | ○ | × | × | ×
| class CwccMouse
class CwccMouseControl void SetCwccUserMouse(CwccMouse *UserMus)
| × | ○ | ○ | ○ | ×
| void CwccClientSize(int widthpix,int heightpix) ;
| ○ | ○ | × | × | ×
|
尚、ファーストコールの初期化関数は、
void CALLBACK CwccUserInitialize(void) ;
としました。(CALLBACKの記述を忘れるとエラーします)INITCACE1については、原則、この中でコールとします。
基本的に、×の段階で使われた場合は、何もしない。て、まぁ、基本的には、状態状態でガードを掛けるのだが、問題は、従来の関数??確かに、それほど数が多くないので、難しくは無いが、いちいちガード掛けるのって面倒なのだ。それと…クラスの方だな。クラスは、インスタンス造られちゃうと、何もしないって訳にはいかないので、この辺の調整が必要になりそうだ。
- ESCシークエンス使用時のフォント
基本的には、FIXEDタイプ専用にしようと考えている。ただ、Arial等のフォントを指定された場合も、表示に保証無しという事で、良いだろうか?
- ESCシークエンス使用時のウインドウリサイズ
従来のCWCCコンソールは、ReSize可能なWindow本体にEDITを貼り付けた形で、ユーザ操作でのリサイズが可能になっているが、ESCシークエンス使用目的のウインドウでは、ReSizeされると、ちょっと困るので、固定にする方向で検討する。
- WindowClassEx,CreateWindowExの使用
実は、CWCCは、未だにCreateWindow()関数を使用している。現状のままで支障は無いが、Win32のアプリである以上、CreateWindowExを使った方が良いに決まっているので、今回が、良い機会なので、乗り換えてしまおうかと考えている。ついでに、EX_STYLEを、ユーザ指定出来る様な関数も、準備した方が良いか??
- メールBOXの改良
CwccMainと←→コンソール間でやりとりされているメッセージは、16384byte(16kBytes)がMAXになっている。勿論、諸々を考慮した上で、充分な容量だと考えているので、これが上限って事で問題は無いと思って居るのだが、実質、使われないのに、確保しておくのもどうか…?本来ならば、動的に確保した方が良いのでは…?という意見もあり、検討してみる事にしたが、結果としては、現状維持である。理由としては、vsprintfに、所用バイト数を返す関数がBC++では存在しない事(有るのか??おいらは知らない)と、容量が不足した場合、いちいちreallocするのが嫌だから…。まぁ、DOSのプログラムなら、16kbyteはでかいが、Windowsの32bitアプリならば、微々たるもの…(本当か???)なので、ご勘弁願おう,,
- 漢字使用時の問題
CWCCで漢字を表示させる場合、WindowsXp上では、非常に遅くなる問題が発生した。他の環境でも同じかも知れないが、おいらの評価環境の同程度のスペックのPCならば、Windows98上では、半角文字に比べて遜色無い,また、ESCシークエンスを搭載したEDITでも、こちらも遜色無く動作しているので、WM_CHARを送出する側の問題では無いと信じたい。恐らくは、漢字コードの変換とか?判定とかしてるのだと思われるが、ここについては、要調査とする。(根っこ深そうだなぁ…オーナドローにしちゃおうかなぁ??)
- 取り込み
さて、いよいよCWCCに手を入れる。今回は試作で色々試しているので、すんなり…までは行かないが、比較的スムーズに進められる。
- 初期化の仕組み導入
試作から構成はしっかり見えていたので、クラス名,インスタンス名等の少々の調整で、すんなりインプリメント出来た…。また,
void CALLBACK CwccUserInitialize(void) ;
は、CALLBACK関数とした。(…ぶっちゃけて言うと、使ってみたかっただけなのだが…)尚、初期化の進行状況を示すフラグ
int CwccUserInitPhase ;(←隠蔽,externしていじくらない様に!)
を設け、このフラグの状態によって、使用関数に制限を掛ける事にした。
- フォントと、色指定
フォント設定の取り込みは、ESCシークエンスを考慮して、取り込んだが、その課程で、幾つか、こんな関数も欲しいなというのが出てきたので、追加した。因みに、表示領域のサイズを変更する
void CwccClientSize(int widthpix,int heightpix) ;
関数についても追加した。
- マウス
CwccMouseとCwccMouseControlは、ESCシークエンスでの使用を考慮して造ったのだが、従来のコンソールでも利用出来るので、指定が有れば対応するものとした。基本的に、CwccMouseControlクラスはライブラリの中に隠蔽し、ユーザ拡張した、CwccMouseをセットする関数、
void SetCwccUserMouse(CwccMouse *UserMus) ;
を用意した。上の表が荒れているのは、この辺の紆余曲折が有ったからである。尚、INITCASE1での使用を×とした理由は、この時点で、_CwccMouseControl_クラス(隠蔽されている)のインスタンスの有無が不安定な為、確実に存在する時点での設定を旨としての施策である。
- エスケープシークエンス
今回の最後の難関は、エスケープシークエンスである。試作版を、クラス化して突っ込んだのだが、ヤキソバが、更に磨きを掛けたヤキソバになった感じ…最悪である。ただ、現行までのコンソールの形態が、今回のエスケープシークエンスを比較的すんなり取り込める形になっていたので、比較的…であるが、すんなり収まった感はある。あとは、現状のカーソルの点滅処理を、エスケープシークエンスでは、反転処理の連続としてインプリメントしたのと、終了後のEDIT移行の処理を追加した。
尚…,
void UseCwccESCConsole(int widthx,int heighty) ;
の関数実行前後及び、実際の実行上で、以下の様な制限を設ける事にした。
- この後は、FONT設定のクラスをロックする様にしたので、この後のFONT設定は無効になる。
- 色の設定は、この時点でデフォルトにセットされるので、以前の設定は無効(ここは、今後、要調整)になる事,また、この後、色の設定を行っても、表示上は、殆ど影響はされないので、注意されたい。
- この後、void CwccClientSize()によるクライアントサイズの変更は無効となる。また、これ以前に、クライアントサイズの変更を行っていた場合も、この時点で再設定されるので、無駄となる。
- メインのウインドウサイズについては、リサイズ出来る様にしたが、コンソールのサイズは、メインウインドウに追従しない様にしている。(サイズ等、今後微調整を行う為)
- カーソルの点滅等、部分的な書き換えの場合も、現状は全書き換えを行っているので、画面が激しくちらつく場合有り…調査中
- コンソールのサイズは、(フォントの高さ+1)*コンソールの行数とした。こうしないと、デフォルトのFixedSysを使用した際に問題が出る。
とりあえずは、この辺で内部公開しようと思う…次回は、内容の微調整を行って、1.2.β版を…と考えては居る。参考までに、お試し版が欲しいという方は、メール頂戴。
サンプル
|