○デスクトップの画像を取得して、ウィンドウに描画する

BitBlt(hdc,0,0,rc.right,rc.bottom, CreateDC(TEXT("DISPLAY") , NULL , NULL , NULL), 0, 0, SRCCOPY);

CreateDCでデスクトップのハンドルを取得してイメージを転送します

■サンプルプログラム



#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);

char szClassName[]="sample01"; //ウインドウクラス

HINSTANCE hInst;
HWND hWnd;

int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,
					LPSTR lpsCmdLine,int nCmdShow ){
	MSG msg;
	BOOL bRet;

	hInst = hCurInst;
	if(!InitApp(hCurInst)) return FALSE;
	if(!InitInstance(hCurInst,nCmdShow)) return FALSE;
	while((bRet = GetMessage(&msg,NULL,0,0)) != 0){
		if(bRet == -1){
			MessageBox(NULL,"GetMessage ERR","Error",MB_OK);
			break;
		}else{
			if(!IsDialogMessage(hWnd,&msg)){//タブキーでコントロールを移動したくない場合はこの行をコメントする
				TranslateMessage(&msg); 
				DispatchMessage(&msg); 
			} 
		}
	}
	return (int)msg.wParam;
}

//ウインドウクラスの登録
ATOM InitApp(HINSTANCE hInst){
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style =CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;//プロ―ジャー名
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;//インスタンス
	wc.hIcon = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hCursor = (HCURSOR)LoadImage(NULL,
		MAKEINTRESOURCE(IDC_ARROW),
		IMAGE_CURSOR,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;	//メニュー名
	wc.lpszClassName = (LPCSTR)szClassName;
	wc.hIconSm = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	return (RegisterClassEx(&wc));
}
//ウインドウの生成
BOOL InitInstance(HINSTANCE hInst,int nCmdShow){
	hWnd = CreateWindow(szClassName,
		"タイトルバーにこの名前が表示されます",
		WS_OVERLAPPEDWINDOW,//ウインドウの種類
		CW_USEDEFAULT,		//x座標
		CW_USEDEFAULT,		//y座標
		CW_USEDEFAULT,		//幅
		CW_USEDEFAULT,		//高さ
		NULL,	//親ウインドウのハンドル、親を作るときは NULL
		NULL,	//メニューハンドル、クラスメニューを
				//使うときは NULL
		hInst,	//インスタンスハンドル
		NULL);
	if(!hWnd) return FALSE;
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);
	return TRUE;
}

//描画メソッド
//-------------------------------
//再描画したい時は次のように書く
//InvalidateRect(hWnd, NULL,1);
//UpdateWindow(hWnd);
//-------------------------------
COLORREF bkColor=RGB(200,255,255);//背景色を規定する
HBRUSH bkColorBrush=CreateSolidBrush(bkColor);//背景色のブラシを用意する

void paint(HWND hWnd){
	RECT rc;
	GetClientRect(hWnd,&rc);//ウインドウの範囲を取得

	PAINTSTRUCT ps;
	HDC hdc = BeginPaint(hWnd,&ps);

	BitBlt(hdc,0,0,rc.right,rc.bottom, CreateDC(TEXT("DISPLAY") , NULL , NULL , NULL), 0, 0, SRCCOPY);

	EndPaint(hWnd,&ps);
}

//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){
	switch(msg){
		case WM_CREATE:
			SetTimer(hWnd,1000,500,NULL);//ID:1000 500msのタイマーを作成
			break;
		case WM_PAINT:
			paint(hWnd);
			break;
		case WM_TIMER:
			if(wp == 1000){
				//再描画要求
				InvalidateRect(hWnd, NULL,1);
				UpdateWindow(hWnd);
			}
			else return (DefWindowProc(hWnd,msg,wp,lp));//自分と関係のないタイマーは戻す
			break;

		case WM_CLOSE:
			KillTimer(hWnd,1000);//タイマーを破棄
			DestroyWindow(hWnd);//ウインドウを破棄
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd,msg,wp,lp));
	}
	return 0;
}



▲トップページ > Windows と C++