本章では、Sun WorkShop Visual を使用してアプリケーションを Microsoft Windows で実行できるようにデザインする方法について説明します。Sun WorkShop Visual は、デザインに対してMFC (Microsoft Foundation Classes) を生成します。生成されたデザインは、Microsoft Windows 環境に直接移植できます。本章の内容は以下のとおりです。
2. Microsoft
Windows モードでの起動
デザインが MFC コード生成に適しているかどうかを確認できるように Sun WorkShop Visual
を実行する方法について説明します。
3. Sun WorkShop
Visual ウィンドウ
Windows デザインの作成に Sun WorkShop Visual を実行した場合の外観の違いについて説明します。「Sun WorkShop Visual」ウィンドウの説明を参照してください。
4. Microsoft
Windows 準拠
Sun WorkShop Visual による検査で、デザインが Windows
アプリケーションの生成に適しているかどうかを確認できない場合の詳細について説明します。「Microsoft Windows 準拠」を参照してください。
5. 準拠不良
取り込んだデザインが Windows 準拠検査に合格しなかった場合の対応処置について説明します。「準拠不良」ダイアログの説明を参照してください。
6. リンクの使用
Microsoft Windows 用のデザインでリンクを使用する方法について説明します。「リンクの使用」を参照してください。
7. 特定のウィジェットとリソースの型についての注意事項
以下を使用する場合に注意すべき内容について説明します。
8. サン以外のウィジェットの使用
Microsoft Windows デザインでサン以外のウィジェット (またはユーザーウィジェット)
を使用する方法について説明します。
9. メソッド宣言
生成された MFC コード中でのメソッド宣言場所を制御する方法について説明します。
10. アプリケーションクラス
MFC コードで CWinApp 生成を変更する方法について説明します。
11. ファイル名
Microsoft Windows に移植するファイルを命名する場合の注意事項について説明します。
12. コード生成時の諸注意
Microsoft Windows 用に生成するコードについて説明します。
13. Sun WorkShop
Visualの設定
Microsoft Windows 用のデザインの作成に関連しているリソースについて説明します。
第 12 章では、Windows 互換のデザインの作成およびそれに対する MFC コードの生成について手順を追って説明します。その手順に従って実際の作業を行うことで、Sun WorkShop Visual を使用して Windows アプリケーションを作成する方法について詳しく学ぶことができます。
この章は、すでに Sun WorkShop Visual についてある程度の知識を持ったユーザーを対象にしています。具体的には、第 8 章「構造化コード生成および再使用可能な定義」に記述するような構造化コード生成と、C++ コードの生成の概念を理解していることが必要です。C++ に関する記述は、「C++ クラス」を参照してください。
また、第 9 章「C++ コードの学習」 を参照して C++ コードの生成を実習することをお勧めします。
異なるプラットフォームに移植可能なアプリケーションを開発する際には、プラッ トフォームに固有の部分をカプセル化して、アプリケーションの本体部分が実装に関する詳細情報から切り 離されるようにすることが最も良い方法です。Sun WorkShop Visual は、C++ コード構造機能を使用して、同一の公開インタフェースを持つユーザーインタフェース (ただし実装は 2 種類) に対しての一連のクラスを生成します。
Sun WorkShop Visual では、これらの実装を様式と呼びます。生成可能な C++ コードには、3 種類の様式があります。
MFC を使用して Microsoft Windows 用のコードを生成する場合、以下を選択できます。
1 番目の方法を選択した場合、Sun WorkShop Visual は、ダイアログテンプレートからウィジェットを取り出してダイアログを制御する MFC コードを生成します。その結果、完全なアプリケーションが生成されます。
「リソースとして生成」トグルをオンにしないと、デザインに対して通常の MFC が生成されます。
MFC 対応アプリケーションの開発に対しても Sun WorkShop Visual はその C++ モデルの機能をフルに発揮します。つまり、サブクラス作成および継承機能を使用して他の機能を追加する ことができるのです。たとえば、この機能を使ってユーザー定義ウィジェットをクロスプラットフォーム対 応にすることができます。
Microsoft Windows モードで Sun WorkShop Visual を実行するには、次の 3 通りの方法があります。開発目的に合った一番良い方法を選択するようにしてください。その際、同一のSu n WorkShop Visual の実行形式を共有するユーザーの中には Microsoft Windows モードを望まないユーザーがいる可能性も考慮してください。
Sun WorkShop Visual アプリケーション・リソースを含んでいるファイル内のリソースで、以下のように Microsoft Windows モードを指定することができます。
Microsoft Windows モードで Sun WorkShop Visual を起動する 3 番目の方法は、別のアプリケーションのような外観を持たせて常に Microsoft Windows モードにしておくものです。この方法は、前述のアプリケーション・リソースを使用します。
1. $VISUROOT/bin ディレクトリの Sun WorkShop Visual シェルスクリプトへのハードリンクを作成します。
2. 作成したファイルに visuwin などの名前を付けます。
3. 手順 2 で指定したものと同一の名前で、$VISUROOT/lib ディレクトリの Sun WorkShop Visual バイナリへのハードリンクを作成します。
4. シンボリックリンクの名前を使用して、ホームディレクトリにある .Xdefaults に次のように windows オプションを追加します。
Sun WorkShop Visual が Microsoft Windows モードで起動します。デフォルトでは Microsoft Windows モードとならないため、その他のユーザーが誤って Microsoft Windows モードの Sun WorkShop Visual を起動してしまうことがありません。
Microsoft Windows モードでの Sun WorkShop Visual ウィンドウは、通常のモードとは若干異なっています。主な外観の違いは、上部にあるツールバーに項目が 2 個 (同様にメニューが 2 個) 余分にあること、そしてウィジェットパレットにいくつかのウィジェットが含まれていないことです。以上 の違いのうち、後者については、「Microsoft Windows 準拠」で説明します。ここでは、前者を説明します。
Microsoft Windows 準拠トグルは、ツールバーおよびモジュールメニューにそれぞれ 1 つずつ存在します。両方とも同じ機能を持っています。
これらのトグルは、現在のデザインが Microsoft Windows 準拠であるかどうかを示します。 Microsoft Windows モード以外で作成したデザインを読み出す、あるいは準拠する階層の領域にカット&ペーストを行う場 合には、Microsoft Windows に準拠しない構造を作成してしまう可能性があります。
このような場合には、問題のある場所を示すメッセージが表示され、ツールバーお よびメニューバーにある Microsoft Windows 準拠トグルの設定が解除されます。設定が解除されている場合には、ツールバー・トグルは赤い×印を表示 します。デザインに適切な変更を加えた後で、どちらかのトグルを押すと、再度準拠の検査が行われます。 この時点で、デザインが Microsoft Windows 準拠である場合には、ツールバーにあるボタンが設定されます (赤い×印は消去されます) 。また、Microsoft Windows 準拠ではない場合には、問題のある場所を示すエラー・メッセージが表示され、トグルは設定解除されたま まとなります。
ツールバーおよび「コード生成」ダイアログ内にある様式メニューは、同一のもの です。このメニューは、生成するコードの様式 (Motif、Motif XP または Microsoft Windows) を指定します。このメニューは C++ コード生成にのみ影響します。
Microsoft Windows 様式でのデザイン生成の障害となる Microsoft Windows 非準拠の問題に加えて、デザインには Microsoft Windows 実装では何の効果も持たない多くの属性 (ボタン上のラベルの整列など) が存在します。これは、Microsoft Windows ツールキットがその概念を持たないためです。Sun WorkShop Visual ではアイコンと色の違いを使用して、このような無効な属性を示します。
1. アイコンによる表示
リソースパネル内では、Microsoft Windows
上で無効なリソースは×印のアイコンで示され、有効なリソースはチェック印のアイコンで示されます。
P>
2. 色による表示
Motif 様式では有効でも Microsoft Windows
様式では無効なリソース設定は、デフォルトでは、そのテキスト入力フィールドとオプションメニューがピ
ンク色で表示されます。
選択したウィジェットの変数名フィールドがピンク色1 で表示されている場合は、そのウィジェットに相当する Microsoft Windows オブジェクトは存在しないことを意味しています。たとえば、Microsoft Windows の場合、メニューバーはダイアログの属性の 1 つであり、メニューバーのオブジェクトというものは存在しません。したがって、Sun WorkShop Visual はメニューバーウィジェットに対しては変数名をピンクで表示することになります。
Sun WorkShop Visual は同様の方法で、あるリンクが Microsoft Windows コードでは再現できないことも示します。リンクについての詳細は、「リンクの使用」 を参照してください。
Motif および X ツールキットは Microsoft Windows ツールキットとほとんど類似性がありません。ツールキットの外観は類似していますが、実際の用途は大き く異なっています。このため、デザインに対して Microsoft Windows コードを生成するには、いくつかの制限が発生します。この制限は、Microsoft Windows モードの場合に発生します。 Microsoft Windows モードでは、制限に準じていないデザインは開発者自身がデザインを修正する必要があります (たとえば、既存のデザインを読めるようにするため)。そこで、Sun WorkShop Visual はそのデザインが Microsoft Windows に準拠しているかどうかを調べます。デザインが Microsoft Windows 準拠ではない場合には、Motif 様式の C++ コードだけが生成されます。
この項では、Microsoft Windows 様式のコードを生成するために Sun WorkShop Visual が課す制約について説明します。Microsoft Windows モードの場合、これらの制約に準拠していないデザインは作成はできません。
Motif と Microsoft Windows では、イベントの処理方法が異なっているため、クラスにできないウィジェットがいくつか存在します。Mi crosoft Windows の場合では、ある種のウィジェットに関連するイベントは常に、そのウィジェットを包含するクラスに送ら れます。その他のウィジェットは、Microsoft Windows メッセージを処理するためにクラスにする必要があります。以下に、これらの制約を示します。
Microsoft Windows に準拠していないデザインを読み込む際に最も起こりやすいエラーは、シェルが C++ クラスとして構成されていないということです。このエラーは修正しやすく、準拠不良ダイアログで自動的 に修正することができます。詳細は、本章 「準拠不良」を参照してください。
デザインが高度に構造的であり、C++ クラスを多用し、コールバック・メソッドが子ウィジェットの中に分散されているという場合には、構造的 なエラーはかなり複雑なものになります。この問題の起こる状況とその対応策を、次の例に示します。
ウィジェットにコールバック・メソッドがある場合、そのウィジェットを含むクラ スでメソッドが宣言されます。次の例では、Sun WorkShop Visual を Microsoft Windows モード以外で使用して、メニューバー (MBar_class) をクラスとして宣言し、ボタンにコールバック・メソッドを与えました。
このメソッドは MBar_class 中で宣言されます。次にこのデザインを Microsoft Windows モードで読み込むと、次のようなエラーメッセージが表示されます。これはメニューバーをクラスにするこ とができないためです。
コアリソースダイアログを使用してメニューバーのクラス定義を削除すると、次の ようなエラーメッセージが表示されます。
この場合はメソッドの宣言をメニューバーから削除し、シェルに追加してください 。メソッド宣言はフォームに追加することはできません。これは、フォームはメニューバーと同様、Micros oft Windows オブジェクトとして実現されないためです。
Sun WorkShop Visualは、上記のようにウィジェットクラス定義の削除を支援していますが、あるウィジェットをクラスに するかどうかによって、アプリケーションは大きな影響を受けます。構築するアプリケーションの構造を充 分に考慮した上で、クラス定義の指定または削除を実行するようにしてください。
ファイル選択ボックスは、ダイアログシェルまたは最上位シェルの子でなければな りません。Microsoft Windows の場合は、事前に定義されているファイル選択ダイアログでファイル選択が行われます。このダイアログは 、作業領域だけをその単一の子として含むことができ、メニューバーや (作業領域がマネージしていない) 他のボタンをサポートすることはできません。
以下に示すウィジェットは、Microsoft Windows で対応するコントロールを持っていないため、移植性のあるデザインに使用することはできません。
最後の 2 つのボタン以外はすべて、Windows コントロールとしてサポートされているダイアログテンプレートを使用して類似した機能を実装できます。
スケールウィジェットは、子コントロールをサポートすることができない Microsoft Windows スクロールバーコントロールとして実現されます。したがって、子を持つスケールウィジェットは、Micros oft Windows 準拠制約に違反することになります。
包含制御へメッセージを引き渡す手順の関係から、フレームとラジオボックス(フレ ームの子でない場合)は両方ともクラスでなければなりません。クラスとして指定されていないと、格納コ ントロールへのメッセージの受け渡しが行われず、メッセージがダイアログで処理されません。ただしシェ ルの子はクラスにはなれないことから、フレームとラジオボックスは、どちらもシェルの直接の子になるこ とはできません。
フレームの 2 番目の子は、ラベルウィジェットでなければなりません。このラベルウィジェットはフレームのタイトルに なります。Microsoft Windows におけるフレームコントロール (実際は CButton) は、タイトルの属性のみを持っています。タイトルとして別のコントロールを使用することはできません。 1 番目の子には、どのウィジェットでも使用できます。
Microsoft Windows は、自動スクロールをサポートしていません。したがって、Microsoft Windows モードの Sun WorkShop Visual では、自動スクロールオプションは使用できません。メインウィンドウウィジェットは、作業領域とメニュ ーバーのみを子として持つことができます。コマンドウィンドウやメッセージウィンドウはサポートされて いません。
Windows 準拠のデザインは、セパレータ、メインウィンドウ、オプションメニュー、またはメニューバーといった子 を持つ区画ウィンドウを含むことができません。子は定義またはインスタンスにすることはできません。
XmNlabelType リソースは、定義の構成要素であるウィジェットに対して、別のデザインでインスタンス化される時に明示 的に設定することはできません。つまり、定義中でボタンの XmNlabelType リソースが設定されていない場合、その定義が使用される時に XmNlabelType に PIXMAP を設定することはできません。これは、Microsoft Windows がビットマップを使用してボタンを実装する場合には、異なるクラス (Cbuttonではなく、CBitmapButton) を使用するためです。また、制約により、作成後に変数のクラスを変更することはできません。
同じ理由から、プルダウンメニューを持たないカスケードボタンが定義中にある場 合、そのインスタンスにはプルダウンを追加することはできません。
また、「構造の制約」で説明しているように、シェルの子は C++ クラスにはできないため、定義のルートウィジェットにはできません。シェルの子を定義にする場合は、シ ェルとその子の間に「ダミーの」コンテナウィジェットを追加してください。このようにすれば、このコン テナウィジェットをルートウィジェットとして、子を定義にすることができます。
さらに、サブクラス化されていないインスタンスに対し、追加されるメソッドの あるウィジェットも定義には使用できません。たとえば、ローカラム定義のインスタンスがあり、そのルー トウィジェット (つまりローカラム) は、その構造をクラスと設定していない場合を考えてみてください。Microsoft Windows モードではない場合には、ローカラムのインスタンスにボタンを追加して、その包含スコープ内 (たとえば、シェルクラス) で宣言されているメソッド・コールバックを指定することができます。これは、Microsoft Windows モードでは行うことができません。イベントはそれを包含するコントロール (この場合はローカラムを表わす CWnd) によって処理されなければならないからです。
定義内のウィジェットには名前を指定する必要があります。これは、Microsoft Windows で使用するウィジェットだけでなく、すべての C++ 定義にも必要なことです。
Microsoft Windows モード以外での Sun WorkShop Visual で作成したデザインを読み出すか、カット&ペーストを使用してデザインを作成すると Windows 非準拠になる可能性があります。Windows 非準拠になった場合は、準拠不良ダイアログが表示され、非準拠の原因となっているウィジェットが表示さ れます。
非準拠ウィジェットのリストをスクロールして、ウィジェットを選択することがで きます。ウィジェットを選択し、次のボタンの 1 つを押します。
この例では、どのように準拠不良が検出されるかを示します。図 11-7 に示されている階層では、ローカラムウィジェット rc_is_class がクラスに指定されています。
rc_is_class をカットし、フォームを消去してペーストを行う (つまり、 rc_is_class をシェルの子としてペーストする) と、Sun WorkShop Visual はデザインを非準拠として、図 11-8 に示される準拠不良ダイアログを表示します。このダイアログは、シェルの子がクラスになることができな いことを示します。
操作を続けることはできますが、 rc_is_class の構造が変更されない限り、デザインは Microsoft Windows 準拠にはなりません。ツールバーにある Microsoft Windows 準拠トグルに赤い×印が表示され、Microsoft Windows 準拠ではないことが表示されます。
Motif 様式では、リンクは事前定義されているコールバックです。Microsoft Windows では、ボタンのメッセージ・ハンドラによって呼び出される単純な大域関数として実装されています。ただ し、Microsoft Windows においてリンクを使用する場合には、いくつかの制約があります。これらの制約は、リンクに対してコード を生成するかどうかにのみ影響するものであり、デザインの準拠には影響しません。
リンクの宛て先として選択されているウィジェットが Microsoft Windows 上でオブジェクトとして割り当てられていない場合には、リンク編集ダイアログ内で追加ボタンがピンク色 になります。リンクを追加することはできますが、追加されたリンクは Motif でのみ有効で、Microsoft Windows コードには生成されません。これを示すために、リンクのリスト内にあるウィジェットはピンク色となりま す。Microsoft Windows オブジェクトに割り当てられるウィジェッの詳細は、「Motif ウィジェットの Microsoft Windows ウィジェットへの変換」を参照してください。
Motif マネージャウィジェットに相当するものは Microsoft Windows にはありません。フォームまたはローカラムなどのウィジェットは、Microsoft Windows では存在しません。クラスではないこれらのウィジェットが 1 つでもデザインに存在すると、生成されるコードでは無視されます。ウィジェットがクラスの場合は、Sun WorkShop Visual は、代わりにキャンバスを生成します。
デザインからダイアログテンプレートを生成する場合、ダイアログテンプレートは< BR> 「平坦」になるため、ほとんどのマネージャウィジェットは無視されます。ダイアログテンプレートでは、 Motif でよく使用される包含階層は使用しません。したがって、テンプレートファイルのデザインは平坦なものに なります。ウィジェットはサブコンテナから取り出されて、ダイアログの子になります。これによって、デ ザイン全体でシステムリソースを使用することができます。
Windows のリソースファイル (またはダイアログテンプレート) にメインアプリケーションコードと一緒にデザインを生成すると、Microsoft Windows IDE (Integrated Development Environment) を使用してデザインの配置を変更できます。ここで行なった変更内容は Sun WorkShop Visual に戻すことはできませんが、配置変更が必要になったときにすぐに変更するには便利な方法です。
ダイアログテンプレートを生成したくない場合は、Sun WorkShop Visual は生成の際の大きさおよび位置の絶対値をコード中に生成します。したがって、たとえば幅 100 ピクセルで高さ 30 ピクセルのプッシュボタンが (10, 200) の位置に配置されている際に、このボタンに対してユーザーが x, y、幅および高さのリソースを明示的に設定しなかった場合でも、それらのリソースは Motif ツールキットによって自動的に計算され、その明示的な値が Microsoft Windows コード内で使用されます。これには、Motif で対応しているダイアログに非常によく似た Microsoft Windows ダイアログが生成されるという利点があります。
Sun WorkShop Visual は、Microsoft Windows コントロールに対して絶対サイズを生成するため、ダイアログのサイズは、その中に表示されるテキストに どんなフォントを使用しても適切でなければなりません。そのためには、デザイン過程でも、ダイアログを 実際に表示する際に使うフォントと類似したサイズのフォントを使用することをお勧めします。これには 2 つの方法があります。
1. コントロールに対して XmNfontList
リソースを設定、あるいはシェルで適切なフォントリソースを設定して、コントロールに特定のサイズのフ
ォントを強制的に使用させる。
ダイアログは類似した大きさになります。
2. Sun WorkShop Visual が Microsoft Windows
で使用されるデフォルトのフォントに近いフォントを使用してデザイン中のウィンドウを表示するようにリ
ソースを設定する。
結果として Sun WorkShop Visual はそのフォントに適した絶対的なサイズを生成します。Motif
コードは、通常の方法でデフォルトフォントを使用します。
Sun WorkShop Visual に、Microsoft Windows
のデザインには特定のフォントを使用させるためには、ユーザーのホームディレクトリ中にある
.Xdefaults で、リソースを適切なフォントに設定してください。
visu*dialog.labelFontList:\
-adobe-helvetica-medium-r-normal-*-14-*-*-*-*-77-iso8859-1
visu*dialog.buttonFontList:\
-adobe-helvetica-medium-r-normal-*-14-*-*-*-*-77-iso8859-1
visu*dialog.textFontList:\
-adobe-helvetica-medium-r-normal-*-14-*-*-*-*-77-iso8859-1
ご使用の Microsoft Windows システムによって適切なフォントは異なります。適切なフォントの決定にあたっては、サイズと平均的な幅 の値が重要になります。
Microsoft Windows モードでは、ユーザーによるダイアログのサイズ変更動作を実現するため、Sun WorkShop Visual は、OnSize メッセージ・ハンドラを生成します。Sun WorkShop Visual は、Motif のジオメトリ管理を正確に再現しようとはせず、特定のマネージャウィジェットの動作に類似したサイズ変 更動作を行うハンドラを生成します。以下がこれらのマネージャウィジェットです。
これらのマネージャは、サイズ変更動作を生成するためには、クラスである必要は ありません。Sun WorkShop Visual は、それを包含するクラスに対し、そのすべての子孫ウィジェットを扱うハンドラを生成します。ユーザー がたとえばサブクラスを介して独自のハンドラを提供する場合には、コアリソース・ダイアログのコード生 成ページにある「MFC の OnSize ハンドラ」トグルの設定を解除することにより、サイズ変更ハンドラの生成を抑制することができます。図 11-9 を参照してください。
Microsoft Windows コードにフォントを生成するためには、フォントオブジェクトを使用する必要があります。これは、フォン トの Microsoft Windows 上での持続性を保証するためです。これは、フォントオブジェクトを使用することによってのみ保証できま す。
Sun WorkShop Visual では、フォント選択ダイアログ内のフォントリストから項目が選択された場合には、適用ボタンをピンク色 にするといった視覚的な警告手段を提供しています。ただし、フォントオブジェクトのリストから項目が選 択された場合には、適用ボタンはピンク色ではなくなります。
Sun WorkShop Visual で作成されたピックスマップ・オブジェクトは、Microsoft Windows ビットマップまたはアイコンに変換されます (オブジェクトがボタンであるか、ラベルであるかによります) 。この変換は、Microsoft Windows 用リソースファイルの生成の際、自動的に行われます。X モノクロームビットマップは、Microsoft Windows 変換できません。
「コード生成」ダイアログから「Microsoft Windows リソース」を選択した場合には、Sun WorkShop Visual は、ユーザーが作成した各ピックスマップに対してリソースファイルおよびビットマップまたはアイコンフ ァイルが作成されることを通知します。ビットマップファイルには接尾辞 .bmp が、また、アイコンファイルには接尾辞 .ico が付けられます。Microsoft Windows に対しては、ファイルにピックスマップを保存する必要はありません。Motif モードで使用する場合は、保存してください。Microsoft Windows モードでは、アイコンは常に 32 x 32 ピクセルで表示されます。
Microsoft Windows のオブジェクトに割り当てられるウィジェットの背景および前景色は、自由に設定することができます。こ れらの色は、RGB (赤、緑、青) の値を使用して Microsoft Windows コードに生成されます。Microsoft Windows では、通常、X/Motif ほど色が豊富ではありません。このため、2 種類のプラットフォーム間では同一の色に見えない場合があります。ただし、デフォルトでは、Microsoft Windows 95 の「見た目と使い心地」の色が使用されます。
Sun WorkShop Visual は、デフォルトの Motif セットに加えて、Xt ツールキットのウィジェットをサポートするように拡張できます。ここではデフォルトで用意されている以 外のウィジェットを、「ユーザー定義ウィジェット」または「サン以外のウィジェット」と呼びます。この 項目については、第 23 章「ユーザー定義ウィジェット」で詳細に説明しています。新たに追加したウィジェットは、Sun WorkShop Visual ウィジェットパレットに表示され、事前に定義された Motif のウィジェットと同じように使用できます。
Microsoft Windows モードでは、現時点ではサン以外のウィジェットに対しての特別なサポートはありませんが、Sun WorkShop Visual の C++ モデルの持つ柔軟性のため、サン以外のウィジェットも使用することができます。
Sun WorkShop Visual は、サン以外のウィジェットをあたかもその派生したクラスのインスタンスであるかのように扱います。た とえば、XmPushButton からサン以外のウィジェットが派生している場合、Sun WorkShop Visual は、そのウィジェットをあたかも XmPushButton であるかのようにデザインに追加します。次に、Motif XP での XmPushButton の実装方法にあわせて、CButton クラスにもとづく Motif XP コードを生成してサン以外のウィジェットのインスタンスを生成します。これによって Microsoft Windows コードは、プッシュボタンを使用した場合とまったく同じになります。
上記の例で使用している XmPushButton クラスは Motif XP によってサポートされています。しかし、サン以外のウィジェットが Motif XP によってサポートされていないクラスから派生している場合は、Sun WorkShop Visual はそのウィジェットを扱うことができず、ウィジェットのコードも生成しません。この場合、次の「サン以 外のウィジェットに対する Sun WorkShop Visual の構成」で説明する方法を使用してください。
特定のサン以外のウィジェット (上記を参照) に対するSun WorkShop Visual のデフォルト動作に満足いかない場合は、C++ モデルの柔軟性を使用して Sun WorkShop Visual の動作を拡張できます。
1. サン以外のウィジェットから Windows コントロールへの明確な対応関係を Windows コントロール (組み込み MFC クラスでも別のサン以外のコンポーネントでも可) に指定します。たとえば、サン以外のウィジェットの多くが ComboBox ウィジェットを含んでいますが、これは明らかに組み込み MFC クラスである CComboBox に対応しています。
2. Sun WorkShop Visual にクラスの名前を指定します。コアリソースパネルの「コード生成」ページで、選択したサン以外のウィジ ェットに対して生成される C++ クラス構造を指定します。Sun WorkShop Visual は Motif 構成要素に対して独自の対応関係を使用してこの「コード生成」ページに記入しますが、サン以外のウィジ ェットに対する処理方法を常に用意できているわけではありません。処理方法が不明な場合は、単純に基本 のキャンバスを生成します。この場合は、Sun WorkShop Visual が割り当てた対応関係を、ユーザー自身が適切なものに修正する必要があります。Sun WorkShop Visual は、修正されたとおりにコードを生成します。つまり、MFC コードとして生成されるオブジェクトは正しいものになります。
UNIX では、ユーザーは見せかけの (ダミー) クラスを組み込む必要があります。その結果、必要に応じて、純粋な Motif C++ または Motif XP のいずれかにコンパイルできます。追加が必要なコードを以下に示します。
#define MY_BASE_CLASS xd_XtWidget_c /* Sun WorkShop Visual の
/* Motif XP C++ コード (厳密な MFC API を使用する UNIX C++) */
#define MY_BASE_CLASS CWnd /* Motif XP の「MFC」基底コントロール
/* Windows C++ コード (本来の MFC) */
#define MY_BASE_CLASS CComboBox /* MFC コントロールクラスの実
#if defined(XD_MOTIF_MFC) || defined(XD_MOTIF)
Motif XP の生成では、Motif XP
ライブラリを拡張することもできます。詳細は、
「Motif XP の強化」
を参照してください。
サン以外のウィジェットで、認識できないウィジェットの場合、どの Motif リソースがどの MFC リソースに対応するべきか Sun WorkShop Visual は判断できません。このようなウィジェットの場合、リソースに対するコードを手動で追加する必要があり ます。以下に、その方法をいくつか示します。
1. すべてのサン以外のウィジェットのリソースに緩い結合を設定します。これにより、サン以外のウィジェッ トのリソースが X リソースファイルに移動し、Sun WorkShop Visual で保持されるため、X 上で動作するようになります。次に、MFC リソースも X 上で動作できるように MFC リソースファイルを手動で編集します。緩い結合の作成方法と使用方法についての詳細は、「緩い結合」を参照してください。
2. リソースとコードオプションを正しく設定して UNIX 上でコードを生成し、サン以外のウィジェットに対してはコード中にリソースを生成しないようにします。 そして、1 と同じように MFC リソースファイルを手動で編集します。
3. コードプレリュードを指定して必要なリソースを追加します。コードプレリュードには任意のものを指定で きます。たとえば、以下に示す内容をマネージの前プレリュードとして指定することもできます (my_text をクラスと仮定)。
XtVaSetValues(my_text->xd_rootwidget(), XmNvalue, "Hello", 0) ;
#if defined(XD_MOTIF_MFC) || defined(XD_WINDOWS_MFC)
「メソッド宣言」ダイアログは、Microsoft Windows モードの場合には「Microsoft Windows MFC」というラベルが付いているトグルボタンが存在します。
このトグルは、Microsoft Windows コードを生成する際に、包含するクラスのクラス構造でメソッドが宣言されているかどうかを示すために使 用されます。Motif のコードを生成する場合、メソッドは包含するクラスで宣言されます。包含するクラスとは、(明示的、あ るいは自動的に) その構造がクラスに設定されている、最も近い祖先です。
これは、 Microsoft Windows コードのスタブにメソッドが現れるかどうかを示すトグルではありません。その表示は、「コールバック」 ダイアログで行われます。そのダイアログでアスタリスク (*) が表示されているコールバック・メソッドは、Microsoft Windows のスタブファイルに生成されません。通常は Sun WorkShop Visual が提供するデフォルトを使用する場合でも、「Microsoft Windows MFC」トグルを使用すると、メソッド宣言を制御することができます。選択したクラスでメソッドを宣言す る、あるいはユーザー独自のクラスでメソッドを宣言するには、メソッド宣言ダイアログを使用します。メ ソッドは必ずどこかで宣言する必要があります。
「コールバック」ダイアログでメソッドコールバックを追加する際に、そのメソッ ドが宣言されていない場合、Sun WorkShop Visual は包含するクラス中にこれを宣言します。包含するクラスの中でメソッドを宣言したくない場合は、「メソ ッド宣言」ダイアログを使用して「Microsoft Windows MFC」トグルをオフに設定してください。
描画領域がスクロールウィンドウ、メインウィンドウまたはシェルの子ではない場 合は、基本の CWnd クラスとして作成されます。その他の場合は、Microsoft Windows コード生成に対しては無視されます。詳細については、「Motif ウィジェットの Microsoft Windows ウィジェットへの変換」を参照してください。
Motif XP クラスライブラリは、描画サポートを一切含んでいません。描画サポートが必要な場合、プラットフォーム に固有のコードを書かなければなりません。ただし、Sun WorkShop Visual では、Motif 様式および Microsoft Windows メッセージ・ハンドラに対してのみデフォルトで宣言されるコールバック・メソッドを追加することができ ます。Microsoft Windows モードの場合は、Sun WorkShop Visual は複数のトグルボタンを描画領域リソースパネルに追加します。これらは、生成コードに Microsoft Windows メッセージ・ハンドラを追加するために使用できます。
たとえば、図 11-11 のパネルで OnRButtonDown トグルを選択すると、以下のスタブがユーザーのコールバック・スタブファイルに追加されます。
afx_msg void scrolled_win_c::OnRButtonDown( UINT nFlags, CPoint point )
Microsoft Windows においては、 afx_msg は擬似キーワードであることに注意してください。以下に示す行は、C++ 外部宣言ファイルに追加されます。
Sun WorkShop Visual は、MFC C++ 様式ではアプリケーションを表わすために、CWinApp クラスのインスタンスを生成します。このクラスを構成するには、「モジュール」メニューから表示される 「アプリケーション・クラス」のダイアログを使用します。図 11-12 にダイアログを示します。
PC 上のファイル名は、ドットの前に 8 バイト以下、ドットの後に 3 バイト以下の合計 12 バイト (ドットを含む) に制限されています。2 種類のプラットフォーム間でファイルを共有する場合には、この制限は Microsoft Motif コードを生成する際にも適用されます。また、MS-DOS および Microsoft Windows は大文字小文字の区別を行いません。したがって、ファイル名を区別するために大文字と小文字で違いを付 けないようにしてください。
上記の制限は、ピックスマップ・オブジェクトを命名する際にも適用されます。ピ ックスマップを作成した後で、Sun WorkShop Visual に Microsoft Windows リソースファイルを生成するように要求すると、Sun WorkShop Visual はピックスマップエディタに指定した名前を使用して、自動的に Microsoft Windows ビットマップおよびアイコンを別々のファイルに生成します。したがって、8 バイトを超える名前を指定した場合には、Microsoft Windows で問題が生じることになります。
異なるコンパイラには、ファイル名の拡張子に関してさまざまな制約があります。 接尾辞 .cxx は、一般的に許容されているようです。また、 .cpp は多くのコンパイラで許容されています。さらに、コンパイルシステムによっては、 .C および .c++ を受容するものもあります。Visual C++ では、C++コードを含むファイルに対して .c が指定された場合には、受け入れられません。
「コード生成」ダイアログのデフォルトのフィルタを変更する方法については、
「ファイル名フィルタの設定」を参照してください。
コードを生成する場合に、いくつかの点について考慮しておく必要があります。詳 細は以下の各項で説明しますが、各項の概要は次のとおりです
1. ダイアログテンプレートの生成
Microsoft Windows
リソースファイルとしてダイアログを生成する方法について説明します。これによって、Windows
環境でより簡単に操作できるようになります。
2. 拡張 MFC
生成した Windows アプリケーションで MFC 4 (およびそれ以上) の 3D
の見た目と使い心地を使用できるようにする方法について説明します。
3. プロジェクトファイル
Sun WorkShop Visual が生成する Visual C++ プロジェクトファイルについて説明します。
4. 保存ファイルとコードファイルの同期
保存ファイルと生成したコードファイルの同期を保つ方法について説明します。
5. ダイアログの点滅
MFC コードの生成時にダイアログがリアライズ (実体化) される (すなわち表示される)
ことを示す警告について説明します。
6. 日本語フォントの使用
日本語テキストを含む MFC コードを生成する場合の処理方法について説明します。
MFC に対してコードを生成する場合、「コードオプション」ダイアログ
(「コード生成」ダイアログの下部にある「オプション」ボタンを押すと表示される)
に「リソースとして生成」トグルが表示されます (図
11-13 を参照)。このトグルがオンになっていると、Sun WorkShop Visual
はデザインにダイアログテンプレートとしてダイアログを生成します。ダイアログテンプレートは、ダイア
ログを記述する Microsoft Windows のリソースファイルです。Sun WorkShop Visual
は、ダイアログテンプレートからウィジェットを取り出してダイアログを制御する MFC
コードをいくつか生成します。その結果、完全なアプリケーションが生成されます。「リソースとして生成
」トグルがオフになっていると、デザインに対して通常の MFC
が生成されます。デフォルトでは、このトグルはオンになっています。
1. フォント設定などのシステムのデフォルトのリソースを使用できます。通常の MFC では使用できません。
2. Microsoft Windows IDE を使用してダイアログの配置を簡単に変更できます。ただし、変更した配置内容を Sun WorkShop Visual に戻すことはできません。
リソースファイル (またはダイアログテンプレート) が生成されるデザインはダイアログをベースにしています。つまり、主要な「フレーム」ウィンドウはあり ません。そのため、Motif と Microsoft Windows の表示内容は非常に似たものになります。
「コードオプション」ダイアログの「MFC 4.X 拡張」トグルを使用すると、Sun WorkShop Visual は MFC の拡張された作成関数を使用するコードを生成し、それによってアプリケーションの見た目と使い心地が 3D (立体的) になります。
「MFC 4.X 拡張」トグルをオンにすると、ビットマップをラベルに、アイコンをボタンに対応付けることもできます。 その結果、立体表示される (3D) ボタンとイメージを作成できます。
このように処理されるイメージのサイズは自然に確定されます。そのため、Motif デザインの表現は明確なものになります。
拡張 MFC コードは、「リソースとして生成」トグルを使用しなくても生成できます。
Microsoft Windows 用にMFC コードを生成する場合、Microsoft Visual C++ で使用するプロジェクトファイルも「コード生成」ダイアログで指定したベース名を使用して生成されます 。これらのファイルは次のとおりです ( <generate_filename> は、「コード生成」ダイアログで指定したベース名を示します)。
メインプロジェクトファイル (接尾辞「dsw」が付いている) を Microsoft Visual C++ で開いてください。これらのプロジェクトファイルは、Visual C++ のバージョン 5 以降で使用するのに適しています。
Sun WorkShop Visual では、定義の保存ファイル中にウィジェット ID 番号を含める必要があります。そうすることで名前が付けられていない構成要素の配置を間接的に変更して も正しいコードを生成することが可能となります。ただし、コードが生成される前に、デザイン内でウィジ ェット ID に影響するような変更 (リセットなど) が行われた場合には、問題が生じる可能性があります。Sun WorkShop Visual は、このような同期の乱れを検出すると、ファイルを保管するようメッセージを表示します。
Sun WorkShop Visual が正確に配置情報を生成することができるように、ダイアログはリアライズ (実体化) される必要があります。Sun WorkShop Visual は、Microsoft Windows コードが生成される際に、リアライズ (実体化) されていないダイアログを自動的に表示して、すぐに非表示にします。ディスプレイ上でダイアログが瞬間 的に表示されることがあるのは、このためです。
Sun WorkShop Visual で生成した Microsoft Foundation Class (MFC) コードが日本語テキストを適切に扱うためには、そのコードを Microsoft Windows 上でコンパイルする前に特別な処理をする必要があります。この処理は、Sun WorkShop Visual 付属のフィルタユーティリティ、 visutosj で行います。
visutosj は、MFC コード中で使用されるテキスト文字列を EUC から Shift-JIS に変換し、MFC の CFont 作成 (create) メソッドの中の DEFAULT_CHRSET の値を SHIFTJIS_CHARSET に変更します。
引数の意味は以下のとおりです。Microsoft Windows モードでも Sun WorkShop Visual に適用されるアプリケーションリソースは、数多く存在します。これらのリソースの 1 つに、Sun WorkShop Visual をデフォルトで Microsoft Windows モードで実行するかどうかを示す、 -windows オプションがあります。このリソースについては、「Microsoft Windows モードでの起動」を参照してください。
Sun WorkShop Visual は、Microsoft Windows のコードを生成する際にデフォルトで、各行の改行記号の前にキャリッジリターンとして Ctrl-M を追加します。この Ctrl-M は MS-DOS で使用するため、自身で作成したファイルを変換プログラムで処理する際に必要になります。各行の末尾に Ctrl-M を追加したくない場合は、Sun WorkShop Visual のリソースファイルを以下のように設定してください。
デフォルトでは、Sun WorkShop Visual はリソースパネルにあるフィールド、またはボタンや他のテキストフィールドが Microsoft Windows に適用できない場合には、その要素をピンク色で表示して、適用不可能であることが示されます。この色は 、以下に示す Sun WorkShop Visual アプリケーションリソースファイルの行を変更することで、別の色にできます。
visu.mfcTextWarningBackground:#ecc9c9eacdda
上記の例は、デフォルトの内容 (ピンク色) を示します。この大きな数値の部分は、よりわかりやすい、色の名前に変更することもできます。
「コード生成」ダイアログのファイルを入力するテキストフィールドには、デフォ ルトのファイル名フィルタが使用されています。このファイル名フィルタは、アプリケーションのリソース ファイルを変更することで、別のものにできます。以下の行を検索してください。
これらは、Motif コード (Motif および Motif XP の両方) 生成のためのデフォルトの内容です。Microsoft Windows コード生成のためには、次の 2つのファイル名フィルタがあります。
2 種類のプラットフォーム間でコードを共有する場合には、2 つの異なる様式についてファイル名フィルタが同じになるようにします。両方のプラットフォームに互換性 を持つファイル名についての注意事項については、「ファイル名」を参照してください。