高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先


テクニカルQ&A

QTW 91 - CreatePortAssociation と WM_QUERYNEWPALETTE メッセージ
(1998 年 9 月 21 日)


Q: QuickTime 3 for Windows のもとでは、WM_CREATE イベントに応答するウィンドウプロシージャの中で CreatePortAssociation を呼び出すと、そのウィンドウプロシージャは WM_QUERYNEWPALETTE メッセージをまったく受信しなくなります。なぜですか。

A: HWND に対するウィンドウプロシージャに WM_QUERYNEWPALETTE メッセージが転送されないという点はおっしゃる通りです。この問題を避けるには、Mac toolbox の NSetPaletteActivatePalette を使ってカスタムパレットをアクティブにするという方法があります。ただし、これは QTML (このメッセージを転送しない) にとって変則な処理であるため、WndProc をキャプチャして、パレットメッセージを除く (NSetPaletteActivatePalette を使ってパレットを強制的に適用するため) すべてのメッセージに対するコールバックを行うことで、これに対処する必要があります。次に、具体的なコード例を示します。

qtmlWndProc = SetWindowLong(hWnd, GWL_WNDPROC, MyNewWndProc);

LRESULT CALLBACK MyWndProc()
{
  if (message == WM_QUERYNEWPALETTE)
  {
    // 必要な処理を行う
  }
  else
    CallWindowProc(qtmlWndProc, ...);
}

なお、CallWindowProc の内部から QTML のコールバックが再帰的に行われるのを避ける必要があるため、これはどちらかと言えばすっきりしない方法です。もちろん、コード内の任意の場所で Win32 パレットルーチンを使ってカスタムパレットを適用することもできます。カラー環境を変更した後は、QuickTime の GDevice マッチを確実に行うだけです。次に、GDevice マッチの方法を説明する疑似コードを示します。

1) SelectPaletteRealizePalette を呼び出してハードウェアパレットを変更する
2) GetSystemPaletteEntries を呼び出して Windows から色を取り戻す
3) パレットのエントリを QuickTime の ColorTable に変換する
4) カラーテーブルのエントリを (**(**GetMainDevice()).gdPMap).pmTable に移動する

なお、カスタムパレットを作成し、QuickTime 3 の GetMovieColorTable() および SetMovieColorTable() 関数を使って、そのパレットをムービーに関連づけることもできます。ムービーコントローラとともにムービーを表示しようとして、ムービーがアクティブなったときにカスタムパレットを使用したい場合は、単純に MCDoAction 関数と mcFlagsUseWindowPalette フラグを使用するだけです。


-- Scott Kuechle
Worldwide Developer Technical Support