Chapter 10:
ウィンドウを持ったオブジェクト

Max環境 では、独自のウィンドウを持ち、オペレーティングシステムのイベント処理のできるオブジェクトを作ることができます。通常、これらのツールはユーザインターフェイスを書く仕事を容易にしてくれます。また、これらの管理も、パッチャーウィンドウ内に置くユーザインターフェイスオブジェクトを書くよりも多少シンプルです。

ウィンドウがMax オブジェクトが内部に持っているデータの「エディタ」である場合、オブジェクトが dblclick メッセージを受け取ったときにそのウィンドウを開かなければなりません(Max はノーマルオブジェクトに対して、シングルクリックメッセージを送信しません)。

Max は様々なオペレーティングシステムの様々なイベントに応答して、エクスターナルオブジェクトにメッセージを送信します。これらのメッセージについては、この章で後ほど詳しく説明します。このメッセージはMacintosh と Windows XP の両方のプラットフォームで動作します。これは、ウィンドウを持ったエクスターナルをクロスプラットフォームで開発するための手助けとなります

Macintosh 上では、オブジェクトは window メッセージへの応答が可能です。これは、Max が、内部にある個々のMacintosh ウィンドウレコードにそれへの参照を組み込むためです。Max はウィンドウ内でMacintosh イベントを感知すると、そのウィンドウの「持ち主」であるオブジェクトに適切なメッセージを送信します。

Windows XP 上では、ウィンドウを動作させるために2つの選択肢があります。QuickTime SDK for Windows を使うことによって、Macintosh スタイルのQuickDraw API を用いて描画することができるようになります。あるいは、Max からウィンドウのためのHWNDを取り出すことによって、ネイティブなWin32 API を呼び出し、これを使用することができます。最も柔軟に行なうためには、WINDPROC のサブクラスであるこのHWNDを使って、Max が提供するデフォルトの動作をオーバーライドすることができます。この方法についての詳細は、この章の終わりで説明します。

Max で独自のウィンドウを持つオブジェクトを動作させるためには、2つのことを知っておく必要があります。

  • Max の関数セットを使うことによってウィンドウはMax の環境内で存在することができます。


  • 特別なウィンドウメッセージのセットは、ウィンドウが開いているときにオブジェクトに送られます。そこで、これらのメッセージに応答するメソッドを書き、ウィンドウ内に描画したり、マウスの処理を行なったりするような動作を実行させます。初期化時には、addmess を使って、これらのメソッドをクラスにインストールします。すべてのウィンドウメソッドは特別なアーギュメントリストを使わなければなりません。それは

    A_CANT, 0

    です。これは、Max がメッセージのアーギュメントの型をチェックできない、そしてチェックすべきでないということを指定します。(これらのメッセージは、型チェックを行われる t_atom として渡されることがないためです)

ウィンドウメッセージは、割り込みレベルでオブジェクトに送られることは決してありません。これは覚えておいて下さい。

基本的なウィンドウ構造体は t_wind と呼ばれるものです。これらの1つは、wind_new を呼び出すことによって、あなたの生成関数で(または、ウィンドウをオープンしたいときに)作ります。wind_new に渡される、t_wind 構造体の定義とフラグは、インクルードファイル ext_wind.h で宣言されています。ウィンドウが作られ、表示されると、その持ち主であるMax オブジェクトにメッセージが送られるようになります。

ウィンドウシステムから送られるメッセージのリストは、次の項で示しています。個々のケースにおいて、現在のGrafPort をウィンドウにセットする呼び出しの内部ですべての動作を組み立てなければなりません。そして、描画が完了したときにそれをリストアしなければなりません。Macintosh では、wind_setport を使ってポートをセットし、windo_restoreport を使って古いポートをリストアします。Windows XP では、QuickTime SDK を使う場合、Max にエクスポートされた関数 XQT_wind_wetport を使ってポートをセットし、ポートのリストアには、 qtmlclient.lib からリンクされた XQT_SetPort を使います。

下の例は wind_new の呼び出しで返される t_windopub へのポインタがオブジェクトの m_winds フィールドに保存されているものと仮定しています。

Macintosh 上、あるいはネイティブな WIN32 を使った場合の描画ルーチンは次のようになります。

GrafPtr sp; if (sp == wind_setport(myobject->m_wind)) { /* ここで何かを描画します */ wind_restorepot(sp) }

Windows XP で、QuickTime SDK を使った場合は、次のようになります。

if (sp = XQT_wind_setport(myobject->m_wind)) { /* ここで何かを描画します */ XQT_SetPort(sp); }

ウィンドウメッセージ

Max オブジェクトでウィンドウを実装するために、次のようなメッセージが提供されています。重要であると思われる順に紹介します。

click

     
  click メッセージは、ウィンドウでマウスダウン(mouse-down)イベントが生じた場合に送られます。
     
バインディング
     
  addmess (myobject_click, "click", A_CANT, 0);
   
宣言
   
  void myobject_click (t_myobject *x, Point pt, short dblClick, short modifiers);
     
  pt ローカル座標での、マウスクリックの位置
  dblClick ダブルクリックなら0以外、そうでなければ0
  modifiers このマウスダウンイベントによって GetNextEvent から返されるMacOS イベントレコードの modifiers フィールド。shift,option,command,capslock,control キーが押されていたかどうかを示します。
     
 

click メソッドでは、指定された場所でマウスダウンイベントを処理しなければなりません。関数 wind_defaultscroll は、オブジェクトがスクロールバーを含むイベントを処理する場合の手助けとなります。また、はマウスのドラッグ操作を処理するためには、wind_drag を使われなければなりません。これらの2つの関数については後述します。


update

     
  update メッセージは、ウィンドウが再描画された場合に送られます。
     
バインディング
     
  addmess (myobject_update, "update", A_CANT, 0);
   
宣言
   
  void myobject_update (t_myobject *x);
     
 

このメッセージは、ウィンドウの内容を描画することによって生じる update イベントに応答する必要があることを示します。ウィンドウにスクロールバーやグロウアイコンがある場合、Maxはスクロールバーの描画(Max はウィンドウ上で DrawContols を呼び出します)や、ウィンドウのグロウアイコンの処理を引き受けてくれます。また、ウィンドウ内部にある、影響を受ける領域の消去も行なってくれます。これは覚えておいて下さい。


key

     
  key メッセージは、ウィンドウが最前面に表示されていて、ユーザがキーを押した場合に送られます。
     
バインディング
     
  addmess (myobject_key, "key", A_CANT, 0);
   
宣言
   
  void myobject_key (t_myobject *x, short key, short modifiers short keycode);
     
  key 押されたキーのアスキーコード
  modifiers

このキーイベントによって、GetNextEvent から返されるMacOS イベントレコードの modifiers フィールド。shift,option,command,capslock,control キーが押されていたかどうかを示します。

  keycode 押されたキーの、Macintosh キーコード
     
 

