Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Windows.h>
- HWND child;
- HDC bbuf = 0;
- LRESULT CALLBACK WndProc(HWND window, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- switch (uMsg) {
- case WM_CREATE:
- return 0;
- case WM_MOUSEMOVE:
- InvalidateRect(window, NULL, true);
- return 0;
- case WM_PAINT: {
- PAINTSTRUCT ps;
- POINT mpos;
- GetCursorPos(&mpos);
- ScreenToClient(window, &mpos);
- BeginPaint(window, &ps);
- bbuf = bbuf ? bbuf : CreateCompatibleDC(ps.hdc);
- static auto& backbuffer = bbuf;
- // hardcoded size is the same in the CreateWindowEx call
- static auto backbmp = CreateCompatibleBitmap(ps.hdc, 400, 400);
- static auto unused = SelectObject(backbuffer, backbmp);
- POINT points[2] = {
- { 0, 0 },
- { mpos.x, mpos.y }
- };
- // give ourselves a white background so we can see the wblack line
- SelectObject(backbuffer, (HBRUSH)GetStockObject(WHITE_BRUSH));
- Rectangle(backbuffer, 0, 0, 400, 400);
- SelectObject(backbuffer, (HBRUSH)GetStockObject(BLACK_BRUSH));
- Polyline(backbuffer, points, 2);
- SendMessage(child, WM_PAINT, 0, 0);
- BitBlt(ps.hdc, 0, 0, 400, 400, backbuffer, 0, 0, SRCCOPY);
- EndPaint(window, &ps);
- return 0;
- }
- case WM_ERASEBKGND:
- return 0;
- case WM_NCDESTROY:
- PostQuitMessage(0);
- break;
- }
- return DefWindowProc(window, uMsg, wParam, lParam);
- }
- LRESULT CALLBACK ChildWndProc(HWND window, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- switch (uMsg) {
- case WM_CREATE:
- return 0;
- case WM_PAINT: {
- PAINTSTRUCT ps;
- BeginPaint(window, &ps);
- static auto backbuffer = CreateCompatibleDC(ps.hdc);
- static auto backbmp = CreateCompatibleBitmap(ps.hdc, 100, 50);
- static auto unused = SelectObject(backbuffer, backbmp);
- BitBlt(backbuffer, 0, 0, 100, 50, bbuf, 50, 150, SRCCOPY);
- RECT r = { 0, 0, 50, 100 };
- SetBkMode(backbuffer, TRANSPARENT);
- SetTextColor(backbuffer, RGB(255, 0, 0));
- DrawText(backbuffer, "hello", 5, &r, DT_NOCLIP | DT_TABSTOP | DT_EXPANDTABS | DT_NOPREFIX);
- BitBlt(bbuf, 50, 150, 100, 50, backbuffer, 0, 0, SRCCOPY);
- EndPaint(window, &ps);
- return 0;
- }
- case WM_ERASEBKGND:
- return 0;
- }
- return DefWindowProc(window, uMsg, wParam, lParam);
- }
- int PASCAL WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int nShowCmd) {
- WNDCLASS wc;
- wc.style = 0;
- wc.lpfnWndProc = WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hinst;
- wc.hIcon = NULL;
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- wc.lpszMenuName = NULL;
- wc.lpszClassName = "test_window";
- RegisterClass(&wc);
- wc.style = 0;
- wc.lpfnWndProc = ChildWndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hinst;
- wc.hIcon = NULL;
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- wc.lpszMenuName = NULL;
- wc.lpszClassName = "transparent_window";
- RegisterClass(&wc);
- HWND wnd = CreateWindowEx(NULL, "test_window", "test", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 50, 50, 400, 400, NULL, NULL, hinst, NULL);
- child = CreateWindowEx(NULL, "transparent_window", "", WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CHILD, 50, 150, 100, 50, wnd, NULL, hinst, NULL);
- MSG m;
- while (GetMessage(&m, NULL, 0, 0)) {
- TranslateMessage(&m);
- DispatchMessage(&m);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment