Windows でデバイス コンテキストへのハンドルを取得するには、いくつかの方法があります。たとえば、WM_PAINT
ハンドラーが を呼び出しBeginPaint
てデバイス コンテキストを取得し、内容をウィンドウに更新してからを呼び出すのが一般的ですEndPaint
。BeginPaint
とEndPaint
を使用できない場合 (WM_PAINT メッセージの外など) は、GetDC
ウィンドウを更新してから を呼び出すことができますReleaseDC
。
BeginPaint
およびによって返されるデバイス コンテキストをGetDC
使用すると、ウィンドウに直接描画できます。ただし、ビットマップに直接描画したい場合もあります。この場合、 を呼び出しCreateCompatibleDC
、描画するビットマップを選択し、描画を行ってから を呼び出しますDeleteDC
。
あなたの場合、あなたが探しているのは次のようなものです:
HDC dc = GetDC(windowHandle);
cairo_win32_surface_create(dc);
ReleaseDC(windowHandle, dc);
この段階でウィンドウを作成したくない場合 (単に画像を保存しているだけなので)、おそらくデスクトップ ウィンドウを使用してデバイス コンテキストを取得することができます。
HWND windowHandle = GetDesktopWindow();
HDC dc = GetDC(windowHandle);
cairo_win32_surface_create(dc);
ReleaseDC(windowHandle, dc);
デバイス コンテキストの取得または作成に使用できる呼び出しは他にもあります。これらの関数と関連する関数のリストは、ここにあります。
ウィンドウの作成と使用は少し複雑なので、基本的な手順と、いろいろ試してみるのに使用できるサンプル コードをいくつか紹介します。ウィンドウを作成して使用するには...
- ウィンドウクラスを登録する
RegisterClass
CreateWindow
またはでウィンドウを作成しますCreateWindowEx
- を呼び出してメッセージ ポンプでメッセージを処理し
GetMessage
、TranslateMessage
DispatchMessage
さらに、 などのウィンドウ メッセージの処理を処理する関数を実装する必要がありますWM_PAINT
。
注: 次のコードはテストされていませんが、正しいはずです。
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_PAINT)
{
HDC dc;
PAINTSTRUCT ps;
dc = BeginPaint(hwnd, &ps);
// do your drawing here
EndPaint(hwnd, &ps);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szClassName[] = TEXT("DrawSurfaceClass");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
///////////////////////////////////////////////////////////
// Register a window "class"
///////////////////////////////////////////////////////////
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =(HBRUSH)COLOR_WINDOW;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
if(!RegisterClass(&wndclass))
{
// error
return 1;
}
///////////////////////////////////////////////////////////
// Create the window and display it (if iCmdShow says so)
///////////////////////////////////////////////////////////
hwnd = CreateWindow(
szAppName,
TEXT("Draw Surface"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
///////////////////////////////////////////////////////////
// Run the message pump so the window proc recieves events
///////////////////////////////////////////////////////////
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}