このメッセージは、キーダウン、またはオートキーイベントに応答することを可能にします。Windows XP では、キーイベントは Macintosh の 修飾キーとキーコードに読みかえられます。詳細は、関連した Macintosh の開発ドキュメントを参照して下さい。


cursor

     
  cursor メッセージは、カーソルの調節や、ウィンドウ内にマウスがある場合にその位置を反映して表示させることを可能にします。
     
バインディング
     
  addmess (myobject_cursor, "cursor", A_CANT, 0);
   
宣言
   
  void myobject_cursor (t_myobject *x, Point pt,short modifiers, short active);
     
  pt ローカル座標での、現在のマウスの位置
  modifiers このキーイベントによって、GetNextEventから返されるMacOS イベントレコードの modifiers フィールド。shift,option,command,capslock,control キーが押されていたかどうかを示します
  active ウィンドウがアクティブ(最前面)でなければ0、アクティブならば0以外の値になります。
     
 

cursor メソッドは、カーソルがウィンドウ上にある間は、繰り返し呼び出されます。マウスの位置はローカル座標として pt に渡されます。また、修飾キーの状態やウィンドウのアクティブ/非アクティブの状態は、 modifiers および active にそれぞれ報告されます。一般的に、ウィンドウはカーソルがテキストエディットのフィールドのような特定の場所にある場合に、その位置を調節するために cursor メソッドを使います。カーソルをセットするためには、wind_setcursor を使うことができます。

パッチャーはまた、ウィンドウ内でテキストが編集されている場合にTEIdleを呼び出したり、マウスがインレットやアウトレットの上に来たときにそれをハイライトさせたりするために cursor メソッドを利用しています。cursor 関数は、マウスが押し下げられ、wind_drag を呼び出している間でも呼び出しを受けるという点に注意して下さい。


cursorout

     
  cursorout メッセージは、カーソルがウィンドウの境界の長方形の領域から離れた場合に応答して、カーソルやウィンドウの表示を調節することを可能にします。
     
バインディング
     
  addmess (myobject_cursor, "cursorout", A_CANT, 0);
   
宣言
   
  void myobject_cursorout (t_myobject *x, Point pt, short modifiers, short active);
     
  pt ウィンドウを離れた時点でのマウス位置のローカル座標
  modifiers このマウスダウンイベントによって、GetNextEvent から返されるMacOS イベントレコードの modifiers フィールド。shift,option,command,capslock,control キーが押されていたかどうかを示します
  active ウィンドウがアクティブ(最前面)でなければ0、アクティブならば0以外の値になります。
     
 

cursolout メソッドはカーソルがウィンドウの中から外へ出た時に一度呼び出されます。ローカル座標で表されるマウス位置が pt に渡され、修飾キーの状態とウィンドウのアクティブ/非アクティブの状態が、それぞれ modifiersactive を通して報告されます。一般的に、ウィンドウは、カーソルがウィンドウの境界から出たときに cursolout メソッドを使ってそれを調整します。カーソルは wind_setcursol を使ってセットすることができます。


widle

     
  widdle メッセージによって、カーソルがアイドルタイムの間にオブジェクトのウィンドウ内を移動したかとうかを知ることができます。
     
バインディング
     
  addmess (myobject_widle, "widle", A_CANT, 0);
   
宣言
   
  void myobject_widle (t_myobject *x);
     
 

cursor メッセージにメッセージがバインドされている場合、これを使う必要はないでしょう。


activate

     
  説明
     
バインディング
     
  activate メッセージを利用すると、ウィンドウが最前面になったときや、最前面でなくなったときに、ウィンドウの外観を変えることが可能になります。
   
宣言
   
  void myobject_activate (t_myobject *x, short active);
     
  active ウィンドウがアクティブになれば0以外、アクティブでなくなれば0になります。
     
 

一般的な activate イベントへの応答は active の値に応じて、選択している何かをハイライトしたり、ハイライトを止めたりすることです。Max はスクロールバーの使用可/不可を受け持ちます。


close

     
  ウィンドウを閉じなければならない場合に、close メッセージが送られます。
     
バインディング
     
  addmess (myobject_close, "close", A_CANT, 0);
   
宣言
   
  void myobject_close (t_myobject *x);
     
 

このメッセージはユーザがウィンドウを閉じたい場合にオブジェクトに送られます。ウィンドウを閉じることによってオブジェクトのデータが破壊されないようにオブジェクトを書いて下さい。それによって、ユーザは何かを失うのではないかという心配をせずにウィンドウを閉じることができます。後々、wind_new で他のウィンドウを作成するつもりならば、freeobject(これは CloseWindow を実行します)を呼び出して、ウィンドウのメモリを開放します。そうでない場合、次のように t_syswind に対してsyswindow_hide を使う必要があります。。

syswindow_hide(wind_syswind(myobject->m_wind)));

Max は単に、ユーザがウィンドウを閉じたがっているということを報告するに過ぎません。このメッセージに対して、好きな方法で応答することができますが、もしウィンドウを開いたままにしておくと、ユーザが終了するときに問題が起きるかもしれません。


scroll

     
  スクロールバーが動かされて、ウィンドウの内容をスクロールする必要がある場合に、scroll メッセージが送られます。
     
バインディング
     
  addmess (myobject_scroll, "scroll", A_CANT, 0);
   
宣言
   
  void myobject_scroll (myObject *x);
     
 

Max はユーザがスクロールバーを動かすと、このルーチンを呼び出します。このとき、t_wind の w_xoffset(水平方向)と w_yoffset(垂直方向)フィールドをチェックして、以前に保存した値と比較し、それに従ってウィンドウをスクロールする必要があります。


vis and invis

     
  vis メッセージはウィンドウが表示されるようになった瞬間に送られ、invis メッセージはウィンドウが非表示になった瞬間に送られます。
     
バインディング
     
 

addmess (myobject_vis, "vis", A_CANT, 0);
addmess (myobject_invis, "invis", A_CANT, 0) ;

   
宣言
   
 

void myobject_vis (t_myobject *x);
void myobject_invis (t_myobject *x);

     
 

これらのメッセージに応答して、適当な動作を行なうことができます。例えば、vis メッセージを受け取ったときにウィンドウのユーザインターフェイスを初期化することなどがあります。


oksize

     
  oksize メッセージは、ウィンドウの新しいサイズを確認するために送られます。
     
バインディング
     
  addmess (myobject_oksize, "oksize", A_CANT, 0);
   
宣言
   
  void myObject_oksize (t_myobject *x, short *hsize,short *vsize);
     
  hsize 提示されたウィンドウの横幅のサイズ(水平サイズ)。横幅を修正しようと思う場合は、新しいhsizeの値を返します。そうでない場合は、そのまま変更せずにおきます。
  vsize 提示されたウィンドウの高さのサイズ(垂直サイズ)。高さを修正しようと思う場合は、新しいvsizeの値を返します。そうでない場合は、そのまま変更せずにおきます。
     
 

