WindowsAPIでデスクトップに直接描画

投稿


Windows上にて、C/C++のちょっとしたプログラムで、
実行結果を視覚的にみたい時に、直接デスクトップに描画すると手っ取り早い。

デスクトップはウィンドウハンドル(HWND)を持っているので、
あとはそれを元にデバイスコンテキストハンドル(HDC)を取得してやれば、
それを使って描画できる。

下の例は、再描画処理は行なっていないので、ウィンドウが重なると描画は消えてしまう。
あくまで、簡易的に描画結果を得る方法。

// DrawOnDesktop.cpp
// デスクトップに直接描画

// 以下の#pragma非対応のコンパイラの場合、手動でライブラリをリンクすること
#pragma comment(lib, "user32.lib")  // GetDesktopWindow, GetDC, ReleaseDC API
#pragma comment(lib, "gdi32.lib")   // 各種描画API

#include <windows.h>

int main(int argc, char* argv[])
{
	// デスクトップのウィンドウハンドル、
	// デバイスコンテキストハンドル取得
	HWND desktop_hwnd = GetDesktopWindow();
	HDC  desktop_hdc  = GetDC(desktop_hwnd);
	
	
	//
	// 描画処理
	//
	SelectObject(desktop_hdc, GetStockObject(BLACK_PEN));
	char message[] = "Hello, World";
	TextOut(desktop_hdc, 150, 150, message, strlen(message));

	HPEN   hpen     = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
	HBRUSH hbrush   = CreateSolidBrush(RGB(0, 255, 127));
	HPEN   oldpen   = (HPEN)SelectObject(desktop_hdc, (HGDIOBJ*)hpen);
	HBRUSH oldbrush = (HBRUSH)SelectObject(desktop_hdc, (HGDIOBJ*)hbrush);
	Rectangle(desktop_hdc, 200, 200, 300, 300);
	SelectObject(desktop_hdc, oldpen);
	SelectObject(desktop_hdc, oldbrush);
	DeleteObject(hpen);
	DeleteObject(hbrush);

	
	// デバイスコンテキストハンドル開放
	ReleaseDC(desktop_hwnd, desktop_hdc);
	
	return 0;
}




コメントを残す

メールアドレスが公開されることはありません。