RTEEditorのすべてのメニューで仕様に沿った動作が確認されたので、いよいよBCCSkeltonの仕様のままであったCREDITクラスのファイル入出力(注)を纏めてゆきます。

注:取扱ファイルはリッチテキストファイル(ファイル入出力の際のデータ形式-SF_RTF)とそれ以外で、それ以外のファイルはANSIテキストファイル(SF_TXT)として読み込みます。

 

最初、WCEditorの様に「ANSIテキスト、BOM付UTF-16、BOM付UTF-8、BOM無UTF-8」くらいは取り扱いと思ったのですが、Microsoft Docで調べてみると次のようです。

 

1.BCCSkeltonを作った時のRICHED1.0ではユニコードを扱えない。

 →織り込み済みであり、既にRICHED20.DLL対応になっているので問題ありません。

 

2.RICHED2.0から、ファイル入出力を行うEM_STREAMIN/EM_STREAMOUTのデータ形式がSF_TXT(ANSIテキスト)の場合、SF_UNICODEフラグを加えるとUTF-16形式のファイルになる。

 →これは入出力共に確認しました。但し、出力されるのは(どちらかというとマイナーな)「BOM無しUTF-16」形式であり、これはより一般的と考えられるBOM付UTF-16形式にします。(書き込みでBOM2バイトを書き込んでデータを書き込み、読み込みで最初にBOM2バイトをチェックします。しかし、EM_STREAMINの仕様からBOMを飛ばして読み込むことができない為、BOM(1文字)も読み込まれてしまい、最初の文字に影響が出ますが、まだその方が罪が軽いと判断しています。)

 

3.RICHED3.0から、「UTF-8RTF-これは、切り取り、コピー、貼り付けの操作に推奨されます。 このファイル形式は、通常の RTF よりもコンパクトで、高速で、Unicode と互換性があります。」とのことであり、EM_STREAMINやEM_STREAMOUTの際のWPARAMの値を "(CP_UTF8 << 16) | SF_USECODEPAGE | SF_RTF" に設定するようです。

 →Microsoft DocのEM_STREAMOUTの説明では明確にそう書かれていますが、EM_STREAMINの説明は触れられていません。また、SF_TXTでの話ですが文字抜けが起こるという話もありますが、書き込み、読み込み実験を行ったところ、一応正常に書き込み、読み込みができています。

 

【残された問題点】

1.上記したように、BOM付UTF-16形式だとBOM迄読み込むので、読み込んだデータの先頭1文字をマニュアルで削除する必要がある。

2.読み込みや、書き込みの際に必ずRTFでUTF-8かANSIの二択、TXTでUTF-16かUTF-8かANSIの三択のメッセージボックスが表示される仕様にしたので、少々ウザい。

3.何故かANSIでは問題がなあったが、ユニコード(UTF-16、UTF-8)のファイルを読むと、初期的にデータが表示されない。(データは読み込まれているのだけれども、文字が表示されない。)UpdateWindowをリッチエディットコントロールや親SDIウィンドウにかけて再描画を強制しても表示されない。(他のタブに移行して、戻ってくると表示される。)これはゆっくりと考えてみます。

 

いずれにしても、これで一応ECCSkeltonライブラリーと、テスト用のRTWEditorが出来上がったので、本日アップロードしておきました。早晩更新されると思います。

 

久々なので、次回はこのECCSkeltonでの独自プログラム第一号であるRTWEditorのコード紹介と説明をやってみようかな、と考えています。

 

前回、

【RTWEditor】CREDITクラス「文字列の検索、置換」で躓く

と書きましたが、本日自己解決し、ECCSkeltonのCREDITを書き直すとともに、BCCSkeltonのCREDITも書き直しましたので告知いたします。また、

何故なんだ?

の理由は次のように言えると思います。

 

(1)BCCSkeltonのCREDITクラスは、RichEdit 1.0("RICHED32.DLL")ベースで書いていましたが、新しいバージョンのリッチエディット(ECCSkeltonもBCCSkeltonもRichEdit 2.0と3.0(共に"RICHED20.DLL")とは「EM_FINDTEXT」の仕様が異なり、20年前のコードでは動作が意図通りにはなりませんでした。(注)

注:
FR_DOWNについて

Microsoft RichEdit 2.0以降: (FR_DOWNが)設定されている場合、検索は現在の選択範囲の末尾からドキュメントの末尾までです。設定されていない場合、検索は現在の選択範囲の末尾から文書の先頭までです。

Microsoft RichEdit 1.0: FR_DOWN フラグは無視されます。 検索は、常に現在の選択範囲の末尾からドキュメントの末尾までです。」(Microsoft Doc)
EM_FINDTEXTでは、WPARAMに検索オプションのフラグを与えますが、検索範囲はLPARAMにFINDTEXT構造体のポインターを入れてメンバーのchrg(chrg.cpMinとchrg.cpMaxで構成されるCHARRANGE構造体)で指定します。しかし、↑の文章では何か現在のリッチエディットでの選択範囲と連動しているような印象を与えませんでしょうか?これの本来の意図はリッチエディットコントロールで文字列が選択されている場合(chrg.cpMin < chrg.cpMax、選択されていない場合chrg.cpMin == chrg.cpMax)でも、検索範囲は選択範囲を外してFINDTEXT構造体を指定しなさいよ、ということかと。また、この後に、
FINDTEXT.chrgのcpMinメンバーは常に検索の開始点を指定し、cpMax は終点を指定します。逆方向に検索する場合cpMinはcpMax以上である必要があります。前方検索の場合、cpMaxの値-1は、検索範囲をテキストの末尾まで拡張します」(Microsoft Doc)

とあり、ここの記述は、RichEdit 1.0では常に「前方検索」、即ち下方(「下へ」)検索だったので該当せず、BCCSkeltonのコードを見ていただけると分かるように下方検索アルゴリズムで上方検索(「上へ」)を実装していたので混乱しました。またRichEdit 2.0以降は、「後方検索」、即ち「上方検索」の場合は、(下方検索ではcpMaxを-1して文末を指定するように)cpMaxを0として文頭を指定しなければなりません。その結果、検索中は常に「cpMax < cpMin(下方検索では「cpMax > cpMin」なので、両者の関係が逆)」の関係が続くことになります。これも「体感的に理解しがたく」、末尾にあるテストコードを書いて実験して確かめました。

 

(2)仕様の相違をよく読んでいなかった私も悪いのですが、Microsoft Docも英文の自動翻訳で日本語訳が誤解を招くものであったことも遠因となっています。上でも指摘していますが、ダイアログの表記の「上下」と検索の「前後」、それも「後」は「逆方向」などと表記の統一性が乏しく感じられます。

 

いずれにせよ、EM_FINDTEXTのフラグにFR_DOWNを与えていなかったBCCSkeltonのCREDITクラスのコードでは不味なので、すべて見直し、新しく(コメントをいっぱいつけて)書き直しました。

 

ポイントは、

//検索・置換メーッセージの登録
    m_frMsg = RegisterWindowMessageW(FINDMSGSTRINGW);

で「検索・置換ダイアログ」から送られてくるメッセージに、以下の3つのカテゴリーの情報が入っているということです。

(1)(「キャンセル」ボタンやシステムボタンで)ダイアログを消すフラグ

   FR_DIALOGTERM(0x00000040)

(2)押されたプッシュボタンのフラグ

   FR_FINDNEXT  (0x00000008)-「次を検索」
   FR_REPLACE   (0x00000010)-「置換して次へ」
   FR_REPLACEALL(0x00000020)-「全て置換」
(3)検索オプションフラグ(他は言語系が異なるのでCREDITクラスでは無視しています)

   FR_DOWN      (0x00000001)
   FR_MATCHCASE (0x00000004)
   FR_WHOLEWORD (0x00000002)
   注:この検索オプションフラグをEM_FINDTEXTの検索フラグへ渡してやる必要があります。

書き直した結果、前よりも大分コード量が減少したのはありがたかったです。もうBCCSkeltonでもRICHED32のVer 1.0を使うことはないと思い、CREDITクラスはECCSkeltonから逆移植しました。

これで後はファイル入出力だけに専念できそうです。

 

【ご参考-EM_FINDTEXTのテストコード】

/////////////////////
//EM_FINDTEXTWの実験
/////////////////////

FINDTEXTW ft;
ft.chrg.cpMin = 0;
ft.chrg.cpMax = -1;                // 検索範囲
ft.lpstrText = L"agreement";    //検索文字列
int count = 0;
WCHAR buff[256];

MessageBoxW(m_hWnd, L"下方検索", L"EM_FINDTEXTWテスト", MB_OK);
while((ft.chrg.cpMin = SendMessageW(m_Edit.m_hWnd, EM_FINDTEXTW, FR_DOWN, (LPARAM)&ft)) != NOMORE) {    //FR_MATCHCASEとFR_WHOLEWORDも なお、FR_DOWNは1です。
    count++;
    SendMessageW(m_Edit.m_hWnd, EM_SCROLLCARET, 0, 0);    //キャレット位置を表示する
    wsprintfW(buff, L"%dで%d回目が見つかりました", ft.chrg.cpMin, count);
    MessageBoxW(m_hWnd, buff, L"EM_FINDTEXTWテスト-下方検索", MB_OK);
    ft.chrg.cpMin += lstrlenW(ft.lpstrText);    //下方検索では検索文字列の先頭を指すft.chrg.cpMinを検索文字列長分先に進めることが必要
}
wsprintfW(buff, L"現在のft.chrg.cpMin = %d", ft.chrg.cpMin);    //EM_FINDTEXTで検索に失敗するとNOMORE(-1、即ち65535)が返されます。
MessageBoxW(m_hWnd, buff, L"現在のft.chrg.cpMin", MB_OK);
MessageBoxW(m_hWnd, L"下方検索を終了します", L"EM_FINDTEXTWテスト", MB_OK);
count = 0;
ft.chrg.cpMax = 0;
ft.chrg.cpMin = 65535;
MessageBoxW(m_hWnd, L"上方検索", L"EM_FINDTEXTWテスト", MB_OK);
while((ft.chrg.cpMin = SendMessageW(m_Edit.m_hWnd, EM_FINDTEXTW, 0, (LPARAM)&ft)) != NOMORE) {    //FR_MATCHCASEとFR_WHOLEWORDも
    count++;
    SendMessageW(m_Edit.m_hWnd, EM_SCROLLCARET, 0, 0);    //キャレット位置を表示する
    wsprintfW(buff, L"%dで%d回目が見つかりました", ft.chrg.cpMin, count);
    MessageBoxW(m_hWnd, buff, L"EM_FINDTEXTWテスト-上方検索", MB_OK);

    //上方検索ではft.chrg.cpMaxが0で、ft.chrg.cpMinが検索の度に繰り下がり、検索文字列の先頭を指すのでそのままでよい。
}
MessageBoxW(m_hWnd, L"上方検索を終了します", L"EM_FINDTEXTWテスト", MB_OK);

前回書いた進め方でCEDITクラスの移植を行い、いよいよファイル入出力をどうするか、になろうとして、FindText、ReplaceText処理で躓いてしまいました。

 

BCCSkeltonのCREDITクラスは"REDIT32.DLL"(バージョン1.0)の時に書かれ、文字列の検索、置換ダイアログを使って意図通りの動作をしますので、そのままUTF-16化を行えば問題なし、と思っていましたが、どっこいそうは問屋が卸してくれませんでした。

 

先ずこのFindText、ReplaceText(ダイアログ)処理ですが、

 

(1)「文字列の検索」「文字列の置換」用コモンダイアログは呼び出すだけでは何もしません。これら(モードレス)ダイアログの「次を検索」とか「すべて置換」等のボタンを押した際に発生するメッセージを拾って、ユーザーが文字列検索、文字列置換処理を行います。

(2)そのためには、先ずこれら(モードレス)ダイアログが送るメッセージを登録します。

    //検索・置換メーッセージの登録
    m_frMsg = RegisterWindowMessageW(FINDMSGSTRINGW);

(3)これら(モードレス)ダイアログはFINDREPLACE(W)構造体へのポインターを引数として、FindText、ReplaceText関数で呼び出します。

(4)後はこれら(モードレス)ダイアログがメッセージを送った場合に呼び出すユーザー定義関数をCREDITクラスのメンバーに加えます。(lParamはFINDREPLACE(W)構造体のポインター)

    //CREDITクラスは文字列検索・置換用にユーザーメッセージを作るので、
    //このような処理を行います。CREDITファイルを覗いてください。
    if(Msg == m_Edit.m_frMsg)
        m_Edit.FindReplace(lParam);    //検索・置換処理

 

ということで、特段難しい処理ではなく、検索文字列をFINDTEXT構造体のlpstrTextにぶち込み(これら(モードレス)ダイアログがやってくれる)、検索範囲を同じくCHARRANGE構造体であるchrg(先頭が0、末尾は-1)に入れて検索し、「もう無い(NOMORE == -1)」が返るまで、与えられたフラグ(FR_DOWN等)にに従って検索します。(例:SendMessageW(m_hWnd, EM_FINDTEXTW, flag, (LPARAM)ft)) != NOMORE)