oksize メソッドによって、実際にウィンドウのサイズが変更される前に、サイズをチェックし、できるかぎりの調整を行なうことができます。(下記の wsize メッセージを参照)。提示されたサイズはhsizevsize に渡されます。これらを好きな値にセットすることができます。ウィンドウが「セル」を持っていて、ウィンドウのサイズがセルの数の正確な倍数であって欲しい場合には、oksize メッセージを利用したいと思うでしょう。下で述べるように、明らかに、oksize メッセージは wsize メッセージより前に送られます。


wsize

     
  ウィンドウのサイズが変更されたときに、wsize メッセージが送られます。
     
バインディング
     
  addmess (myobject_wsize, "wsize", A_CANT, 0);
   
宣言
   
  void myObject_wsize (t_myobject *x, short hsize,short vsize);
     
  hsize ウィンドウの新しい横幅(水平サイズ)
  vsize ウィンドウの新しい高さ(垂直サイズ)
     
 

ユーザがウィンドウのサイズを変更したときに、wsize メッセージを通して報告されます。新しいウィンドウの大きさは、hsizevsise として渡されます。ウィンドウにスクロールバーがある場合、それらを動かし、サイズ変更し、再描画する必要があります。


otclick

     
  ユーザがウィンドウのタイトルバー上で [option]+クリックしたときに、otclickメッセージが送られます。
     
バインディング
     
  addmess (myobject_otclick, "otclick", A_CANT, 0);
   
宣言
   
  void myObject_otclick (MyObject *x);
     
 

otclick は 「Option-Title-Click」を表しています。例えば、パッチャーウィンドウがサブパッチウィンドウから、ポップアップメニューによって親ウィンドウに戻ることができるのは、このメソッドを実装しているためです。otclick メソッドを実装していない場合は、[option]+クリックを行なった際に、ユーザが期待するような通常のドラッグ動作を実行します。


mouseup

     
  ウィンドウ内でマウスアップイベントが生じた時に、mouseup メッセージが贈られます。
     
バインディング
     
  addmess (myobject_mouseup, "mouseup", A_CANT, 0);
   
宣言
   
  void myobject_mouseup (t_myobject *x, Point where,short modifiers);
     
  where ローカル座標で表された、マウスアップイベントが生じた位置
  modifiers このマウスアップイベントによって、GetNextEventから返されるMacOS イベントレコードの modifiers フィールド。shift、option、command、,capslock、,control キーが押されていたかどうかを示します

Menu メッセージ

これらのメッセージは、ウィンドウがアクティブウィンドウの状態にある時に、ユーザがメニューからアイテム(項目)を選択した場合に送られます。

chkmenu

     
  chkmenu メッセージは、メニューの表示や使用を行なうためのイベントが発生したとき、メニューが描画される直前に送られます。chkmenu メッセージは、指定された標準のメニューアイテムの有効または無効を指定するために送られます。
     
バインディング
     
  addmess (myobject_chkmenu, "chkmenu", A_CANT, 0);
   
宣言
   
  void myobject_chkmenu (t_myobject *x, t_menuinfo *mi);
     
  mi

メニューのアイテムを使用可にする必要がある場合に値を入れる t_menuinfo 構造体デフォルトではすべてのアイテムは有効になっています。後述するこの構造体の記述を参照して下さい。

     
 

ウィンドウがアクティブウィンドウになると、Max はウィンドウのメニューを、そのウィンドウが応答できるアイテムに基づいたものに更新します。あなたは、すべて0の値に初期化された Menuinfo 構造体へのポインタを渡されます。もし、ユーザが特定のメニューアイテムを選んだ時にメッセージを送って欲しいときは、Menuinfo構造体の該当のアイテムに1をセットし、そのアイテムが使用可能になるようにします。Menuinfo 構造体は short による整数の配列で、ext_menu.h で宣言されています。次に示すものは、あなたが利用できるメニューコマンドです。


  Field Message Commands
  i_cut cut,copy, clr Cut, Copy, and Clear?Edit menu
  i_paste paste Paste?Edit menu
  i_dup dup Duplicate?Edit menu
  i_save saveto Save and Save As…?File menu
  i_pastepic pastepic Paste Picture?Edit menu
  i_edit edit Edit?View menu
  i_range dialog Get Info…?Object menu
  i_lineup lineup Align?Max menu
  i_fixwidth fixwidth Fix Width?Object menu
  i_size font A Size in the Font menu
  i_hide hide Hide on Lock?Object menu
  i_show show Show on Lock?Object menu
  i_selectall selectall Select All?Edit menu
  i_find find Find…?Edit menu
  i_findagain find Find Again?Edit menu
  i_replace find Replace?Edit menu
  i_print print Print…?File menu
  i_font font A Font in the Font menu
  i_color wcolor Color… ?Object menu
  i_savecoll savecoll Save As Collective…?File menu
  i_noclick noclick Ignore Click?Object menu
  i_respond respondtoclick Respond to Click?Object menu
  i_front bfront Bring to Front?Object menu
  i_back back Send to Back?Object menu
  i_lockbg lockbg Lock Background?View menu
  i_showbg showbg Show Background?View menu
  i_includebg includebg Include in Background?Object menu
  i_excludebg excludebg Rm. from Background?Object menu
  i_coloritem N/A current color item?Object menu
  i_setorigin setorigin Set Origin?View menu
  i_restoreorigin restoreorigin Restore Origin?View menu
  i_name wobjectname Name…?Object menu
  i_showconnections showconnections Show/Hide Connections?View menu
  i_showpals howpalette Show/Hide Object Palette?View menu
  i_pastereplace pastereplace Paste Replace?Edit menu

上に掲げたメニューメッセージのうち、saveto, font, savecoll,showconnections, showpalette, find の各メッセージは、オブジェクトへの通常のポインタ以外に追加のアーギュメントを持っています。これらのメッセージについての詳細は、注目すべきこれらのメニューメッセージと共に以下で述べています。

undo

     
  ユーザが Edit メニューからUndo を選択した場合に、undo メッセージが送られます。
     
バインディング
     
  addmess (myobject_undo, "undo", A_CANT, 0);
   
宣言
   
  void myobject_undo (t_myobject *x);
     
 

このメッセージを受け取るためには、Undo メニューアイテムを明確に有効にし、テキストをセットしなければなりません。これによって 後述するようなundoitem メッセージに応答することができます。メニューアイテムのテキストをあなた自身でセットして以降、オブジェクトが undoitem メッセージを受け取った場合、それを把握することはあなたの責任になります。あなたがundo または redo を実行しなければならないとしても、これはそれほど難しいことではありません。undoitem メソッドを実装しない場合、あなたのウィンドウがアクティブウィンドウになった時に、Undo メニューアイテムは常に無効になります。


undoitem

     
  undoitem メッセージによって Edit メニューの Undo アイテムを使用可にし、そのテキストを設定することができます。
     
バインディング
     
  addmess (myobject_undoitem, "undoitem", A_CANT, 0);
   
宣言
   
  void myobject_undoitem (t_myobject *x, char *text);
     
  text Edit メニューの Undo アイテムのテキストの内容をセットするためのC文字列。文字列を空に設定(text[0]=0)すると、Undoアイテムは無効になります。この場合、テキストはUndoです。

