[[BORLAND C++ CWCC]]
RETURN
CWCC#14 CWCC Evolution #4 Beta-Edition 1.2.Beta
前回までの結果を得て、何とかβ版に漕ぎ着けられそうだ。この週末,一部ユーザ殿にお試しをお願いしたら、早速要望が幾つか上がったので、そいつらを出来るだけ取り込んで、β版にしたいと思う。
  • 要望,報告など…
    注:一部、報告内容を引用しています(Special thanks to Y.M.殿,N.O.殿,A.Y殿)

    • タイトルバー変えよう!
      ユーザが初期化に口を出せる様になったので、タイトルバーも[CWCC Console]じゃなくて、他の文言に入れ替える事が出来る様にしてほしい。→これは、是非、組み込みたい。あと、他にも、ユーザメニューを使える様にしたいとか、ステータスバーを…と言う意見が有ったが、今回は保留,タイトルバーの文字列は、ユーザ指定可としたい。

    • バグ:現行までの関数に、全然ガードが掛かっていない
      はい,実はここ、全然やってません…というか忘れてました。ただ、単純にガード掛けるだけでは問題有りそうで、割と面倒な作業になるので、現在対応検討中という事で、βでは未対応。ちょっとおざなり…リリース版では、キッチリ対応する予定です。

    • マウス割り込みでのCwcc関数使用
      「ソース見ましたが、実行中にマウスのクリックがあって、そこでCwccPrintf()等実行されたら、まずいのでは??どうなります??」→って、考えてませんでした!!!CWCCでは、ユーザの書くスレッドと、メインウインドウを結ぶ線は1本で、メールボックスも1個なので、ここに競合が発生すると、見事に破壊される恐れがあります。現行までは、ユーザプログラムからの指示のみで、シーケンシャルだったので、問題無いのですが、マウスは、スレッドに対して非同期なので、何らかの方法で競合を排除する必要があります。セマフォ的な制御にするのか,若しくはマウス処理中は、制限を掛けるか…いずれかの方法で対応します。

    • マルチスレッドって?
      上のマウスの件で思い出したのだが、以前から、マルチスレッド使える様にしようよ!って声があって…、ただ、上述のマウスでも指摘ある様に、Cwccライブラリ関数を使われちゃうと、制御が厳しいので、現状は、保留している。ただ、マウスの方の制御が確立出来れば、同様に、マルチスレッドの場合も対応出来ると思う。

    • 是非、ユーザメニューを!
      これも、今回だけという訳では無く、以前からである。メニューバーに、ユーザメニューの追加を!と言う意見が多くあった。若しくは、オリジナルメニューを採用して、CWCCを使用している事を隠したい…と言う要望である。これは、ごもっともで、おいらも、以前、職場でCWCCベースに、シリアル解析用のツールを作成した時、タイトルバーやら、メッセージボックスのタイトルやら、メニューのバージョンにに[CWCC]って出るけど、何??って問い合わせが結構有ったし、ユーザとしては、こんなものは消したいし、オリジナルのメニューに差し替えたい…と思ってる筈。。。で、対応するのは、やぶさかでないのだが…今回の版で対応というのは、ちょっと厳しいし、上述のマウス,マルチスレッド同様の問題がつきまとうので、もう少し、練ってからのインプリメントとしたい。とりあえず、構想という形では書いておくので、コメントがあれば、聞かせていただきたい。

      • タイトル文字については、対応済み。
      • その他、CWCCをにおわせる、CwccYesNoやらCwccMessage,CwccSelect等のダイヤログ表示の関数及びファイルダイヤログでのタイトルバーについては、別途、タイトルを指定出来るインタフェース関数を用意して対応する予定。
      • ユーザメニューについて,(実装方法の構想)
        メニューIDをこちらで定義し、CWCC_USER_MID00〜CWCC_USER_MID99等,メニュー選択のイベントにて、あるクラス(class CwccUserMenu[仮名])のメソッドの呼び出しを実施する様に設計する。ユーザは、リソースファイルに、CWCC_USER_MID00〜CWCC_USER_MID99のIDを使用して独自のメニューを定義し、CwccUserMenuの派生クラスを作成し、初期化時点で、
        void CwccUseUserMenu(char *usermenuname,CwccUserMenu *UserMenuClass) ;[仮]
        インタフェースにて、登録すれば、その後、メニューが選択された場合、処理が記述出来ると言う訳である。

      • 問題点
        問題としては、マウス,マルチスレッドにて問題になっている事項と同様で、メニュー選択時に、Cwccライブラリ関数を使われた場合の競合をどうするか?という事になるが、基本的には、マウス,マルチスレッドの処理にての対応を踏襲すれば良い。(ここの管理はユーザに一任という事になるかも知れない…)

        また、CWCC自体の著作権みたいなものが守れないって問題もある。作者側としては、CWCCを著しく不利益なソフトに使用されちゃうと困るのである。一応、マニュアルに免責事項は書いてあるが、これは、おいらの個人的な問題なので、ちっちゃく書いておくが、コマンドプロンプトで、オプションに"--AreYouCWCC"とでも付けて実行したら、CWCCのバージョンを書き出して、終了する仕様にしようかと考えている。


    • カーソルを、漢字の部分に表示しようとすると、思いっきり文字化けしますね。
      え??嘘〜…あ、ホントだ!って〜事は…、漢字位置で、CwccGetStr()とかやると、まずいのでは??あ、やっぱり…原因は分かったが、どう対処するかは、検討せねば…とりあえずは、事実の報告のみで、後回し…CwccGetStrについては、ユーザ任せで良いが、カーソルは、みっともないので、そのうち対応予定。

    • ESCシークエンスが、全然足りない。
      少なくとも、ESC [pn A,ESC [pn B,ESC [pn C,ESC [pn D辺りの、カーソル位置制御及び、ESC [>5h と ESC [>5lのカーソル表示制御,ESC [pn M,ESC [pn Lの行挿入,削除辺りは、サポート必要では??とのご意見,ここは、下記の通り、随時対応予定です。

      書式ファンクション対応予定備考対応状況
      ESC [pl;ph H
      ESC [pl;pc f
      カーソル位置指定※1
      ESC = lcは、対応予定無し
      ESC [pn Aカーソル移動(pn行上に)--
      ESC [pn Bカーソル移動(pn行下に)--
      ESC [pn Cカーソル移動(pn桁右に)--
      ESC [pn Dカーソル移動(pn桁左に)--
      ESC Dカーソルを1行下に(Scroll有り)--
      ESC Eカーソルを1行下の左端に(Scroll有り)--
      ESC Mカーソルを1行上に(Scroll有り)--
      ESC [0 Jカーソル右全消去(最終行まで)--
      ESC [1 Jカーソル左全消去(先頭行から)--
      ESC [2 JESC *同様--
      ESC *画面クリア--
      ESC [0 kカーソル右消去(行末まで)--
      ESC [1 kカーソル左消去(行頭から)--
      ESC [2 k行消去--
      ESC [pn M複数(pn)行消去,以降を詰める--
      ESC [pn L複数(pn)行挿入,以降を下げる--
      ESC Bボールド指定◎?CWCCオリジナル※2
      ESC Iイタリック指定◎?CWCCオリジナル※2
      ESC U下線CWCCオリジナル
      ESC S取消線CWCCオリジナル
      ESC NノーマルCWCCオリジナル
      ESC [Zカーソルを最終行の右端にCWCCオリジナル※4
      ESC [Oカーソルをホーム(0,0)にCWCCオリジナル
      ESC [Xカーソルを現行の右端にCWCCオリジナル※4
      ESC [Tカーソルを現行の先頭にCWCCオリジナル
      ESC [Sカーソル位置属性保存--
      ESC [UESC [Sで保存した属性を戻す--
      ESC [6nカーソル位置の取得(ESC [pl;pc Rで戻す)--●関数で対応
      ESC )0漢字モード×使用しない×
      ESC )3グラフモード×使用しない×
      ESC [>5 h
      ESC [>5 l
      カーソル表示有無(5h=無し,5l=有り)--
      ESC [>1h
      ESC [>1l
      最下行をシステムで使用/使用しない×※3×
      ESC [>3h
      ESC [>3l
      20行モード,25行モード×途中で切り替えるのは無し×
      ESC [ps;..;ps m属性,色指定◎(blinkは△)一部オリジナル仕様含む○(blinkは×)
      表中、◎は、既に対応済み(◎?は、一部不具合有り),○は、組み込み検討済み,β版対応予定,△は、未検討であるが、組み込み可と思われるもの,×はCWCC仕様上、組み込み無し。?は、仕様が不明確の為、見送りとする。

      ※1:従来のESCシークエンスと差分有り(左上が0,0)
      ※2:文字幅に問題有り…
      ※3:ステータスバーで対応したらどうか?という意見が有ったが、ちょっと保留中
      ※4:右端は、スペース(0x20または0x00)では無い文字のある部分の右とする。


  • 組み込み
    • タイトルの変更
      タイトルを設定する関数として、
      void CwccTitle(char *titlestring) ;
      を定義した。120文字までのタイトルを許容するが、呼ばれなければ、デフォルトの『CWCC Console』が採用される。尚、この関数は、INITCASE1とINITCASE2でのみ有効とした。

    • ユーザマウスとの競合
      ユーザマウス処理中は、Cwccライブラリ関数の使用を禁止すると言うのが、簡単なのだが、ユーザマウス処理では、フラグをセットして終了,CwccMainにてポーリングして…という形が妥当と思われる。…芸が無いような…この方法だと、EDITのウインドウプロシージャでマウスのクリックを受け取ったら、Cwccライブラリ関数を禁止し、処理終了時点で解放するのだが、この間に、CwccMain側からCwccライブラリ関数を呼ばれると困ってしまう…ただ、セマフォを取得させるとなると、これはこれで、問題がある。例えば、Cwccライブラリ関数の中には、ユーザ操作まで待たされるものも有り、その間待たせると、メインウインドウ自体が『応答していません』になる可能性がある事,→タイムアウトさせるとすると、その場合のエラー処理は、どうすべきか?等、何れの場合も問題が山積みであった為、とりあえず、β版での対応は無し,基本的には、CwccMouse派生クラスのメソッド内で、CWCCライブラリの使用は、禁止,但し、ガードは掛けていないので、使用した場合の動作は保証外という形を採る。この辺は、ユーザ殿の判断に任せる事とし、その代わりと言ってはなんだが、今後の改版で、
      KEYMOUSEINFO CwccMouseGetch(void) ;
      マウスクリックまたは、キー入力有りまで停止,マウスまたは、キー入力にて、キーコード若しくはマウス位置,クリックされたボタン情報を返す
      MOUSEINFO CwccMouseSense(int onoff) ;
      CwccKeySense()と同様,センスした瞬間までにマウスのアクションが有れば、その情報を返す。
      を設ける事にした。

    • マルチスレッド
    • エスケープシークエンスの充実
      まずは、2点ほど,修正をば…現状の仕様だと、ESCが入力された後、ターミネータとして使われる文字が現れるまで、検索を続けてしまうので、誤って入力してしまった場合に、何も情報が表示されない場合が有ったので、EDITコントロールが、CWCC_IDU_OUTPUT_FINISHを受け取った時点で、ターミネートする様に改造した。これにより、CwccPutchでは、エスケープシークエンスが使えなくなる(前回のお試し版では使えた…)が、通常は、CwccPrint(),CwccPrintf()で使えれば良いと思うので、まず問題無しとして、この様な対応をした。この点については、RFC(コメント求む)としたい,どうしても、CwccPutchで、1文字ずつ指定したいという場合は、要望おくれ。2点目は、スペース入力についてであるが、エスケープ・シークエンスの判定中で、ターミネータとされる文字が確認されていない時点でのスペース入力は、読み飛ばす事にした。普通は、詰めて書く物だと認識しているが、"\x1b[ 32 m"の様に、スペース空けても認識出来るという事である。これは、独自仕様かな??

      • カーソル移動系
        これらについての盛り込みは、比較的簡単である。試作段階で、既に、カーソル位置の指定は盛り込んでいたので、これを応用して造り込んだ。ESC [pn A,B,C,D及び、とりあえず、ESC D,E,Mにも対応してみた。

      • 文字属性系
        文字幅の問題が、未解決であるので、バグる可能性は大であるが、一応、ESC B,ESC I,ESC U,ESC S,ESC Nに対応してみた。

      • 表示文字制御系
        こちらも、一応、一通り対応する事にした。若干強引な部分もあるが、この辺は、有志の方に試用いただいて、もむつもり。因みにESC [? J,ESC *,ESC [? kと、ESC [pn M,ESC [pn Lを対応した。

      • カーソル表示有無
        基本的には、CwccCursor()と同じであるので、実現は難しく無かったが、意外にも、ソースコード内の前後関係で苦労した。因みに、ESC [>5 h,ESC [>5 lは対応したが、ESC [>?h,ESC [>?lと言う書式は、全てここで吸収され、?=5以外は、無効として無視されるものとした。

      • 属性,色指定
        ここは試作のままである。ブリンクについては、対応せずの方向で調整したい。

      • その他
        意味が不明ながら、ESC [S,ESC [Uを対応した。基本的に、現在の属性を保存/復帰出来る様に対応したが、保存属性が、0x00000000(表示色,背景色共に黒)の場合は、復帰出来ない仕様である。また、ESC [6nについては、ESCシークエンスにて対応では無く、同等と思われるライブラリ関数を用意した。
        int CwccLocateX(void) ;
        int CwccLocateY(void) ;


      とまぁ、かなりのちからわざだったが、上の表の対応状況通り、盛り込めるものに関しては、とりあえず、全て入れてみた。というか、以前、上の表の「対応予定」を見て貰ったら、「え〜っっ,これだけですかぁ??」と言われてしまい、悔しかったので、一挙に入れてみた…。従って、デバッグも力入れてやってないし、内容は保証外!!多分、バグだらけだと思うが、とりあえずは使ってみて!って感じでβ版をリリースするのだ。


  • さて、リリース
    ダウンロード
    インストール方法やら、利用規約(免責事項)については、ここを参照して下さい。今回のリリースは、βなので、マニュアルみたいなものは造りませんが、追加機能を以下に簡単に説明します。尚、右のサンプル画像は、今回のパッケージに含まれているサンプルを実行した画面です。


    • ユーザ初期化
      cwcc.hをインクルードする前に、
      #define CWCC_USER_INIT
      を記述する事により、
      void CALLBACK CwccUserInitialize(void)
      が、呼ばれます。ここで、ユーザ初期化の定義を行って下さい。
      注:分割コンパイルを行う場合で、cwcc.hを複数のファイルにインクルードする場合では、#define CWCC_USER_INITを記述するファイルを、1個としてください。複数のファイルで、これを指定すると、問題が発生します。
      また、この関数内で、class CwccUserDesign
      の派生クラスのインスタンスを、
      void PresetUserDesignClass(CwccUserDesign *tmp) ;
      にセットする事により、CWCC内に定義されたWinMain先頭,メインウインドウ生成後、及びアプリ終了前の3点に於いて、それぞれ、class CwccUserDesignの派生クラスにおける
      void OnWinMainFirst(HINSTANCE hInstance,LPSTR CommLine) ;
      void OnConsoleCreated(HWND MainHwnd,HWND ConsHwnd) ;
      void OnWinMainExit(WPARAM ReturnValue) ;

      が呼ばれるので、こちらに初期化、または、終了処理を記載する事も出来ます。この時渡される引数の扱いについては、ユーザ殿の判断にお任せします。もとより、これらをいじった挙げ句の不具合については、責任を負えません。(また、ここでのCWCCライブラリ関数の使用は、基本的に禁止とします。)

    • CWCCマウスの利用
      class CwccMouseの派生クラスのインスタンスを、
      void SetCwccUserMouse(CwccMouse *UserMus) ;
      ※:CwccUserInitialize(),CwccUserDesign::OnWinMainExit()内では使えません
      にセットする事により、プログラム実行中に、ユーザがコンソール上で、マウスをクリックした事を検知する事が出来ます。class CwccMouseを継承し、メンバ関数(例void LButtonDown(WPARAM wpm,int x,int y))を拡張して、狙ったボタンのアクションを記述して下さい。尚、その際、CWCCライブラリ関数の使用は、基本的に禁止となります。class CwccMouseに関しては、cwcc.h内に定義されていますので、そちらを参照して下さい。

    • エスケープ・シークエンス
      従来のCWCCコンソールの代わりに、エスケープ・シークエンスの使えるコンソール(便宜上、以降、ESC-SQコンソールと呼称)を利用する事が出来ます。
      CwccUserDesign::OnWinMainFirst()内で、
      void UseCwccESCConsole(int widthx,int heighty) ;
      を、呼ぶ事で、幅widthxカラム,高さhighty行のコンソールを作成します。これにより、CwccMainにて、CwccPrint(),CwccPrintf()により、エスケープシークエンスが利用出来ます。対応表は、上述参照
      ※フォントの指定は、これ以前に行って下さい。デフォルトは、FixedSysの16ドットです。FIXEDタイプのフォントを指定して下さい。横幅がフレキシブルなタイプのフォントを指定した場合、表示がおかしくなります。
      ※色の指定は、この指定の後で行って下さい。


    • 追加のCWCCライブラリ関数
      • フォント指定
        void CwccSetFont(char *FontFace,int FontHeight,BOOL BOLD,long FFColor=0l) ;
        フォントを指定します。
        void CwccSetFont(LOGFONT *USERFONT) ;
        LOGFONT構造体にてフォントをセットします。

      • 色指定
        void CwccColors(COLORREF FFColor,COLORREF TextBk,HBRUSH BgColor) ;
        void CwccColors(COLORREF FFColor,COLORREF TextBk,COLORREF BgColorRef) ;
        void CwccColors(COLORREF FFColor,COLORREF TextBGRef) ;
        それぞれ、色を設定します。

      • エスケープ・シークエンス関連
        int CwccLocateX(void) ;
        int CwccLocateY(void) ;

        ESC-SQコンソール上で、現在のカーソル位置を返します。
        int CwccMouseLocateX(int pixx) ;
        int CwccMouseLocateY(int pixy) ;
        マウスの座標から、現在のESC-SQコンソール上でのテキスト座標位置(X=カラム,Y=行)を算出して返します。

      • マウス関連
        KEYMOUSEINFO CwccMouseGetch(void) ;
        マウスのクリック,または、キー押下を同時に待ちます。CwccGetchに、マウスが追加されたと考えて下さい。尚、戻り値は、KEYMOUSEINFOと言う構造体で戻ります。

        MOUSEINFO CwccMouseSense(int sw) ;
        CwccKeySense()のマウス版、その瞬間(まで)のマウスクリックを監視します。
        戻り値は、MOUSEINFOと言う構造体で戻ります。

        int CwccGetMouseXY(MOUSEINFO *MMX,int *x,int *y) ;
        int CwccGetMouseXY(KEYMOUSEINFO *MMX,int *x,int *y) ;
        それぞれの構造体から、マウスの情報を取り出します。戻り値が0であれば、マウスの入力ではありません。

        BOOL IsCwccMouseInfo(KEYMOUSEINFO *MMX) ;
        CwccMouseGetch()の戻り値が、マウスのものであるか否かを調べます。

      • その他
        void CwccClientSize(int widthpix,int heightpix) ;
        初期起動時のクライアントのサイズを指定します。ESC-SQコンソールを利用する場合では、無効になります。

        void CwccTitle(char *titlestring) ;
        CWCCコンソールのタイトルを指定します。

        void CwccMessagef(char *format,...) ;
        CwccMessage()の拡張版です。CwccPrint()に対するCwccPrintf()と同様の拡張となります。

        void CwccTickDelay(long delay_time_ms) ;
        delay_time_ms(単位ms)のウエイトを提供します。



2004/11/26
HomeSweetHome2
Ozzy's Software