戻り値が検索文字の先頭のキャラクターポインターになっているので、文字列長だけ選択して表示します。(交換したけりゃMessageBoxで確認して、交換文字列と替えます。例:SendMessageW(m_hWnd, EM_REPLACESEL, TRUE, (LPARAM)m_ReplaceWith);

 

しかし、テストではきちんと検索するのに、コモンダイアログで探すと見当たらない、という結果になる等、何故か正常に動作しません。コードも今回見直しを行い、若干手直しの上、コメントを書き直して分かりやすくしているのですが...

 

何故なんだ?

 

まぁ、気長に調査を行ってゆきます。

 

前回は自分で書いたCTABクラスのリビューを行いました。(大分脳みそが劣化しており、時間がかかります。)

そして次は肝心のリッチエディットコントロールのCREDITクラス、と思いましたが、ANSIベースでRTEditorを書いてから20年、リッチエディットコントロールも更新されているだろうとMicrosoft Docを見たら、先ず現在最新のリッチエディットコントロールはウィンドウクラス名も変わっており、機能も段違いです。(注)

:従来のリッチエディットコントロールはVer 1.0が "Riched32.dll" で、Ver2.0と3.0は ”Riched20.dll”(ウィンドウクラス名もユニコードが入ってきたのでANSIの "RichEdit20A" とユニコード(UTF-16)の "RichEdit20W" があります。が、これらは#define UNICODE条件で変わる "RICHEDIT_CLASS" を使変えますが、最新のVer4.1はDLL名も ”Msftedit.dll"、ウィンドウクラス名も "MSFTEDIT_CLASS" と完全に変わりました。

 

まぁ、Ver4.1はもう私の能力を超えているし、BCCSkeltonとの互換も考えれば、Ver2.0、3.0を対象にして移植するしかないかな、と考えています。更にリッチエディットコントロールは文字列を扱うのでウィンドウズのUTF-16化の影響をもろに受けており、他の関数のように簡単に対応できそうに思えません。

 

ということで、ECCSkelton仕様として、

(1)Ver2.0、3.0を対象として、"RichEdit20W"を使用

(2)「文字列処理はUTF-16一本」の方針ですが、ファイルの読み書きはANSIにも対応したい(注)

と考えてます。

注:リッチエディットコントロールの表示等は従来の対応で大丈夫ですが、ファイルの読み書きはEM_STREAMIN、EM_STREAMOUTの際のSF_RTFとSF_TEXTの二択から、ORでSF_UNICODEが使えるようになったそうで、両者のフラグに加えて出力ファイルとBOM等をチェックする実験が不可欠と考えています。更に(可能であれば)UTF-8にも対応したいのですが、現在はそのヒントすらわかりません。

 

まぁ、先は長そうですので、先ずはANSIのrtfファイルを使って動作を確実にし、その後UTF-16のファイルで対応、更にその先を目指すかどうかはその時に考えましょう。

 

Let it be!

 

ps. 先般アマゾンプライムでドキュメンタリーの"Eight days a week"を見ましたが、米国が1960年代中盤までアパルトヘイトであったとか、米国公演で白人黒人の入場区別を理由に公演拒否して(当時の公民権運動を背景に)社会問題になったり、(私には)懐かしい画像が多く流れました。特にJFK暗殺、東西冷戦(007のスパイシリーズは当時の現実)など「小学生なのにショーンコネリーが好きで、ビートルズを口ずさんでいた」私がいとおしかったです。

 

ECCSkelton(注)も完成し、CREDITクラスの動作確認までにRichTextを扱うサンプルとしてRTWEditorを作ることとし、「MDIは、もー旧いんじゃね?今はタブベースじゃね?」等と軽薄なことを言っていた罰が当たりました。

注:20年前のBCC5.5.1用のSJISベースのBCCSkeltonライブラリーを、Windowsがnativeにしているユニコード(といってもUTF-16)専用にした、現在のBCC102(Embarcadero C++ Compiler)用の互換ライブラリー

 

自分で書いたCTABクラスがわかんねぇ!

 

てか(というか...なれない若者言葉は止めます...)、「タブコントロールってどういうものだったっけ?」というところが、20年前のコードだし、どういう位置づけ(子ウィンドウであるコントロールで、更にタブシート毎の孫ウィンドウを貼っ付けてあるんだっけ???等々)だったかも忘れていた(注)ので、今日ほぼ一日かけて復習しました。

注:CTABをそのまま使ったアプリは一度も書いたことが無く、CVSPLIT(とCHSPLIT)クラスで4つのスプリットウィンドウにタブをあてがった時に使っただけで、アプリとしてはSplitterTestしかありません。

 

最初は「タブというものは、メインとなる親ウィンドウのコントロールとなる子ウィンドウを多数寄せ集めて、切り替えて表示するもの」という想定でCTABのコードを見たり、SplitterTestのコードを見たりしたのですが、どうもそういうことではないようです。CTABクラスのコードを見直すと、最大64枚のタブ迄設定でき、それに応じた整数の配列があるのですが、それが「タブコントロールの子ウィンドウのコントロールID」であると誤解して「分かんねー、分かんねーな」を繰り返していました。(実際その想定でタブシートの一つにリッチエディットコントロールを貼ろうとして、エラーばかり出していました。)

 

で、悩みぬいて

 

「あっ、そいこと!?!」

 

と、気が付いたのは、

親ウィンドウ---タブウィンドウ(タブインデックスだけ表示し、場所貸しを生業とする手配師)

|--------第1タブウィンドウで表示されるコントロール(親はタブではない)(非表示)

|--------第2タブウィンドウで表示されるコントロール(親はタブではない)(カレントタブ→表示)

|--------最終タブウィンドウで表示されるコントロール(親はタブではない)(非表示)

 

という関係でした。(注)

注:昭和の上野公園にお花見に行くと、ヤクザが良い場所を占有して、来客からお金を取って「はい、ここで1時間楽しんで!」で、1時間立つと「オラオラ、次のお客さんが待っているんだから早くどけよ!」と「場所の管理」を業務にしていたことを思い出します。

 

要すれば、

(1)タブコントロールは「今どのタブページを表示しているのかを示すインデックスを表示」し、「その表示場所のサイズを与える」ことができるだけで、

(2)後はユーザーがその表示場所をどう使うかはユーザー次第なのですが、CTABでは「各タブページに一つの親のコントロール(親の子ウィンドウで、CTABとは兄弟)を表示画面に張る」こととを設計仕様にしています。(注)

(3)後はタブページの新規追加と任意削除というページ管理ができればそれでよいわけです。

注:今回のRTWEditorの場合、リッチエディットコントロールを各タブページへ張り付ければよいのですが、いくつかのコントロールを持つページにしたいなら、リソースのダイアログを張り付けることも可能です。

 

と、いうことでやっと昔の自分の考えが分かり、「はぁー、俺は賢かったんだなぁー」という感慨を持った老人の一日でした。

 

ps. このような、しょーもない話なのでPeogram関連とせず、ブログとしてアップしています。しっかし、ボケてきたなぁー。

MDIって知っていますか?

 

Googleに単に"MDI"と打ち込むと、不動産会社が出てきますね。しかし、私が今日取り上げるのはウィンドウインターフェースの一つである、Multiple Documents Interfaceのことです。

 

実は昔(1991年)Windows 3.1を初めて使うようになって、「画面の中に色々なタスクのウィンドウを、まるで机の上に書類を広げるように仕事ができるのは格好良いっ!」と思い、更に「一つのアプリなのに、メインウィンドウの中にいくつもの子ウィンドウを開いて異なる仕事をするMDIも格好良いっ!」と思っており、「MDIこそウィンドウズアプリのあるべき姿」と信じていた時がありました。また、いつかはMDIのアプリを作ってみたいな、と思う気持ちもありました。

 

そんなことで、BCCForm and BCCSkeltonを作り始めた際、矢張りMDIのクラス(CMDI)を作りたいと思い、2002年のバージョンのサンプルにもリッチエディットファイルを扱うMDIのRTEditorを入れ、ツールとしてBCFEditorも同梱しました。

 

MDIはメインウィンドウ(Frame windowといいます)はドンガラで、この中にクライアントエリアをすべて占有する「下地」としての「クライアントウィンドウ(Client window)」を貼っ付けます。このクライアントウィンドウが子飼いの「子ウィンドウ(Child window)」にリッチエディット等必要なコントロールを貼っ付けて処理をします。

フレームウィンドウ - クライアントウィンドウ - 子ウィンドウ1
- 子ウィンドウ2
- 子ウィンドウ3

 

しかし、(自分で作っておきながらこんなことを言うのも何なんですが)MDIって使いづらくありませんか?↑のイメージのような状態で作業することはまずなく、結局処理をするファイルの子ウィンドウをメインウィンドウの中で最大化してつかってしまいます。実際、今日このブログを書くのでwikiを覗いてみたら、

曰く「一般的にMDIは開かれたウィンドウの管理が問題...

そのため近年のMDIアプリケーションはこの問題を解決するためタブ機能やタスクバーへの一覧表示機能を装備することでこの問題を解決するようになった。

そして、なーんと「マイクロソフトはMDI形式のアプリケーションを推奨していない。」と書かれていました。(やはり、このように感じるのは私だけではなかったのですね。)

 

ついでに(↑の赤字部分の)ご本家の出典を確認すると以下の通りでした。

Q: アプリケーションには SDI と MDI のどちらを使用するべきですか?

A: 大部分のプロダクティビティ アプリケーションには SDI (シングル ドキュメント インターフェイス) が適しています。MDI (マルチドキュメント インターフェイス) は依然として使用されていますが、今日のユーザーとオペレーティング システムにはあまり合っていません。ユーザーはより単純で使いやすいソフトウェアを求めています。SDI は、大部分のユーザー、特にコンシューマとホーム ユーザーがより簡単に理解できる単純なインターフェイスを備えています。多くのユーザーは、MDI インターフェイスで子ウィンドウが親ウィンドウの中にロックされているとフラストレーションを感じます。また、MDI アプリケーションの中のウィンドウは、タスクバーでは切り替えることができません。

特殊なアプリケーションを開発していて、MDI インターフェイスの採用を考えている場合には、ワークブックやプロジェクトなど、MDI の代わりになるデザインも検討するようにしてください。

SDI、MDI、およびその他のウィンドウ管理モデルとそれらの間のトレードオフの解説については、『Microsoft Windows User Experience』 (Microsoft Press) の Chapter 10 を参照してください。これはオンラインでも参照することができます。https://msdn.microsoft.com/library/ms997505.aspx

 

フ~ン

 

(我が意を得たり)ということで、ECCSkeltonにCMDIを移植するのは「時間の無駄」と結論付けて「廃止宣言」するとともに、その代替インターフェースとして(既にBCCSkeltonで実装していた)CTABクラスを使ってみようということで、ECCSkeltonのリッチエディットクラスのテストを兼ねて、

 

RTWEditor = CREDITクラス(サーバー) + CTABクラス(クライアント) + CSDIクラス(フレーム)

 

というプログラムを「BCCSkeltonからの移植ではなく、新規で、一から作る」ことにしてみました。(注)

注:とはいっても(対比の意味もあり)BCCSkeltonのRTEditorのリソースを活用し、MDIではなく、SDIウィンドウにタブを張り付けて、それぞれのタブにリッチエディットコントロールを張り付けたエディター、を考えています。

 

さーて、どうなることやら?乞御期待!

 

いま、久方ぶりに(暑い夏に合う)ウォッカトニック(Vodka tonic-英語だとヴォッドカトニック、と聞こえますが)で祝杯を挙げながら書いています。(おつまみは、...ワインや洋酒に合うのでとても気に入っている...昨日から二連荘のカプレーゼサラダ、玉ねぎの荒みじん切りを載せるのが私流か?...そうでもないみたいだな?)不具合のままアップしましたが、その「リソースが表示されない」不具合が本日解決しました。(グビッ)

 

結論から言うと、今回の不具合の原因は、ECCSkeltonというよりも(発生場所はそうなんですが)私の思い込み(半分は正しいのですが、その中途半端性で発見が遅れました)によりました。

 

The story is just like this.

 

分からないので途方に暮れ、半ばやけ気味にアップしてから、次に向かうべく"FileList"の移植を始めました。

このプログラムはCDLGにツールバー、リストビュー、ステータスバーを張り付けただけの簡単なものでスイスイと移植して、コンパイルすると、

 

あれっ、またリソースが表示されない?

 

その時、また直観が降りてきて「これってやっぱりhInstanceじゃね?」ということで、wWinMainやDllMainのインスタンスとメインウィンドウ(ダイアログ→不具合が発生していたのは、メインウィンドウをダイアログにしていたプログラムだけ)のインスタンスを比較してみました。

 

あれっ、なんでm_hInstanceが0?(注)

 

注:因みにこの時のプログラムインスタンス(エントリーポイント関数のHINSTANCE引数)は4******という値でした。

 

そうなんです。不具合の発生した TextToSpeechと、このFileListは共にCSDIベースではなく、CDLGでメインウィンドウにしているのですよね。それでECCSkeltonにおけるhInstance(注)の与え方をBCCSkeltonと比較すると、矢張り両者間で相違があり、ECCSkeltonではタイプ量、引数量を最小限にしたいために、プログラムインスタンス(注)を親ウィンドウ(hParent)から採っていたことが分かりました。

それはそれで(プログラムインスタンス == ウインドウプログラムの親ウィンドウのインスタンスである限り)正しいのですが、ダイアログベースのプログラムだと親が「デスクトップ(hParentが0で、hInstanceも0)」の場合、実際に作られたプログラムアプリケーション(それはそれ自体のhInstanceを持っている)の中のリソースが見えなくなってしまう、という結果になります。

注:ウィンドウズで実行されるプログラムはその管理の為に、固有のIDをHINSTANCEで与えられます。それは実行プログラムのエントリーポイントにあるhInstanceで実行プログラムに教えられます。実行プログラム(*.exe)に埋め込まれたリソースはそのID(hInsutance)をベースに参照されます。

 

「何故FileHandlerやWCEditorでは不具合が発生しないのか?」の答えも、CSDIがプログラムインスタンスを与えられ(m_hInstanceに保存)、それを子ウィンドウのダイアログに与える(元々のECCSkelton設計上の仕様)のでリソースを参照できることで説明されます。

 

従って、今回の不具合の原因は、

 

「ECCSkeltonの設計上、引数を減らすために、CDLGのm_hInstanceを引数で受け取らずに、親ウィンドウ(m_hParent)のインスタンスを取得してm_hInstanceに代入していた。これはプログラムがウィンドウベースで『親ウィンドウのインスタンス == プログラムインスタンス』の場合、正しく作動するが、親がOS(デスクトップ)の『ダイアログベースのプログラム』の場合、プログラム固有のインスタンスが渡されず、それに収録されたリソースを参照できない」

 

ということでした。(Does it make sense?)

 

本日修正版CDLGとそれに応じて修正したサンプルを入れてECCSkeltonパックを修正した、BCCFormandBCCSkeltonをアップしました。

 

FileListは問題であったステータスバーの「吹き出し」も正常に表示されるようになりました。

 

めでたし、めでたし。

 

今日は移植したTextToSpeechをモーダルダイアログベースから、モードレスダイアログベースに変えて、またツールバーに渡すインスタンスもいじってみたのですが、結局何も変わらない、という結論になりました。

 

TextToSpeechのBCCSkelton版との対比、ECCSkeltonのFileHandlerとの対比がユーザーにもできるよう、本日ECCSkelton版(ツールバービットマップとバージョンダイアログのSTATICコントロールのアイコンが表示されないが、動作は完動)のTextToSpeech(注)を入れてアップしましたので、どなたかが原因を突き止められましたなら教えていただきたく存じます。

 

注:SAPIのTextToSpeechですが、どういう訳か私は「名詞to動詞」と理解していて、今回「speechじゃ動詞じゃない、おかしいよな」ということで「名詞to名詞」であることに気が付きました。「文章から発声へ」という意味ですね。

 

 

TextToSpeech.exeをコンパイルすると、ツールバービットマップと、Versionダイアログのアイコンが表示されない不具合の調査をまだ続けています。今回は調査内容とその結果などをご報告。

 

1.BCC102(bcc32c.exe)によるコンパイル警告

いつもはごちゃごちゃ排出されて五月蠅いので消している(-w-オプション)警告を全て出してコンパイルしてみました。以下にその出力を最初の一つ(注)以降中間省略して表示します。内容をチェックしましたが、問題のIDI_TOOLBARとIDI_ICON関連の警告はありませんでした。

注:ECCSkelton.hで"#define         UNICODE"としていますが、bcc32c.exeに-tUオプションを付けるとコマンドラインに"#define UNICODE 1"が展開されるようです。(なので、私も’1’に定義を修正しました。)

 

----------------------------------
 BatchGood - Batch File Generator
 for Embarcadero "bcc32c.exe"
 Copyright (c) 2021 by Ysama
----------------------------------
Embarcadero C++ 7.30 for Win32 Copyright (c) 2012-2017 Embarcadero Technologies, Inc.
C:\Users\ysama\Programing\Windows Program\ECCSkelton\ECCSkeltonSample\07 TextToSpeech\TextToSpeech.cpp:
In file included from C:\Users\ysama\Programing\Windows Program\ECCSkelton\ECCSkeltonSample\07 TextToSpeech\TextToSpeech.cpp:5:
In file included from C:\Users\ysama\Programing\Windows Program\ECCSkelton\ECCSkeltonSample\07 TextToSpeech/TextToSpeech.h:6:
C:\Users\ysama\Programing\Windows Program\ECCSkelton\ECCSkelton.h:11:10: warning: 'UNICODE' macro redefined
#define         UNICODE
                ^
<command line>:1:9: note: previous definition is here
#define UNICODE 1
        ^
(省略)

66 warnings generated.
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
Borland Resource Compiler  Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation.  All rights reserved.
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
 

2.コンパイル済リソースファイル(*.RES)のダンプ

Dumpを使ってTextToSpeechのRESファイルのダンプを取ってみました。(末尾参照)

最初にダイアログに埋め込む為、IDI_ICONの値がダイアログ定義(注)で現れ、その後アイコン、ビットマップの順でビットデータ等が格納されているようです。"FileHandler.RES"のダンプと対比しましたが両者ともに文字列での定義(例:IDI_ICON等)はなく、特に相違するところは感じられませんでした。

注:49 00 44 00 44 00 5F 00 4D 00 41 00 49 00 4E 00 :I.D.D...M.A.I.N.(L"IDD_MAIN")の様に、文字列はちゃんとワイド文字(UTF-16)になっていますね。

 

3.MAKEINTRESOURCEとIS_INTRESOURCE

ツールバービットマップの読み込みでMAKEINTRECOURCEを使っているので、これもちょっと調べました。(winuser.h)

先ず当然UNICODEで定義が異なります。

 

#ifdef UNICODE
#define MAKEINTRESOURCE  MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#endif // !UNICODE


また、リソースによって種類があるのですね。

 

/*
 * Predefined Resource Types
 */

#define RT_CURSOR           MAKEINTRESOURCE(1)
#define RT_BITMAP           MAKEINTRESOURCE(2)
#define RT_ICON             MAKEINTRESOURCE(3)
#define RT_MENU             MAKEINTRESOURCE(4)
#define RT_DIALOG           MAKEINTRESOURCE(5)
#define RT_STRING           MAKEINTRESOURCE(6)
#define RT_FONTDIR          MAKEINTRESOURCE(7)
#define RT_FONT             MAKEINTRESOURCE(8)
#define RT_ACCELERATOR      MAKEINTRESOURCE(9)
#define RT_RCDATA           MAKEINTRESOURCE(10)
#define RT_MESSAGETABLE     MAKEINTRESOURCE(11)

#define DIFFERENCE     11
#define RT_GROUP_CURSOR MAKEINTRESOURCE((ULONG_PTR)(RT_CURSOR) + DIFFERENCE)
#define RT_GROUP_ICON   MAKEINTRESOURCE((ULONG_PTR)(RT_ICON) + DIFFERENCE)
#define RT_VERSION      MAKEINTRESOURCE(16)
#define RT_DLGINCLUDE   MAKEINTRESOURCE(17)
#if(WINVER >= 0x0400)
#define RT_PLUGPLAY     MAKEINTRESOURCE(19)
#define RT_VXD          MAKEINTRESOURCE(20)
#define RT_ANICURSOR    MAKEINTRESOURCE(21)
#define RT_ANIICON      MAKEINTRESOURCE(22)
#endif /* WINVER >= 0x0400 */
#define RT_HTML         MAKEINTRESOURCE(23)

 

因みにIDI_TOOLBARのMAKEINTRESOURCEは、

 

#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
 

に展開されています。これがきちんとリソースを指しているのか?という点を、余りお馴染みではないIS_INTRESOURCEマクロを使って試してみました。

 

    if(IS_INTRESOURCE(IDI_TOOLBAR))
        MessageBoxW(m_hWnd, L"IDI_TOOLBARはリソースIDのポインターです", L"IDI_TOOLBAR", MB_OK);
  
 else
        MessageBoxW(m_hWnd, L"IDI_TOOLBARはリソースIDのポインターではありません。", L"IDI_TOOLBAR", MB_OK);

    if(IS_INTRESOURCE(IDI_ICON))
        MessageBoxW(m_hWnd, L"IDI_ICONはリソースIDのポインターです", L"IDI_ICON", MB_OK);
    
else
        MessageBoxW(m_hWnd, L"IDI_ICONはリソースIDのポインターではありません。", L"IDI_ICON", MB_OK);

 

共にTRUEの結果となりました。

 

ということで、矢張りどこにも問題らしき問題が見つかりません。しっかし、結局、

なーんも解決されていないじゃないかぁ!

 

【ご参考】

"TextToSpeech.RES"
//---------------------
//  イメージリソース
//---------------------
#define    IDI_ICON        500 (F4 01)
#define    IDI_TOOLBAR        600 (58 02)


0000 00 00 00 00 20 00 00 00 :FF FF 00 00 FF FF 00 00 :................
0010 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0020 2C 03 00 00 30 00 00 00 :FF FF 05 00 49 00 44 00 :....0.......I.D.
0030 44 00 5F 00 4D 00 41 00 :49 00 4E 00 00 00 00 00 :D...M.A.I.N.....
0040 00 00 00 00 30 10 11 04 :00 00 00 00 00 00 00 00 :....0...........
0050 C0 08 CA 80 11 00 00 00 :11 00 00 00 00 00 1D 01 :................
0060 24 01 49 00 44 00 4D 00 :5F 00 4D 00 41 00 49 00 :..I.D.M...M.A.I.
0070 4E 00 5F 00 4D 00 45 00 :4E 00 55 00 00 00 00 00 :N...M.E.N.U.....
0080 54 00 65 00 78 00 74 00 :54 00 6F 00 53 00 70 00 :T.e.x.t.T.o.S.p.
0090 65 00 65 00 63 00 68 00 :00 00 08 00 2D FF 33 FF :e.e.c.h.......3.
00A0 20 00 0E 66 1D 67 00 00 :03 03 01 50 00 00 00 00 :...f.g.....P....
00B0 E0 00 15 00 38 00 0E 00 :64 00 FF FF 80 00 F3 97 :....8...d.......
00C0 F0 58 6E 30 78 90 9E 62 :00 00 00 00 03 00 B1 50 :.Xn0x..b.......P
00D0 00 00 00 00 09 00 25 00 :0C 01 52 00 65 00 FF FF :..........R.e...
00E0 83 00 00 00 00 00 00 00 :03 00 A1 50 00 00 00 00 :...........P....
00F0 12 00 8E 00 8A 00 2A 00 :66 00 FF FF 83 00 00 00 :........f.......
0100 00 00 00 00 09 00 03 50 :00 00 00 00 AF 00 91 00 :.......P........
0110 57 00 0C 00 67 00 FF FF :80 00 37 75 27 60 00 00 :W...g.....7u....
0120 00 00 00 00 09 00 01 50 :00 00 00 00 AF 00 A1 00 :.......P........
0130 57 00 0C 00 68 00 FF FF :80 00 73 59 27 60 00 00 :W...h.....sY....
0140 00 00 00 00 00 01 00 50 :00 00 00 00 12 00 B5 00 :.......P........
0150 91 00 09 00 69 00 FF FF :82 00 F3 97 CF 91 20 00 :....i...........
0160 2D 00 20 00 35 00 30 00 :00 00 00 00 01 00 01 50 :....5.0........P
0170 00 00 00 00 0F 00 C1 00 :FF 00 0F 00 6A 00 4D 00 :............j.M.
0180 53 00 43 00 54 00 4C 00 :53 00 5F 00 54 00 52 00 :S.C.T.L.S...T.R.
0190 41 00 43 00 4B 00 42 00 :41 00 52 00 33 00 32 00 :A.C.K.B.A.R.3.2.
01A0 00 00 00 00 00 00 00 00 :00 01 00 50 00 00 00 00 :...........P....
01B0 12 00 D3 00 91 00 09 00 :6B 00 FF FF 82 00 1F 90 :........k.......
01C0 A6 5E 20 00 2D 00 20 00 :30 00 00 00 00 00 00 00 :........0.......
01D0 01 00 01 50 00 00 00 00 :0F 00 DF 00 FF 00 0F 00 :...P............
01E0 6C 00 4D 00 53 00 43 00 :54 00 4C 00 53 00 5F 00 :l.M.S.C.T.L.S...
01F0 54 00 52 00 41 00 43 00 :4B 00 42 00 41 00 52 00 :T.R.A.C.K.B.A.R.
0200 33 00 32 00 00 00 00 00 :00 00 00 00 00 01 00 50 :3.2............P
0210 00 00 00 00 12 00 F1 00 :91 00 09 00 6D 00 FF FF :............m...
0220 82 00 F3 97 0B 7A 20 00 :2D 00 20 00 30 00 00 00 :.....z......0...
0230 00 00 00 00 01 00 01 50 :00 00 00 00 0F 00 FD 00 :.......P........
0240 FF 00 0F 00 6E 00 4D 00 :53 00 43 00 54 00 4C 00 :....n.M.S.C.T.L.
0250 53 00 5F 00 54 00 52 00 :41 00 43 00 4B 00 42 00 :S...T.R.A.C.K.B.
0260 41 00 52 00 33 00 32 00 :00 00 00 00 00 00 00 00 :A.R.3.2.........
0270 00 01 00 50 00 00 00 00 :0D 00 1B 00 5A 00 09 00 :...P........Z...
0280 6F 00 FF FF 82 00 29 52 :28 75 EF 53 FD 80 F3 97 :o......R.u.S....
0290 F0 58 EA 30 B9 30 C8 30 :00 00 00 00 00 01 00 50 :.X.0.0.0.......P
02A0 00 00 00 00 12 00 82 00 :2D 00 09 00 70 00 FF FF :............p...
02B0 82 00 00 8A 9E 8A 00 00 :00 00 00 00 07 00 00 50 :...............P
02C0 00 00 00 00 08 00 77 00 :0D 01 9A 00 00 00 FF FF :......w.........
02D0 80 00 AD 8A 7F 30 FA 51 :57 30 AA 30 D7 30 B7 30 :.....0.QW0.0.0.0
02E0 E7 30 F3 30 00 00 00 00 :07 00 00 50 00 00 00 00 :.0.0.......P....
02F0 A5 00 85 00 67 00 2E 00 :00 00 FF FF 80 00 27 60 :....g...........
0300 25 52 00 00 00 00 00 00 :01 01 00 50 00 00 00 00 :.R.........P....
0310 00 00 00 00 1D 01 12 00 :96 00 54 00 4F 00 4F 00 :..........T.O.O.
0320 4C 00 42 00 41 00 52 00 :57 00 49 00 4E 00 44 00 :L.B.A.R.W.I.N.D.
0330 4F 00 57 00 33 00 32 00 :00 00 00 00 00 00 00 00 :O.W.3.2.........
0340 03 08 00 50 00 00 00 00 :00 00 18 01 1D 01 0C 00 :...P............
0350 97 00 4D 00 53 00 43 00 :54 00 4C 00 53 00 5F 00 :..M.S.C.T.L.S...
0360 53 00 54 00 41 00 54 00 :55 00 53 00 42 00 41 00 :S.T.A.T.U.S.B.A.
0370 52 00 33 00 32 00 00 00 :00 00 00 00 46 01 00 00 :R.3.2.......F...
0380 38 00 00 00 FF FF 04 00 :49 00 44 00 4D 00 5F 00 :8.......I.D.M...
0390 4D 00 41 00 49 00 4E 00 :5F 00 4D 00 45 00 4E 00 :M.A.I.N...M.E.N.
03A0 55 00 00 00 00 00 00 00 :30 10 11 04 00 00 00 00 :U.......0.......
03B0 00 00 00 00 00 00 00 00 :10 00 D5 30 A1 30 A4 30 :...........0.0.0
03C0 EB 30 28 00 26 00 46 00 :29 00 00 00 00 00 C8 00 :.0....F.........
03D0 B9 30 AF 30 EA 30 D7 30 :C8 30 6E 30 65 51 9B 52 :.0.0.0.0.0n0eQ.R
03E0 28 00 26 00 49 00 29 00 :00 00 00 00 C9 00 AF 30 :....I..........0
03F0 EA 30 C3 30 D7 30 DC 30 :FC 30 C9 30 4B 30 89 30 :.0.0.0.0.0.0K0.0
0400 65 51 9B 52 28 00 26 00 :43 00 29 00 00 00 00 00 :eQ.R....C.......
0410 CA 00 D5 30 A1 30 A4 30 :EB 30 4B 30 89 30 65 51 :...0.0.0.0K0.0eQ
0420 9B 52 28 00 26 00 4F 00 :29 00 00 00 00 00 CB 00 :.R....O.........
0430 B9 30 AF 30 EA 30 D7 30 :C8 30 D5 30 A1 30 A4 30 :.0.0.0.0.0.0.0.0
0440 EB 30 6E 30 DD 4F 58 5B :28 00 26 00 53 00 29 00 :.0n0.OX.....S...
0450 00 00 00 00 00 00 00 00 :80 00 CC 00 42 7D 86 4E :............B..N
0460 28 00 26 00 58 00 29 00 :00 00 10 00 AD 8A 0A 4E :....X..........N
0470 52 30 28 00 26 00 52 00 :29 00 00 00 00 00 CD 00 :R0....R.........
0480 9F 5B 4C 88 28 00 26 00 :52 00 29 00 00 00 00 00 :..L.....R.......
0490 CE 00 00 4E 42 66 5C 50 :62 6B 28 00 26 00 53 00 :...NBf.Pbk....S.
04A0 29 00 00 00 80 00 CF 00 :8D 51 9F 5B 4C 88 28 00 :.........Q..L...
04B0 26 00 43 00 29 00 00 00 :90 00 D8 30 EB 30 D7 30 :..C........0.0.0
04C0 28 00 26 00 48 00 29 00 :00 00 00 00 D0 00 7F 4F :....H..........O
04D0 44 30 B9 65 28 00 26 00 :48 00 29 00 00 00 80 00 :D0.e....H.......
04E0 D1 00 D0 30 FC 30 B8 30 :E7 30 F3 30 C5 60 31 58 :...0.0.0.0.0..1X
04F0 28 00 26 00 56 00 29 00 :00 00 00 00 76 00 00 00 :....V.......v...
0500 34 00 00 00 FF FF 05 00 :49 00 44 00 44 00 5F 00 :4.......I.D.D...
0510 44 00 49 00 53 00 50 00 :4C 00 41 00 59 00 00 00 :D.I.S.P.L.A.Y...
0520 00 00 00 00 30 10 11 04 :00 00 00 00 00 00 00 00 :....0...........
0530 40 08 CF 80 01 00 00 00 :02 00 00 00 00 00 E0 01 :................
0540 68 01 00 00 00 00 BD 30 :FC 30 B9 30 D5 30 A1 30 :h......0.0.0.0.0
0550 A4 30 EB 30 6E 30 68 88 :3A 79 00 00 0A 00 2D FF :.0.0n0h..y......
0560 33 FF 20 00 0E 66 1D 67 :00 00 00 00 01 00 00 50 :3....f.g.......P
0570 00 00 00 00 D8 00 53 01 :30 00 0F 00 01 00 FF FF :......S.0.......
0580 80 00 42 7D 86 4E 00 00 :00 00 00 00 04 10 B0 50 :..B..N.........P
0590 00 02 00 00 06 00 06 00 :D4 01 4A 01 2C 01 FF FF :..........J.....
05A0 81 00 00 00 00 00 00 00 :9E 00 00 00 34 00 00 00 :............4...
05B0 FF FF 05 00 49 00 44 00 :44 00 5F 00 56 00 45 00 :....I.D.D...V.E.
05C0 52 00 53 00 49 00 4F 00 :4E 00 00 00 00 00 00 00 :R.S.I.O.N.......
05D0 30 10 11 04 00 00 00 00 :00 00 00 00 C4 08 C0 90 :0...............
05E0 01 00 00 00 03 00 00 00 :00 00 94 00 3C 00 00 00 :................
05F0 00 00 D0 30 FC 30 B8 30 :E7 30 F3 30 C5 60 31 58 :...0.0.0.0.0..1X
0600 00 00 09 00 54 00 69 00 :6D 00 65 00 73 00 20 00 :....T.i.m.e.s...
0610 4E 00 65 00 77 00 20 00 :52 00 6F 00 6D 00 61 00 :N.e.w...R.o.m.a.
0620 6E 00 00 00 03 10 00 50 :00 00 00 00 06 00 0A 00 :n......P........
0630 1A 00 1A 00 00 00 FF FF :82 00 FF FF
F4 01 00 00 :................
0640 01 10 00 50 00 00 00 00 :24 00 0A 00 6A 00 1A 00 :...P........j...
0650 90 01 FF FF 82 00 00 00 :00 00 00 00 00 03 01 50 :...............P
0660 00 00 00 00 3D 00 2A 00 :1A 00 0C 00 01 00 FF FF :................
0670 80 00 4F 00 4B 00 00 00 :00 00 00 00 A8 08 00 00 :..O.K...........
0680 20 00 00 00 FF FF 03 00 :FF FF 01 00 00 00 00 00 :................
0690 10 10 11 04 00 00 00 00 :00 00 00 00 28 00 00 00 :................
06A0 20 00 00 00 40 00 00 00 :01 00 08 00 00 00 00 00 :................
06B0 80 04 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
06C0 00 00 00 00 00 00 00 00 :00 00 80 00 00 80 00 00 :................
06D0 00 80 80 00 80 00 00 00 :80 00 80 00 80 80 00 00 :................
06E0 C0 C0 C0 00 C0 DC C0 00 :F0 CA A6 00 00 20 40 00 :................
06F0 00 20 60 00 00 20 80 00 :00 20 A0 00 00 20 C0 00 :................
0700 00 20 E0 00 00 40 00 00 :00 40 20 00 00 40 40 00 :................
0710 00 40 60 00 00 40 80 00 :00 40 A0 00 00 40 C0 00 :................
0720 00 40 E0 00 00 60 00 00 :00 60 20 00 00 60 40 00 :................
0730 00 60 60 00 00 60 80 00 :00 60 A0 00 00 60 C0 00 :................
0740 00 60 E0 00 00 80 00 00 :00 80 20 00 00 80 40 00 :................
0750 00 80 60 00 00 80 80 00 :00 80 A0 00 00 80 C0 00 :................
0760 00 80 E0 00 00 A0 00 00 :00 A0 20 00 00 A0 40 00 :................
0770 00 A0 60 00 00 A0 80 00 :00 A0 A0 00 00 A0 C0 00 :................
0780 00 A0 E0 00 00 C0 00 00 :00 C0 20 00 00 C0 40 00 :................
0790 00 C0 60 00 00 C0 80 00 :00 C0 A0 00 00 C0 C0 00 :................
07A0 00 C0 E0 00 00 E0 00 00 :00 E0 20 00 00 E0 40 00 :................
07B0 00 E0 60 00 00 E0 80 00 :00 E0 A0 00 00 E0 C0 00 :................
07C0 00 E0 E0 00 40 00 00 00 :40 00 20 00 40 00 40 00 :................
07D0 40 00 60 00 40 00 80 00 :40 00 A0 00 40 00 C0 00 :................
07E0 40 00 E0 00 40 20 00 00 :40 20 20 00 40 20 40 00 :................
07F0 40 20 60 00 40 20 80 00 :40 20 A0 00 40 20 C0 00 :................
0800 40 20 E0 00 40 40 00 00 :40 40 20 00 40 40 40 00 :................
0810 40 40 60 00 40 40 80 00 :40 40 A0 00 40 40 C0 00 :................
0820 40 40 E0 00 40 60 00 00 :40 60 20 00 40 60 40 00 :................
0830 40 60 60 00 40 60 80 00 :40 60 A0 00 40 60 C0 00 :................
0840 40 60 E0 00 40 80 00 00 :40 80 20 00 40 80 40 00 :................
0850 40 80 60 00 40 80 80 00 :40 80 A0 00 40 80 C0 00 :................
0860 40 80 E0 00 40 A0 00 00 :40 A0 20 00 40 A0 40 00 :................
0870 40 A0 60 00 40 A0 80 00 :40 A0 A0 00 40 A0 C0 00 :................
0880 40 A0 E0 00 40 C0 00 00 :40 C0 20 00 40 C0 40 00 :................
0890 40 C0 60 00 40 C0 80 00 :40 C0 A0 00 40 C0 C0 00 :................
08A0 40 C0 E0 00 40 E0 00 00 :40 E0 20 00 40 E0 40 00 :................
08B0 40 E0 60 00 40 E0 80 00 :40 E0 A0 00 40 E0 C0 00 :................
08C0 40 E0 E0 00 80 00 00 00 :80 00 20 00 80 00 40 00 :................
08D0 80 00 60 00 80 00 80 00 :80 00 A0 00 80 00 C0 00 :................
08E0 80 00 E0 00 80 20 00 00 :80 20 20 00 80 20 40 00 :................
08F0 80 20 60 00 80 20 80 00 :80 20 A0 00 80 20 C0 00 :................
0900 80 20 E0 00 80 40 00 00 :80 40 20 00 80 40 40 00 :................
0910 80 40 60 00 80 40 80 00 :80 40 A0 00 80 40 C0 00 :................
0920 80 40 E0 00 80 60 00 00 :80 60 20 00 80 60 40 00 :................
0930 80 60 60 00 80 60 80 00 :80 60 A0 00 80 60 C0 00 :................
0940 80 60 E0 00 80 80 00 00 :80 80 20 00 80 80 40 00 :................
0950 80 80 60 00 80 80 80 00 :80 80 A0 00 80 80 C0 00 :................
0960 80 80 E0 00 80 A0 00 00 :80 A0 20 00 80 A0 40 00 :................
0970 80 A0 60 00 80 A0 80 00 :80 A0 A0 00 80 A0 C0 00 :................
0980 80 A0 E0 00 80 C0 00 00 :80 C0 20 00 80 C0 40 00 :................
0990 80 C0 60 00 80 C0 80 00 :80 C0 A0 00 80 C0 C0 00 :................
09A0 80 C0 E0 00 80 E0 00 00 :80 E0 20 00 80 E0 40 00 :................
09B0 80 E0 60 00 80 E0 80 00 :80 E0 A0 00 80 E0 C0 00 :................
09C0 80 E0 E0 00 C0 00 00 00 :C0 00 20 00 C0 00 40 00 :................
09D0 C0 00 60 00 C0 00 80 00 :C0 00 A0 00 C0 00 C0 00 :................
09E0 C0 00 E0 00 C0 20 00 00 :C0 20 20 00 C0 20 40 00 :................
09F0 C0 20 60 00 C0 20 80 00 :C0 20 A0 00 C0 20 C0 00 :................
0A00 C0 20 E0 00 C0 40 00 00 :C0 40 20 00 C0 40 40 00 :................
0A10 C0 40 60 00 C0 40 80 00 :C0 40 A0 00 C0 40 C0 00 :................
0A20 C0 40 E0 00 C0 60 00 00 :C0 60 20 00 C0 60 40 00 :................
0A30 C0 60 60 00 C0 60 80 00 :C0 60 A0 00 C0 60 C0 00 :................
0A40 C0 60 E0 00 C0 80 00 00 :C0 80 20 00 C0 80 40 00 :................
0A50 C0 80 60 00 C0 80 80 00 :C0 80 A0 00 C0 80 C0 00 :................
0A60 C0 80 E0 00 C0 A0 00 00 :C0 A0 20 00 C0 A0 40 00 :................
0A70 C0 A0 60 00 C0 A0 80 00 :C0 A0 A0 00 C0 A0 C0 00 :................
0A80 C0 A0 E0 00 C0 C0 00 00 :C0 C0 20 00 C0 C0 40 00 :................
0A90 C0 C0 60 00 C0 C0 80 00 :C0 C0 A0 00 F0 FB FF 00 :................
0AA0 A4 A0 A0 00 80 80 80 00 :00 00 FF 00 00 FF 00 00 :................
0AB0 00 FF FF 00 FF 00 00 00 :FF 00 FF 00 FF FF 00 00 :................
0AC0 FF FF FF 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0AD0 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0AE0 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0AF0 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0B00 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0B10 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0B20 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0B30 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0B40 00 00 00 00 00 00 00 00 :00 00 00 A4 A4 A4 A4 A4 :................
0B50 A4 00 00 00 A4 A4 A4 A4 :A4 A4 A4 A4 00 00 00 00 :................
0B60 00 00 00 00 00 00 00 00 :00 00 A4 F9 F9 F9 F9 F9 :................
0B70 F9 A4 A4 A4 F9 F9 F9 F9 :F9 F9 F9 F9 A4 00 00 00 :................
0B80 00 00 00 00 00 00 00 00 :00 A4 A4 F9 F9 F9 F9 F9 :................
0B90 F9 F9 F9 F9 F9 F9 F9 F9 :F9 F9 F9 F9 A4 00 00 00 :................
0BA0 00 00 00 00 00 00 00 00 :A4 F9 F9 F9 F9 F9 F9 F9 :................
0BB0 F9 F9 F9 F9 F9 F9 F9 F9 :F9 F9 F9 F9 F9 A4 00 00 :................
0BC0 00 00 00 00 00 00 00 00 :A4 F9 F9 F9 F9 F9 F9 F9 :................
0BD0 F9 A4 A4 A4 F9 F9 F9 F9 :F9 F9 F9 F9 F9 A4 00 00 :................
0BE0 00 00 00 00 00 00 00 A4 :F9 F9 A4 A4 A4 A4 A4 A4 :................
0BF0 A4 F6 F6 FF A4 A4 A4 A4 :A4 A4 A4 A4 F9 F9 A4 00 :................
0C00 00 00 00 00 00 00 00 A4 :F9 A4 F6 F6 A4 F6 F6 A4 :................
0C10 F6 F6 A4 F6 F6 A4 F6 F6 :A4 F6 F6 A4 A4 F9 A4 00 :................
0C20 00 00 00 00 00 00 A4 F9 :F9 A4 A4 A4 00 A4 A4 00 :................
0C30 A4 A4 00 A4 A4 00 A4 A4 :00 A4 A4 00 A4 F9 F9 A4 :................
0C40 00 00 00 00 00 00 A4 F9 :A4 00 00 00 00 00 00 00 :................
0C50 00 00 00 00 00 00 00 00 :00 00 00 00 00 A4 F9 A4 :................
0C60 00 00 00 00 00 A4 F9 F9 :A4 00 00 00 00 00 00 00 :................
0C70 00 00 00 00 00 00 00 00 :00 00 00 00 00 A4 F9 F9 :................
0C80 A4 00 00 00 00 A4 F9 A4 :00 00 00 00 00 00 00 00 :................
0C90 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 A4 F9 :................
0CA0 A4 00 00 00 A4 F9 F9 A4 :00 A4 A4 FF A4 A4 FF A4 :................
0CB0 A4 00 00 A4 A4 FF A4 A4 :FF A4 A4 A4 FF 00 A4 F9 :................
0CC0 F9 A4 00 00 A4 A4 A4 F6 :A4 F6 F6 A4 F6 F6 A4 F6 :................
0CD0 F6 A4 A4 F6 F6 A4 F6 F6 :A4 F6 F6 F6 A4 00 00 A4 :................
0CE0 A4 A4 00 00 A4 A4 A4 F6 :A4 F6 F6 A4 F6 F6 F6 A4 :................
0CF0 A4 F9 F9 A4 A4 A4 F6 F6 :A4 F6 F6 F6 F6 A4 A4 A4 :................
0D00 A4 A4 00 00 A4 F9 F9 A4 :A4 F6 F6 A4 F6 A4 A4 F9 :................
0D10 F9 F9 F9 F9 F9 A4 A4 F6 :A4 F6 F6 A4 A4 F9 F9 F9 :................
0D20 F9 A4 00 00 00 A4 F9 F9 :F9 A4 A4 A4 A4 F9 F9 F9 :................
0D30 F9 F9 F9 F9 F9 F9 F9 A4 :A4 A4 A4 F9 F9 F9 F9 F9 :................
0D40 A4 00 00 00 00 A4 F9 F9 :F9 F9 F9 F9 F9 F9 F9 F9 :................
0D50 F9 F9 F9 F9 F9 F9 F9 F9 :F9 F9 F9 F9 F9 F9 F9 F9 :................
0D60 A4 00 00 00 00 00 A4 F9 :F9 F9 F9 F9 F9 F9 F9 F9 :................
0D70 F9 F9 F9 F9 F9 F9 F9 F9 :F9 F9 F9 F9 F9 F9 F9 A4 :................
0D80 00 00 00 00 00 00 A4 F9 :F9 F9 F9 F9 F9 F9 F9 F9 :................
0D90 F9 F9 F9 F9 F9 F9 F9 F9 :F9 F9 F9 F9 F9 F9 F9 A4 :................
0DA0 00 00 00 00 00 00 00 A4 :A4 F9 F9 F9 F9 F9 F9 F9 :................
0DB0 F9 F9 F9 F9 F9 F9 F9 F9 :F9 F9 F9 F9 A4 A4 A4 00 :................
0DC0 00 00 00 00 00 00 00 00 :00 A4 A4 F9 F9 F9 F9 F9 :................
0DD0 F9 A4 A4 A4 F9 F9 F9 F9 :F9 F9 A4 A4 00 00 00 00 :................
0DE0 00 00 00 00 00 00 00 00 :00 00 00 A4 A4 F9 F9 F9 :................
0DF0 A4 00 00 00 A4 F9 F9 F9 :A4 A4 00 00 00 00 00 00 :................
0E00 00 00 00 00 00 00 00 00 :00 00 00 00 00 A4 A4 A4 :................
0E10 00 00 00 00 00 A4 A4 A4 :00 00 00 00 00 00 00 00 :................
0E20 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0E30 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0E40 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0E50 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0E60 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0E70 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0E80 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0E90 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0EA0 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0EB0 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0EC0 00 00 00 00 FF FF FF FF :FF FF FF FF FF FF FF FF :................
0ED0 FF FF FF FF FE 07 00 FF :FC 00 00 7F F8 00 00 7F :................
0EE0 F0 00 00 3F F0 00 00 3F :E0 00 00 1F E0 00 00 1F :................
0EF0 C0 92 49 0F C7 FF FF 8F :87 FF FF 87 8F FF FF C7 :..I.............
0F00 08 06 00 43 00 00 00 63 :00 00 00 03 00 00 00 03 :...C...c........
0F10 80 00 00 07 80 00 00 07 :C0 00 00 0F C0 00 00 0F :................
0F20 E0 00 00 1F F8 00 00 FF :FE 07 03 FF FF 8F 8F FF :................
0F30 FF FF FF FF FF FF FF FF :FF FF FF FF FF FF FF FF :................
0F40 FF FF FF FF 14 00 00 00 :20 00 00 00 FF FF 0E 00 :................
0F50 FF FF
F4 01 00 00 00 00 :30 10 11 04 00 00 00 00 :........0.......
0F60 00 00 00 00 00 00 01 00 :01 00 20 20 00 00 01 00 :................
0F70 18 00 A8 08 00 00 01 00 :18 05 00 00 20 00 00 00 :................
0F80 FF FF 02 00 FF FF
58 02 :00 00 00 00 30 10 11 04 :......X.....0...
0F90 00 00 00 00 00 00 00 00 :28 00 00 00 A0 00 00 00 :................
0FA0 0F 00 00 00 01 00 04 00 :00 00 00 00 B0 04 00 00 :................
0FB0 00 00 00 00 00 00 00 00 :00 00 00 00 00 00 00 00 :................
0FC0 00 00 00 00 00 00 80 00 :00 80 00 00 00 80 80 00 :................
0FD0 80 00 00 00 80 00 80 00 :80 80 00 00 80 80 80 00 :................
0FE0 C0 C0 C0 00 00 00 FF 00 :00 FF 00 00 00 FF FF 00 :................
0FF0 FF 00 00 00 FF 00 FF 00 :FF FF 00 00 FF FF FF 00 :................
1000 FF FF FF FF FF FF FF FF :FF FF FF FF FF FF FF FF :................
1010 FF FF FF FF FF FF FF FF :FF FF FF FF FF FF FF FF :................
1020 FF FF FF 00 0F FF FF FF :FF FF FF FF FF FF FF FF :................
1030 88 88 99 99 99 98 88 88 :FF F0 00 00 00 00 0F FF :................
1040 FF FF FF FF FF FF FF FF :FF FF FF FF FF FF FF FF :................
1050 FF F0 00 00 00 00 0F FF :FF FF FF F4 44 44 44 44 :............DDDD
1060 FF FF FF FF FF FF FF FF :FF 00 00 00 00 00 00 0F :................
1070 FF F0 00 0B B0 0F FF FF :FF FF FF FF FF FF FF FF :................
1080 88 89 99 99 99 99 88 88 :FF F0 77 11 11 77 0F FF :..........w..w..
1090 FF FF FF F0 00 FF FF FF :FF FF FF FF FF FF FF FF :................
10A0 FF F0 FF FF FF FF 0F FF :FF 00 00 04 FF FF FF F4 :................
10B0 F0 00 00 00 00 00 FF FF :F0 33 00 00 00 88 03 0F :.........3......
10C0 FF F0 77 0B BB B0 0F FF :FF FF FF 00 0F FF FF FF :..w.............
10D0 88 99 99 99 99 99 98 88 :FF F0 71 11 11 17 0F FF :..........q.....
10E0 FF FF FF 0B B0 0F FF FF :FF FF FF FF FF BB 3F FF :................
10F0 FF F0 F0 00 00 0F 0F FF :F0 37 37 34 F4 44 44 F4 :.........774.DD.
1100 F0 03 33 33 33 33 0F FF :F0 33 00 00 00 88 03 0F :..3333...3......
1110 FF F0 77 0B BB BB 0F FF :FF F0 00 99 90 00 FF FF :..w.............
1120 89 F9 9F 99 F9 9F 99 88 :FF F0 71 11 11 17 0F FF :..........q.....
1130 FF FF FF 0B B0 0F FF FF :F0 00 00 00 00 BB 30 0F :..............0.
1140 FF F0 FF FF FF FF 0F FF :F0 73 73 74 FF FF FF F4 :.........sst....
1150 F0 F0 33 33 33 33 30 FF :F0 33 00 00 00 88 03 0F :..33330..3......
1160 FF F0 77 0B 3B BB 0F FF :FF 09 99 99 99 99 0F FF :..w.............
1170 9F 9F 9F 9F 9F 9F 99 98 :FF F0 77 11 11 77 0F FF :..........w..w..
1180 FF FF FF F0 0F FF FF FF :F0 FF FF FF FF FF FF 0F :................
1190 FF F0 F0 00 00 0F 0F FF :F0 37 37 34 F4 44 F4 44 :.........774.D.D
11A0 F0 BF 03 33 33 33 33 0F :F0 33 00 00 00 00 03 0F :...3333..3......
11B0 FF F0 77 0B 03 BB 0F FF :F0 99 99 99 99 99 90 FF :..w.............
11C0 9F 9F 9F 9F 9F 9F 99 98 :FF F0 77 33 33 77 0F FF :..........w33w..
11D0 FF FF FF 0B 00 FF FF FF :F0 F0 00 F0 0F BB 3F 0F :................
11E0 FF F0 FF FF FF FF 0F FF :F0 73 73 74 FF FF F4 F4 :.........sst....
11F0 F0 FB F0 33 33 33 33 30 :F0 33 33 33 33 33 33 0F :...33330.333333.
1200 FF F0 77 0B 03 BB 0F FF :F0 99 99 99 99 99 90 FF :..w.............
1210 99 9F 9F 9F 9F 9F 99 98 :FF F0 73 33 33 37 0F FF :..........s337..
1220 FF FF FF 0B 00 FF FF FF :F0 FF FF FF FF BB 3F 0F :................
1230 FF F0 F0 00 00 0F 0F FF :F0 37 37 34 FF FF F4 4F :.........774...O
1240 F0 BF BF 00 00 00 00 00 :F0 33 00 00 00 00 33 0F :.........3....3.
1250 FF F0 77 0B BB BB 0F FF :09 90 00 00 00 00 99 0F :..w.............
1260 99 F9 9F 9F 9F 9F F9 98 :FF F0 73 33 33 37 0F FF :..........s337..
1270 FF FF FF 0B 00 FF FF FF :F0 F0 00 F0 0F BB B3 0F :................
1280 FF F0 FF FF FF FF 0F FF :F0 73 73 74 44 44 44 0F :.........sstDDD.
1290 F0 FB FB FB FB F0 FF FF :F0 30 FF FF FF FF 03 0F :.........0......
12A0 FF F0 77 0B BB BB 0F FF :00 0F 0F 0F 0F 0F 00 0F :..w.............
12B0 9F 99 9F 9F 9F 9F 9F 98 :FF F0 77 33 33 77 0F FF :..........w33w..
12C0 FF FF FF 0B B0 0F FF FF :F0 FF FF FF FF FF BB 3F :................
12D0 FF F0 F0 00 0F FF 0F FF :F0 37 37 37 37 37 37 0F :.........777777.
12E0 F0 BF BF BF BF B0 FF FF :F0 30 FF FF FF FF 03 0F :.........0......
12F0 FF F0 77 0B BB BB 0F FF :09 90 00 99 90 00 99 0F :..w.............
1300 9F 99 9F 9F 9F 9F 9F 98 :FF F0 77 7A A7 77 0F FF :..........wz.w..
1310 FF FF 00 F0 BB 00 FF FF :F0 00 00 00 BB 30 0B B3 :.............0..
1320 FF F0 FF FF F0 00 0F FF :F0 73 00 00 00 00 73 0F :.........s....s.
1330 F0 FB F0 00 00 00 FF FF :F0 30 FF FF FF FF 03 0F :.........0......
1340 FF F0 77 0B BB BB 0F FF :F0 99 99 99 99 99 90 FF :..w.............
1350 9F 9F 9F 9F 9F 9F 9F 98 :FF F0 77 AA AA 77 0F FF :..........w..w..
1360 FF F0 B0 0F 0B B0 0F FF :F0 CC CC CB B3 CC CB B3 :................
1370 FF F0 F0 00 00 F0 FF FF :F0 37 0F FF FF F0 37 0F :.........7....7.
1380 FF 00 0F FF FF FF FF FF :F0 30 FF FF FF FF 03 0F :.........0......
1390 FF F0 77 70 0B BB 0F FF :F0 99 99 90 99 99 90 FF :..wp............
13A0 89 F9 FF F9 F9 9F F9 88 :FF F0 7A AA AA A7 0F FF :..........z.....
13B0 FF F0 B0 0F F0 B0 0F FF :F0 00 00 0B B3 00 0B B3 :................
13C0 FF F0 FF FF F0 0F FF FF :F0 73 70 B0 0B 03 73 0F :.........sp...s.
13D0 FF FF FF FF FF FF FF FF :F0 30 FF FF FF FF 00 0F :.........0......
13E0 FF F0 77 77 70 0B 0F FF :FF 09 99 0F 09 99 0F FF :..wwp...........
13F0 88 99 99 99 99 99 98 88 :FF F0 77 AA AA 77 0F FF :..........w..w..
1400 FF F0 BB 00 0B B0 0F FF :FF FF FF FB B3 FF FB B3 :................
1410 FF F0 00 00 00 FF FF FF :FF 00 00 0B B0 00 00 FF :................
1420 FF FF FF FF FF FF FF FF :F0 30 FF FF FF FF 0F 0F :.........0......
1430 FF F0 00 00 00 00 0F FF :FF F0 00 FF F0 00 FF FF :................
1440 88 89 99 99 99 99 88 88 :FF F0 77 7A A7 77 0F FF :..........wz.w..
1450 FF FF 0B BB BB 00 FF FF :FF FF FF FF BB BB BB 3F :................
1460 FF FF FF FF FF FF FF FF :FF FF FF 00 00 FF FF FF :................
1470 FF FF FF FF FF FF FF FF :F0 00 00 00 00 00 00 0F :................
1480 FF FF FF FF FF FF FF FF :FF FF FF FF FF FF FF FF :................
1490 88 88 99 99 99 98 88 88 :FF F0 00 00 00 00 0F FF :................
14A0 FF FF F0 00 00 0F FF FF :FF FF FF FF FB BB B3 FF :................

 

これは結構難題のようです。再度纏めます。

 

1.症状

(1)アイコンがバージョンダイアログのSTATICコントロールに表示されない。(プログラムアイコンは正しく表示さます。)

 

(2)ツールバービットマップが全く表示されない。

なお、TextToSpeechのリソースファイルは文字列をワイド文字化(L"~")していますが、#include、アイコン、ビットマップ共にファイル指定は(エラー回避のために)ワイド文字列にしていません。また、ReTextToSpeech.hファイルで正しく#defineされています。(値を変えても症状は変わりません。)

 

2.他サンプルの現状

(1)CSDITestサンプルではバージョンダイアログにアイコンが表示されます。

   →しかし、今から見るとメニューの文字列もASCII文字列のままです。(メニューは正常に文字表示されます。)

 

(2)WCEditorサンプルもバージョンダイアログにアイコンが表示されます。

   →#includeやアイコン指定のファイル表記はASCIIですが、メニューはワイド文字列(L"~")にして正常に文字表示されます。

 

(3)TestCanvas(BCCSkeltonのVirWinサンプル)サンプルではバージョンダイアログをMessageBoxWにしてアイコン表示をしていませんが、ツールバーを使用しており、ビットマップは正常に表示されます。

   →今見直すと、これのリソースファイルはBCCSkeltonの時のまんまですべてASCIIですね。(メニューは正常に文字表示されます。)

 

(4)FileHandlerではバージョンダイアログにアイコンが表示され、ツールバービットマップも正常に表示されます。

   →これもリソースファイルはBCCSkeltonの時のまんまですべてASCIIですね。(メニューは正常に文字表示されます。)

 

3.他サンプルとTextToSpeechとの比較

(1)他サンプルでもTextToSpeechでも、#include、アイコン、ビットマップ共にファイル指定は(エラー回避のために)ワイド文字列にしていません。

 

(2)リソーススクリプトの文字列はASCII("~")、ワイド文字(L"~")いずれの表記でもエラーなしでコンパイルされ、正常に文字列が表示されます。(DefWindowProcWを使っているので、文字列がASCIIとUTF-16だと差が出て当然なのに出ないのはおかしいのですが...)因みにTextToSpeechもワイド文字(L"~")をすべてのリソースの文字列に使っていたので、一旦ASCII表記に替えてコンパイルしたのですが全く変化はありませんでした。

 

(3)関連するコードは以下の通り。

<TextToSpeech.rc>

(...)

 CONTROL IDI_ICON, 0, L"STATIC", WS_CHILD | WS_VISIBLE | SS_SUNKEN | SS_ICON, 6, 10, 26, 26
(正常動作するWCEditorを全く同じです。)

(...)

//--------------------------
// イメージ(IDI_ICON)
//--------------------------
IDI_ICON    ICON    DISCARDABLE    "Icon.ico"

//--------------------------
// イメージ(IDI_TOOLBAR)
//--------------------------
IDI_TOOLBAR    BITMAP    DISCARDABLE    "ToolBar.bmp"

(全てのサンプルと同じです。)

 

<ResTextToSpeech.h>

//---------------------
//  イメージリソース
//---------------------
#define    IDI_ICON        500
#define    IDI_TOOLBAR        600

(値以外は全てのサンプルと同じです。)

 

<TextToSpeechProc.h>

    //ツールバーボタン用カスタムビットマップ追加
    TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 10);
(これはSkeltonWizardの出力通りで、他のサンプルと変わりません。)

 

(4)イメージリソース

とあるブログ

CreateToolbarEx にリソース ID 形式で指定可能なビットマップはパレット付ビットマップまたは 32 ビット ARGB 形式のビットマップのみ(Windows 10 の場合)となります。

と書いてあったので一応Microsoft Docを調べましたが、そのような話は書かれていませんね。(大体他のサンプルと同じicon<4bit-16色または8bit-256色>、bitmap<4bit-16色>だし、それは正常表示されているのだから。なお、ご本家がこう書いていますね。)

 

さて、...きちんと整理されましたが、...やはりなんでそうなるのか理由が分からず...

なーんも解決になっていないじゃないかぁ!

 

ps. この記事を書いた後、↑で示した「これのリソースファイルはBCCSkeltonの時のまんまですべてASCIIです」のサンプルのリソーススクリプトを全てワイド文字化(L"~")しました。その結果、...何も変わらず正常に表示されています。