pastepic

     
  ユーザが Edit メニューから Paste Picture を選択した場合に、pastepic メッセージが送られます。
     
バインディング
     
  addmess (myobject_pastepic, "pastepic", A_CANT, 0);
   
宣言
   
  void myobject_pastepic (t_myobject *x);
     
 

ピクチャデータは、まだクリップボードにあります。あなたの責任は、そのデータを(Mac OS の GetScrap ルーチンを使って)コピーし、それを使って何かの処理を行なうことです。


saveto

     
  ユーザが File メニューから Save または Save As... を選択した場合に、saveto メッセージが送られます。
     
バインディング
     
  addmess (myobject_saveto, "saveto", A_CANT, 0);
   
宣言
   
  void myobject_saveto (t_myobject *x, char *filename, short path);
     
  filename データを書き込むファイル名を表すC文字列。これは作られる必要があります。
  path PathID ファイルの場所を指定します。
     
 

あなたのウィンドウがアクティブウィンドウであるときに、ユーザが File メニューからSave As... を選択した場合、ユーザが標準ファイル保存ダイアログボックスでファイル名とボリュームを指定した後、このメッセージに応答します。この時点ではファイルは開かれもしませんし、作られもしません。あなたはファイルを作り、開き、書き出し、閉じなければなりません。wind_settitle を使ってウィンドウのタイトルを変えたいとも思うかも知れませんが、これは、wind_newWKEEPT ビットをオンにした引数 flags を渡していない限り、自動的に行なわれます。

 ユーザが File メニューから Save を選んだ場合、Max は既にファイル名とボリュームを知らされていて、あなたの saveto メソッドが呼び出されます。

  あなたのウィンドウ内に保存しておく価値のあるものがない場合、このメソッドを実装する必要はありません。この場合、chkmenu メソッドで saveto を有効にしないで下さい。

dialog

     
  ユーザが Max メニューから Get Info... を選択した場合に、dialog メッセージが送られます。
     
バインディング
     
  addmess (myobject_dialog, "dialog", A_CANT, 0);
   
宣言
   
  void myobject_dialog (t_myobject *x);
     
 

dialog メソッドはパッチャーウィンドウ内で、選択されたパッチャーオブジェクトに info メッセージを送るために使われます。既に述べたように、あなたのオブジェクトはinfo メッセージに応答することができますが、これは通常、内部の値をセットしたダイアログボックスを用意することによって行なうことができます。

dialog メッセージはあなたのウィンドウがアクティブウィンドウで、ユーザが Maxメニューから Get Info... を選択した場合に送られます。あなたのメソッドはオブジェクトの info メソッドと同じダイアログを表示することができます。あるいは、あなたのウィンドウが選択可能な項目を持っている場合には、その選択された項目によってダイアログを設定することも可能です。


font

     
  font メッセージは、ユーザが Font メニューから a new font または font size を選択した場合に送られます
     
バインディング
     
  addmess (myobject_font, "font", A_CANT, 0);
   
宣言
   
  void myobject_font (myObject *x, short size, short fontnum);
     
  size 変更があれば、新しいフォントサイズ。そうでない場合は -1。
  fontnum メニューから1つ選択された場合は、新しいフォントのナンバ。そうでない場合は-1。
     
 

ユーザがウィンドウのデフォルトフォントを変更した場合、または Size メニューを選んでサイズを変更した後に、オブジェクトはこのメッセージを受け取ります。カレントのサイズは、t_windw_fontsize フィールドをチェックすることで確認できます。デフォルトのフォントは w_realfont フィールドに保存されています。font メッセージから直接フォントとサイズの情報を取得するためには、メソッドは上のように宣言されなければなりません。fontnum あるいは size のどちらかが -1 の場合、その値はユーザによって変更されていないため、ウィンドウで選択されている、あるいは選択されていないテキストについて、その特徴を変えるべきではありません。

chkmenu メッセージに応答する際に、フォントメニューが表示されたときに特定のフォントまたはサイズがチェックされるように指定することができます。これは、i_fonti_size に値を設定して、あなたのウィンドウで使われるカレントの値とすることによって可能になります。

help

     
  help メッセージは、ユーザが Max メニューから Help... を選択した場合に送られます。
     
バインディング
     
  addmess (myobject_help, "help", A_CANT, 0);
   
宣言
   
  void myobject_help (t_myobject *x);
     
 

あなたの help メソッドはヘルプファイルを開くか、何か他のヘルプとなるような動作によって応答することができます。


find

     
  find メッセージは、ユーザが Find ダイアログを使用している場合に送られます。
     
バインディング
     
  addmess (myobject_find, "find", A_CANT, 0);
   
宣言
   
  void myobject_find (myObject *x, void *search, void *replace);
     
  replace

ウィンドウの中で現在選択されている内容の代わりを指定している Binbuf。replace が 0 ならば、検索を実行するだけです。

     
 

このメッセージは、あなたのウィンドウがアクティブでユーザがFind ダイアログの Find をクリックした後、あるいは、Edit メニューから Find Again や Replace from が選択された後に送られます。もし、あなたが何かを「検索する」場合には、おそらく、次のchkmenu メッセージを受け取ったときに、Find Again...アイテムを有効にしておく必要があるでしょう。

search replace の両方が0以外ならば、最初の置換のときにウィンドウ内で選択されていたものを、もう一度検索します。検索、あるいは置換の内容をテキストに変換したい時は、binbuf_totext を使います。


okclose

     
  okclose メッセージは、標準の「閉じる前に保存しますか?」というアラートが表示される前に送られます。
     
バインディング
     
  addmess (myobject_okclose, "okclose", A_CANT, 0);
   
宣言
   
  void myobject_okclose (t_myobject *x, char *prompt, short *result);
     
  prompt 標準の体裁を変更する場合は、この"Save changes?" アラートのテキストのC文字列を修正します。
  result 下に述べるような、ウィンドウを閉じる時に行なわれる動作を示す0から4までのコード。
     
 

このメッセージを実装することにより、オブジェクトは、ウィンドウの w_dirty フィールドが0以外の場合に、このアラートを表示する標準の動作以上のことを行うことができるようになります。例えば、prompt を修正してアラートの文字を変更することができます。また、アラートをスキップするために特定の値をresult に返したり、ウィンドウを(ウィンドウを所有するオブジェクトが開放されない限り)まったく閉じることができないようにしたりすることができます。後にあげた動作は、もしあなた自身のSave Changes アラートを表示したい場合には適切でしょう。

result がとることのできる値は次のようなものです。

0 標準の動作 (w_dirty が0でなければ、アラートを表示します。そうでない場合はウィンドウを閉じます)。
1 0 と同じですが、Max はダイアログの文字列が変更されているのを知っています。
2 アラートを表示せず、 w_dirty をクリアします (保存時にカスタムメイドのアラートが使われます).。
3 アラートを表示せず, w_dirty はそのままにしておきます。
4 ユーザがキャンセルしたのと同じ動作(ユーザがカスタムメイドのアラートをキャンセルする時に役立ちます)。

