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

QD 45 - CopyBitsを使用してスクリーンをキャプチャするときにカーソルを含める方法

(27-September-96)

Q: スクリーンをキャプチャしようとしてCopyBitsを使用しているのですが、マウスカーソルがキャプチャされません。何が原因なのでしょうか?

A: CopyBitsは、実際の作業を始める前にShieldCursorをコールしてカーソルを隠してしまいます。キャプチャしたビットマップにカーソルが含まれていないのは、これが原因です。以下のコードは、カーソルを隠し、ローメモリ・グローバル中にストアされているカーソルのカウントを減少させることにより、ShieldCursorをコールしないようにCopyBitsの裏をかきます。ローメモリ・グローバルを使用することは危険であり、将来のOSで変更の対象となりうることに注意してください。なにはともあれ、OSのスクリーンダンプは同じように動作します。

unsigned char oldCrsrVis;
short oldCrsrState;

//
// カーソルを隠す
//
oldCrsrVis = GetCrsrVis();
oldCrsrState = GetCrsrState();
SetCrsrVis((unsigned char) 0);
SetCrsrState(oldCrsrState - 1);

CopyBits(.....);

//
// カーソルをリストアする
//
SetCrsrState(oldCrsrState);
SetCrsrVis(oldCrsrVis);
関数の定義は以下の通りです。
enum {
    CrsrRect = 0x83C,   /*[グローバル変数]
    			カーソルがヒットしているレクト [8 bytes]*/
    		
    TheCrsr  = 0x844,   /*[グローバル変数]
    			カーソルのデータ、マスクおよびホットスポット [68 bytes]*/
    		
    CrsrAddr = 0x888,   /*[グローバル変数]
    			カーソルに隠されている部分のデータのアドレス [long]*/
    
    CrsrSave = 0x88C,   /*[グローバル変数]
    			カーソルに隠されている部分のデータ [64 bytes]*/
    
    CrsrVis  = 0x8CC,   /*[グローバル変数]
    			カーソルが表示されているか? [byte]*/
    
    CrsrBusy = 0x8CD,   /*[グローバル変数]
    			カーソルがロックされているか? [byte]*/
    
    CrsrNew  = 0x8CE,   /*[グローバル変数]
    			カーソルが変更されているか? [byte]*/
    
    CrsrState = 0x8D0,  /*[グローバル変数]
    			カーソルのネストレベル [word]*/
    
    CrsrObscure = 0x8D2 /*[グローバル変数]
    			カーソルが覆い隠されている(obscure)かどうかを示すセマフォ [byte]*/
  };

int IsCursorHidden(void);
void SetCrsrVis(unsigned char cursorVisible);
unsigned char GetCrsrVis(void);
PicHandle DumpScreenArea(void);
void ModCrsrState(short del);
short GetCrsrState(void);
void SetCrsrState(short val);

void SetCrsrVis(unsigned char cursorVisible)
{
    *(unsigned char*)CrsrVis = cursorVisible;
}

unsigned char GetCrsrVis(void)
{
   return( *(unsigned char*)CrsrVis );
}

void ModCrsrState(short del)
{
        *(unsigned char*)CrsrState += del;
}

short GetCrsrState(void)
{
        return ( *(unsigned char*)CrsrState );
}

void SetCrsrState(short val)
{
        *(unsigned char*)CrsrState = val;
}

int IsCursorHidden()
{
    int retVal = 0;
    unsigned char cursorVisible;

    cursorVisible = *(unsigned char*)CrsrVis;
    if (cursorVisible)
        retVal = 0;
    else
        retVal = 1;
    return (retVal);
}

スクリーンダンプを行うサンプルコードが、最新のDeveloper CDに含まれています。パスは以下の通りです。

References:
     Dev.CD Aug 96 TC
          Sample Code
               Snippets
                    QuickDraw
                         ScreenDump
                         ---> DumpScreen.c

[ Technical Q&A's : Graphics & Media : QuickDraw : QD45 ]