Tested under Vista and XP.
#include <windows.h>
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
unsigned int texture[1024*1024];
GLuint hand;
HDC hdc = GetDC(NULL);
HDC mydc = CreateCompatibleDC(hdc);
int w = GetSystemMetrics(SM_CXSCREEN);
int h = GetSystemMetrics(SM_CYSCREEN);
HBITMAP mybmp = CreateCompatibleBitmap(hdc,w,h);
SelectObject(mydc, mybmp);
StretchBlt(mydc, 0,0,1024,1024, hdc,0,0,w,h, SRCCOPY);
ReleaseDC(NULL, hdc);
static struct
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColours[3];
} screen_bmi=
{
{
sizeof(BITMAPINFOHEADER),
1024,
1024,
1,
32,
BI_RGB,
0,
75,
75,
0,
0,
},
0x00,0x00,0xff,0x00,
0x00,0xff,0x00,0x00,
0xff,0x00,0x00,0x00,
};
int err = GetDIBits(mydc, mybmp, 0, 1024, texture, (BITMAPINFO *)&screen_bmi, DIB_RGB_COLORS);
glGenTextures(1, &hand);
glBindTexture(GL_TEXTURE_2D, hand);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//might want to do this as Windows doesn't set the alpha channel
for (int z= 0; z < 1024*1024;z++) texture[z] |= 0xff000000;
glTexImage2D(GL_TEXTURE_2D, 0, 4, 1024,1024, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, texture);
//try it out
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, hand);
glColor4f(1,1,1,1);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,1.0f);
glVertex2i(0,0);
glTexCoord2f(0.0f,0.0f);
glVertex2i(0,SCREEN_HEIGHT);
glTexCoord2f(1.0f,0.0f);
glVertex2i(SCREEN_WIDTH,SCREEN_HEIGHT);
glTexCoord2f(1.0f,1.0f);
glVertex2i(SCREEN_WIDTH,0);
glEnd();
Jim