print

     
  print メッセージは、ユーザがFile メニューから Print... を選択し、標準のプリントダイアログが表示された時に送られます。
     
バインディング
     
  addmess (myobject_print, "print", A_CANT, 0);
   
宣言
   
  void myobject_print (t_myobject *x, THPrint hPrint, GrafPtr yourPort, short *result);
     
  hPrint InsideMacintoshに記載されている標準の Mac OS の THPrint
  yourPort ウィンドウのグラフポート(GrafPort)。印刷中はこのポートには描画できませんが、ポート矩形についてなどのポート情報にアクセスすることは便利かもしれません。
  result 印刷中にエラーに遭遇した場合は、ここに0以外の値をセットします。これは、メソッドが呼び出される時には0にセットしておきます。
     
 

ユーザが File メニューから Print... を選択し、標準のプリントダイアログが表示されて、OK がクリックされた時に、このメッセージがウィンドウに送られます。ユーザが印刷したいと思うドキュメントのそれぞれのコピーごとに print メッセージを受け取ります。

このメソッドでは、あなたは、ウィンドウを「ドキュメント」として印刷します。エラーが発生すると、result に0以外の値がセットされます。

次のものは、ウィンドウを1ページに印刷するためのいくつかのシンプルなコードの概要です。これは、ウィンドウサイズが用紙サイズより大きくても心配ありません。プリントマネージャの呼び出しはページの印刷の前後に必要である点に注意して下さい。

void myobject_print (myObject *x, THPrint hp, GrafPtr port, short *res) { TPPrPort printPort; Rect printRect; printPort = PrOpenDoc(hp,0L,0L); SetPort(printPort); TextFont(port->txFont); TextSize(port->txSize); printRect = (**hp).prInfo.rPage; PrOpenPage(printPort,0L); /* ここでウィンドウを印刷します */ PrClosePage(printPort); PrCloseDoc(printPort); *res = 0; }

タイプされたコマンドピリオドをチェックするようなコードをを加えた、より良いものにしようと思うかもしれません。このケースでは、ドキュメントの追加のコピーが印刷されないように、result が0以外の値にセットされなければなりません。


ウィンドウルーチン

以下にあげる関数は、オブジェクトのウィンドウと共に使うためのものです。これらのルーチンのほとんどのものに用いられる t_wind 構造体は、次のようなものです。

