Q: When I used CopyBits to do a screen capture,
the cursor is not included. What is going on?
A: CopyBits calls ShieldCursor to hide the cursor
before it does its actual work. That is why you never see the cursor
in your bitmap. The following bit of code hides the cursor and
decrements the cursor count in the low memory global to fool CopyBits
not to call ShieldCursor . Just as a warning, using low memory globals
is dangerous and is subject to future OS changes. Anyway, the
OS screen dump behaves similarly.
unsigned char oldCrsrVis;
short oldCrsrState;
//
// Hide cursor
//
oldCrsrVis = GetCrsrVis();
oldCrsrState = GetCrsrState();
SetCrsrVis((unsigned char) 0);
SetCrsrState(oldCrsrState - 1);
CopyBits(.....)
//
// Restore old cursor
//
SetCrsrState(oldCrsrState);
SetCrsrVis(oldCrsrVis);
|
The functions are defined as:
enum {
CrsrRect = 0x83C, /*[GLOBAL VAR] Cursor hit rectangle [8 bytes]*/
TheCrsr = 0x844, /*[GLOBAL VAR] Cursor data, mask & hotspot [68 bytes]*/
CrsrAddr = 0x888, /*[GLOBAL VAR] Address of data under cursor [long]*/
CrsrSave = 0x88C, /*[GLOBAL VAR] data under the cursor [64 bytes]*/
CrsrVis = 0x8CC, /*[GLOBAL VAR] Cursor visible? [byte]*/
CrsrBusy = 0x8CD, /*[GLOBAL VAR] Cursor locked out? [byte]*/
CrsrNew = 0x8CE, /*[GLOBAL VAR] Cursor changed? [byte]*/
CrsrState = 0x8D0, /*[GLOBAL VAR] Cursor nesting level [word]*/
CrsrObscure = 0x8D2 /*[GLOBAL VAR] Cursor obscure semaphore [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);
}
|
You can find a screen dumping sample in the latest Dev. CD. The
complete path is:
References:
Dev.CD Aug 96 TC
Sample Code
Snippets
QuickDraw
ScreenDump
DumpScreen.c
|
|