typedef struct wind { t object w_ob // object header short w_x1; // location of window short w_x2; short w_y1; short w_y2; short w_xoffset; // scroll offsets short w_yoffset; short w_scrollgrain; // scroll grain in pixels short w_refcount; // reference count char w_vis; // visible char w_titled; // has a title char w_grow; // has a grow region char w_close; // has a close region char w_scrollx; // has an x scroll region char w_scrolly; // has a y scroll region> char w_dirty; // dirty flag (can save) char w_scratch; // no complain on close char w_bin; / binary save char w_font; // text font char w_fsize; // font size char w_fontindex; // old font index field (unused) WindowRecord w_wind; // Mac OS window data (not always // present, need to check w_local) short w_vsmax; // vertical scroll max ControlHandle w_vscroll; // vertical scroll bar short w_hsmax; // horizontal scroll max ControlHandle w_hscroll; // horizontal scroll bar void *w_assoc; // associated object void *(*(w_idle))(); // window idle function (unused) char w_name[80]; // filename = window title short w_vol; // Path ID file location short w_proc; // window proc id (0 = normal) char w_keeptitle; // set window title on saveas char w_canon; // slot in canonical list of // locations char w_silentgrow; // don't draw grow icon but allow // grow char w_color;// try to make color window if you // can char w_bits; // number of bits (i.e. 2 for // b&w) char w_divscrollx; // divided horiz scroll bar char w_zoom; // has zoom rect short w_realfont; // real font index short w_hsleft; // left of scroll bar Rect w_oldsize; // internal use short w_oldproc; // internal use char w_select; // always select on click char w_frame; // internal use long w_flags; // internal use WindowPtr w_wptr;// contains pre-existing window or // ptr to w_wind long w_local; // is OS window stored in w_wind? Rect w_growbounds; // optional grow bounds for a // b window char w_helper; // is part of Extras menu } t_wind;

wind_new

     
  新規にウィンドウを作る場合に、wind_new を使います。
   
  t_wind *wind_new (void *assoc, short left, short top, short right, short bottom, short flags);
     
  assoc このウィンドウを所有するオブジェクト。たいていの場合、これはあなたのオブジェクトへのポインタになります。オブジェクトに複数のウィンドウを持たせる場合に、ウィンドウメッセージを受け取るための、媒介となるオブジェクトを作りたいと思うかもしれません。この方法を使えば、ウィンドウを区別することができます。
  left ウィンドウの左端のグローバル座標。 left と top が 0 の場合、ウィンドウは、他のウィンドウとの関係で、順序良く「規範的な」場所に置かれます。
  top ウィンドウの上端のグローバル座標
  bottom ウィンドウの下端のグローバル座標
  right ウィンドウの右端のグローバル座標
  flags ウィンドウの動作とアピアランスを決定するための定数ビットマップ(下記のリストを参照)
     
 
#define WVIS 1 ウィンドウは可視
#define WGROW 2 グロウリージョンを持つ
#define WSCROLLX 4 水平のスクロールバー
#define WSCROLLY 8 垂直のスクロールバー
#define WCLOSE 16 クローズボックスを持つ
#define WKEEPT 32 保存の後、ウィンドウタイトルを変更しない
#define WSGROW 64 グロウリージョンが不可視
#define WCOLOR 128 カラーウィンドウ
#define WPATCHPROC 256 追加のタイトルガジェットを持ったパッチャーウィンドウプロシージャ (patcher window defproc with extra title gadgets)
#define WSHADOWPROC 512 new object list ウィンドウで使用されるウィンドウプレインボックスのプロシージャID(window plain box procID used in new object list window)
#define WDIVSCROLLX 1024 分割された水平スクロールバー (最小値140 ピクセル)
#define WZOOM 2048 ズームボックスを持つ
#define WSELECT 4096 常にクリックで選択 (All Windows Active に従わない)
#define WFROZEN 8192 このウィンドウのパッチャーによる制御を防ぐ
#define WFLOATING 16384 フローティングウィンドウを作る
     
 

wind_new は新しい t_wind オブジェクトを返します。可視フラグ WVIS がセットされない場合、Mac OS や Windows 上での実際のウィンドウは作られません。


wind_vis

     
  ウィンドウを可視にしたり、最前面に表示させる場合に、wind_vis を使います。
   
  void wind_vis (t_wind *window);
     
  window 可視にされるウィンドウ
     
 

wind_vis はウィンドウを見えるようにします。既にウィンドウが可視の状態の場合、wind_vis はSelectWindow を呼び出してウィンドウをアクティブウィンドウにします。MacOS ウィンドウを可視にしたい場合は、syswindow_show を使います。


wind_invis

     
  ウィンドウを非表示にする場合に、wind_invis を使います。
   
  void wind_invis (t_wind *window);
     
  window 非表示にされるウィンドウ
     
 

ウィンドウが可視の場合、wind_invis はウィンドウを隠します。ウィンドウが可視でない場合には、wind_invis は何もしません。wind_invis が実際の OS のウィンドウオブジェクトを破棄してしまうことを覚えておいてください。もし、OS による破棄をせずに、ウィンドウを残したまま見えないようにしたい時には、代わりに wind_syswind の戻り値でsyswindow_hide を使って下さい。wind_invis が Wind 構造体によって占められているメモリを実際に開放するわけではないという点にも注意が必要です。wind_invis を使った後、 wind_vis を呼び出すと、Mac OS または Windows XP の別のウィンドウを作ります。


wind_setgrowbounds

     
  選択されたウィンドウの境界の最小値と最大値を制限する場合に、wind_setgrowbounds を使います。
   
  void wind_setgrowbounds(t_wind *window, short minx,short miny, short maxx, short maxy);
     
  window 境界を設定されるウィンドウ
  minx ウィンドウの最小の幅
  miny ウィンドウの最小の高さ
  maxx ウィンドウの最大の幅
  maxy ウィンドウの最大の高さ

wind_defaultscroll

     
  スクロールバーでマウスクリックがあったかどうかを見て、クリックがあればデフォルトの方法でそれを処理する場合に、wind_defaultscroll を使います。
   
  void wind_defaultscroll (t_wind *window, Point pt, short pagesize);
     
  window マウスがクリックされるウィンドウ
  pt ローカル座標で表されたマウスクリックの場所。あなたのclick メソッドに渡されます。
  pagesize ユーザがスクロールバーでページングによって上げ下げした場合の、スクロールバーの増加、減少の値。ページングはバーのつまみ部分の外側に点在する部分をクリックすることです。pagesize に0を渡すと、デフォルトのページングルーチンが使われます、この場合ユーザがバーに点在する領域をクリックすると、スクロールバーの最大、または最小で表される値の場所へ進みます。
     
 

ウィンドウがスクロールバーを持っている場合、click メソッドの中で wind_defaultscroll を使います。これは、pt がスクロールバー内かどうかをチェックします。スクロールバー内の場合、wind_defalutscroll はデフォルトのスクロールバールーチンを実行し、1を返します。そうでない場合、wind_defaultscroll は0を返します。


wind_dirty

     
  ウィンドウが保存されていないデータを持っているかどうかを記録するために、wind_dirty を使います。
   
  void wind_dirty (t_wind *window);
     
  window dirty ビットをセットされるウィンドウ.
     
 

wind_dirty はウィンドウの dirty ビットをセットします。これにより、ウィンドウが閉じられる際に、ユーザに対し、変更したデータを保存するかどうかを尋ねます。ユーザが保存したい場合には、あなたのsaveto メソッドが呼び出されます。


wind_drag

     
  ウィンドウ内のマウスドラッグを追跡するために、wind_drag を使います。
   
  void wind_drag (method dragfun, void *arg, Point start);
     
  dragfun カーソルおよびマウスボタンの追跡処理を扱うプロシージャ。定義は下記を参照して下さい。
  arg ドラッグプロシージャに渡される引数。通常、これはあなたのオブジェクトになります。
  start ドラッグが開始された場所。たいていの場合、あなたのclick メソッドの引数 Point として渡されます。
     
 

wind_drag の使用によって、通常次のような形の典型的なループプログラムを置き換えます。

do { GetMouse(&pt); /* do something here to track the mouse*/ } while (StillDown());

マウスが動くたびに、呼び出したい関数(dragfun)へのポインタを渡します。これによって、dragfun は指定された引数 arg 、マウスの位置、マウスボタンが押されているかどうか、という情報と共に呼び出されます。マウスボタンが上がると、drag 関数はもう一度呼び出されます。drag 関数は次のように宣言する必要があります。

void myobject_drag (void *dragarg, Point pt, short button);
   
dragarg wind_dragに渡される引数。たいての場合、あなたのオブジェクトへのポインタになります。
pt ローカル座標で表されるカレントのカーソル位置
button マウスボタンが押されていれば0以外、そうでなければ0になります。

上で述べたように、wind_drag は通常マウスが移動した場合にだけ、あなたのdrag 関数を呼び出します。マウスが移動していなくてもdrag 関数を呼び出したい場合には、wind_dragの前に、wind_nowoorymove を呼び出します。drag ルーチンはマウスボタンが離された時にもう一度呼び出されます(そして、button が0になります)。ドラッグルーチンは、描画がカレントのグラフポートで行なわれたかどうか確認するために、 wind_setport (下記を参照)を使う必要があります。


wind_inhscroll

     
  Point がウィンドウの水平スクロールバーにあるかどうかをテストするために、wind_inhscroll を使います。
   
  short wind_inhscroll (t_wind *window, Point pt);
     
  window テストされる、スクロールバーを持ったウィンドウ
  pt マウスクリック位置
     
 

wind_inhscroll は、pt が水平スクロールバー内にあれば true を、そうでなければ false を返します。これは、クリックが水平スクロールバーで行なわれたものか、垂直スクロールバーで行なわれたものかを識別し、それによって wind_defaultscroll に異なった引数 pagesize を渡すために用いられます。


wind_noworrymove

     
  wind_drag の次の呼び出しをセットするために、wind_noworrymove を使います。これによってカーソルが変化しない場合でも drag 関数が呼び出されます。
   
  void wind_noworrymove (void);
     
 

より詳しい情報は、wind_drag の解説を参照して下さい。


wind_setcursor

     
  カーソルを変更する場合に、wind_setcursor を使います。
   
  void wind_setcursor (short curs);
     
  curs 次のような定義済みカーソルのうちの1つ
 
 
#define C_ARROW 1 #define C_WATCH 2
#define C_IBEAM 3 #define C_HAN 4
#define C_CROSS 5 #define C_PENCIL 6
#define C_GROW 8      
     
 

wind_setcursor はカーソルが以前どのようにセットされていたかを追跡します。そのため、カーソルに何か変化があると、wind_setcursorに以前の引数をセットしようとしても、新しいカーソルを見ることができないでしょう。これの解決法は、希望するカーソル定数で呼び出す前に、wind_setcursor(0) を呼び出しておくことです。カーソルを独自のカーソルにセットすることを、Max に対して直接知らせる場合には、 wind_setcursor(-1) を使います。


wind_setport

     
  カレントのグラフポートをウィンドウにセットする場合に、wind_setport を使います。
   
  GrafPtr wind_setport (t_wind *window);
     
  window カレントのグラフポートをセットされるウィンドウ
     
 

カレントのグラフポートをウィンドウに結びつけられたポートにセットする便利な関数です。成功すると、関数から以前のグラフポートへのポインタが返されます。そうでない場合、wind_setport は NIL を返します。ウィンドウでの描画やイベント処理の前に、この関数を呼び出さなければなりません。そして、終了後に関数の戻り値に対して wind_restoreport を呼び出します。次はその例です。

GrafPtr sp; if (sp = wind_setport(myWind)) { /* ここで描画します */ wind_restoreport(sp); }

注:QuickTime SDK for Windows XP を使う場合、この代わりにXQT_wind_setport を使わなければなりません。(後述)


XQT_wind_setport (QuickTime SDK を使用したWindows XPの場合のみ使用)

     
  カレントのグラフポートをウィンドウにセットする場合に、XQT_wind_setport を使います。
   
  GrafPtr XQT_wind_setport(t_wind *window);
     
  window カレントグラフポートにセットされるウィンドウ
     
 

QuickTime SDK QuickDraw グラフポートをウィンドウに結び付けられたポートにセットするために便利な関数です。成功すると、関数から以前のグラフポートへのポインタが返されます。そうでない場合、 XQT_wind_setport は NIL を返します。ウィンドウでの描画やイベント処理の前に、この関数を呼び出さなければなりません。そして、終了後に関数の戻り値に対して XQT_SetPort を呼び出します。次はその例です。

GrafPtr sp; if (sp = XQT_wind_setport(myWind)) { /* ここで描画します */ XQT_SetPort(sp); }


wind_syswind

     
  t_wind から t_syswind を取り出す場合に、wind_syswind を使います。
   
  t_syswind *wind_syswind(t_wind *window);
     
  window 問い合わせを受けるウィンドウ
     
 

返された t_syswind の使い方は、下のSyswindow API セクションを参照して下さい。


wind_gethwnd (Windows XP のみ)

     
  Windows に特有の関数を使用するエクスターナルを書いている時に、Max の t_wind に結びつけられた、Windows 特有の HWND ウィンドウハンドルを取得する場合に、wind_gethwnd を使います。
   
  HWND wind_gethwnd (t_wind *window);
     
  window 問い合わせを受けるWindows のウィンドウハンドル
     
 

与えられた HWND に結び付けられた Max の t_wind がない場合、関数は NIL を返します。


wind_installidletask

     
  ウィンドウにアイドルタイムのタスクをインストールするために、wind_installidletask を使います。
   
  void *wind_installidletask (t_wind *w, method m, void *myobj, long flags);
     
  w アイドルタスクと結び付けられたウィンドウ
  method タスクを取り扱うハンドル
  myobj あなたのオブジェクトのインスタンスへのポインタ
  flags アイドルタスクが呼び出された時のためのオプション。引数 flags は以下のようなオブションからなっています。
#define IDLETASK_IDLE 1
#define IDLETASK_CURSOR 2
     
 

wind_installidletask はあなたのオブジェクトのウィンドウのために、アイドルタスクをインストールし、タスクへのポインタを返します。タスクは、あなたが提供するメソッドを呼び出します。これは、flags で示されますが、widle 関数か、ウィンドウのcursor関数、または、両方です。ウィンドウのcursor関数内のタスクを呼び出す場合、タスク関数は 引数 Point も受け取ります。あなたは、おそらくオブジェクト生成関数の中でこの関数を呼び出す必要があるでしょう。そして、オブジェクトのインスタンス消滅関数(free 関数)内で wind_removeidletask によってタスクを取り除く必要があるでしょう。


wind_removeidletask

     
  wind_installidletask でインストールしたアイドルタイムタスクを取り除く場合に、wind_removeidletask を使います。
   
  void *wind_removeidletask (t_wind *w, void *task);
     
  task wind_installidletaskによって返されるタスクへのポインタ
     
 

wind_removeidletask は、渡されたタスクを取り除きます。


wind_setsmax

     
  ウィンドウのスクロールバーの最大値をセットするために、wind_setsmax を使います。
   
  void wind_setsmax (t_wind *window, short hmax, short vmax);
     
  window スクロールバーを持っているウィンドウ
  hmax 水平スクロールバーの新しい最大値
  vmax 垂直スクロールバーの新しい最大値
     
 

スクロールバーの最小値はいつも0です。この関数はウィンドウが可視の場合でも、不可視の場合でも使うことができます。


wind_setsval

     
  ウィンドウのスクロールバーの値をセットするために、wind_setsval を使います。
   
  void wind_setsval (t_wind *window, short hval, short vval);
     
  window スクロールバーを持っているウィンドウ
  hval 水平スクロールバーの新しい値
  vval 垂直スクロールバーの新しい値
     
 

この関数はウィンドウが可視の場合でも、不可視の場合でも使うことができます。


wind_settitle

     
  ウィンドウのタイトルを変更する場合に、wind_settitle を使います。
   
  void wind_settitle (t_wind *window, char *title, short brackets);
     
  window タイトルを変更されるウィンドウ(訳注:原文はWindow containing the scroll barsとなっています))
  title 新しいタイトルのC文字列
  brackets 0以外の場合, タイトルは各カッコの中に表示されます。
     
 

この関数は、ウィンドウが可視の場合でも、不可視の場合でも使うことができます。


wind_setundo

     
  Edit メニューのUndo項目のテキストをセットする場合に、wind_setundo を使います。
   
  void wind_setundo (char *string, short undoable);
     
  string Undo 項目の新しいテキスト (C文字列).
  undoable 0以外の場合, Undo 項目は使用可になります、そうでない場合は使用不可です。

wind_filename

     
  ウィンドウのタイトルと保存されるファイル名を変更する場合に、wind_filename を使います。
   
  void wind_filename (t_wind *window, char *filename, short path, short bin);
     
  window ファイル名が変更されるウィンドウ
  filename 新しいファイル名 (C string).
  path ファイルの場所を指定する、新しいパス ID
  bin 新しいデフォルトのファイルフォーマット設定。bin が0の場合、Save As ダイアログで Text が選択されます。bin が2の場合、Normal が選択されます。bin の値 1 はMax の「旧フォーマット」バイナリファイルのために使われていました。このフォーマットは現在サポートされていません。bin が -1 の場合、Save As ダイアログで、ユーザにファイルフォーマットの選択が表示されません。
     
 

この関数はウィンドウのタイトルを変更し、それをファイル名とボリューム名として与えます。これは、ユーザがFileメニューから Save を選択した場合、 savetoメッセージへの引数として自動的に渡されます。


wind_setbin

     
  ウィンドウのファイルフォーマット設定を変更する場合に、wind_setbin を使います。
   
  void wind_setbin (t_wind *queenie, short way);
     
  queenie ファイルフォーマット設定を変更されるウィンドウ
  way 新しいデフォルトのファイルフォーマット設定、way が 0 の場合、Save As ダイアログでテキストが選択されます。way が 2 の場合、Normal が選ばれます。way(訳注:原文では bin となっています)の値 1 は、Max の「旧フォーマット」バイナリファイルの場合に使用されていましたが、このフォーマットは現在サポートされていません。way が -1 の場合、Save As ダイアログで、ユーザにファイルフォーマットの選択が表示されません。

wind_close

     
  ウィンドウを閉じる処理を開始する場合に、wind_close を使います。
   
  short wind_close (t_wind *window);
     
  window 閉じられるウィンドウ。
     
 

通常、この関数の動作はユーザがクローズボックスをクリックするか、File メニューから Close を選択した場合に行われます。wind_closeはまず、ウィンドウのデータが変更されたかどうかをチェックします。変更されていて、ウィンドウの w_scratch フィールドがセットされていない場合、Save Changes ダイアログが表示され、希望する処理が選ばれます。wind_close が -1 を返した場合、ユーザがSave Changes ダイアログ、もしくはファイル保存ダイアログでキャンセルを選択してダイアログを抜け、ウィンドウが閉じられていないことを表します。

wind_close が 0 を返した場合、ウィンドウが閉じられたことを表します。この場合3つの状況が考えられます。1つめは、保存すべきデータが存在しない場合、2つめは、ユーザが変更を保存するよう指定し、正しく保存が行われた場合、3つめは、ユーザが変更を保存しない指定を行った場合です。

オブジェクトのインスタンス消滅関数(free 間数)が呼び出されたとき、オブジェクトのウィンドウ内のデータを保存するかどうかをユーザに尋ねたいとき、この関数と、次に述べる wind_nocancel とを組み合わせて使用する場合もあるでしょう。


wind_nocancel

     
  wind_nocancelwind_close の前に使うことによって、ウィンドウが閉じられる際にユーザが“Save changes?”ダイアログをキャンセルできないようにします
   
  short wind_nocancel (void);
     
 

wind_nocancel は呼び出された直後に表示される“Save changes?”ダイアログにだけ影響を及ぼします。


Syswindow API

Syswindow API は、ウィンドウを管理するための多くのユーテリティ関数を提供します。これは、いくつかのMacintosh ウィンドウマネージャAPIと比較的よく似ています。Mac OS9 では、t_syswind ポインタは、実際に Macintosh の WindowPtr でしたが、Mac OSX と Windows XP では ブラックボックス(不透明な型)になっています。このことは、これらのルーチンと他のウィンドウルーチンを混用することは、もはや安全ではないということを意味しています。Max の t_wind オブジェクトのための、関連した t_syswind の値は、wind_syswind 関数を呼び出す事によって得られます。

syswindow_inlist

     
  ウィンドウを、Max のウィンドウリストから検索するために、syswindow_inlist を使います
   
  Boolean syswindow_inlist (t_syswind *wnd);
     
  wnd t_syswind 構造体へのポインタ
     
 

ウィンドウが、Max のウィンドウリストに存在すれば TRUE を、そうでない場合は FALSE を返します。


syswindow_isvisible

     
 

ウィンドウが可視の状態であるかどうかを調べるために、 syswindow_isvisible を使います。

(訳注:原文は“Use syswindow_isvisible to find if a window is in the Maxwindow list.”となっています)

   
  Boolean syswindow_isvisible (t_syswind *wnd);
     
  wnd t_syswind 構造体へのポインタ
     
 

ウィンドウが可視ならば TRUE を、そうでない場合は FALSE を返します。


syswindow_isfloating

     
 

ウィンドウがフロートウィンドウかどうかを調べるために、syswindow_isfloating を使います。(訳注:原文は“Use syswindow_isvisible to find if a window is in the Maxwindow list.”となっています)

   
  Boolean syswindow_isfloating (t_syswind *wnd);
     
  wnd t_syswind 構造体へのポインタ
     
 

ウィンドウがフロートウィンドウならば TRUE を、そうでない場合は FALSE を返します。


syswindow_hide

     
  ウィンドウ非表示にするために、syswindow_hideを使います。
   
  void syswindow_hide (t_syswind *wnd);
     
  wnd t_syswind 構造体へのポインタ
     
 

指定されたウィンドウを隠します。


syswindow_show

     
  非表示にされているウィンドウを表示させるために、syswindow_show を使います。
   
  void syswindow_show (t_syswind *wnd);
     
  wnd t_syswind 構造体へのポインタ
     
 

指定されたウィンドウを表示させます。


syswindow_move

     
  選択されたウィンドウを移動させるために、syswindow_move を使います。
   
  void syswindow_move(t_syswind *wnd, long x, long y,Boolean front);
     
  wnd 移動させるウィンドウ
  x スクリーン上の水平位置
  y スクリーン上の垂直位置
  front ウィンドウを前面に移動させるかどうかのフラグ.
     
 

この関数は、与えられたウィンドウを、ピクセル単位で(x,y) 座標で定義されるスクリーン位置に移動させます。front フラグが0以外の場合、ウィンドウは前面に表示されるでしょう。Windows XP では、ウィンドウがフロートウィンドウでない場合はMax アプリケーションの MDI フレームウィンドウクライアント領域を基準とした位置に移動され、フローティングウィンドウの場合はスクリーン座標を基準として移動される点に注意して下さい。


syswindow_size

     
  ウィンドウのサイズを変更する場合に、syswindow_size を使います.
   
  void syswindow_size (t_syswind *wnd, long width, long height, Boolean update);
     
  wnd サイズを変更されるウィンドウ
  width ウィンドウの新しい幅
  height ウィンドウの新しい高さ
  update ウィンドウ更新のフラグ
     
 

この関数は与えられたウィンドウを、ピクセル値で与えられた heightwidth にサイズ変更します。update (訳注:原文は front になっています)フラグが0以外の場合、ウィンドウは続けて更新されます。


syswindow_wind

     
  t_syswind ポインタと結びつけられた t_wind 構造体を取得するために、syswindow_wind を使います。
   
  struct wind *syswindow_wind(t_syswind *wnd);
     
  wnd 問い合わせを受けるウィンドウ
     
 

t_syswind ポインタと結びつけられたMax の t_wind オブジェクトへのポインタを返します。


ウィンドウのサブクラスの作成 (Windows XP のみ)

Windows XP では、Max は 全ての基本的な機能を取り扱うために、WNDPROC の実装を提供します。しかし、Max が扱わないメッセージを受けたり、Max が提供するデフォルトの実装を変更したいと思うかも知れません。ウィンドウのサブクラスを作ることによって、これが可能になります。ウィンドウのサブクラスの作成法に関する完全な説明は、このドキュメントの範囲を超えています。しかし、いくつかのガイドラインを提供します。

  • ウィンドウのサブクラスを作成するためには、GWL_WNDPROC インデックスと共にWIN32 API の SetWindowLong() を使って下さい。それまでのWNDPROC を保存したのを確認してから、WIN32 API の CallWIndowProc() 関数を使って、Max によるデフォルトの取り扱いのために、適切なメッセージを渡します。


  • SetWindowLong() があなたのウィンドウのHWND を必要とする点に注意して下さい。このHWND は ウィンドウが wind_vis() の呼出しによって可視になるか、あるいはWVIS フラグを伴った wind_new の直後まで存在しません。一度 HWND が存在するようになれば、wind_gethwnd() の呼出しによってそれを取得することができます。