Guest User

Untitled

a guest
May 15th, 2012
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.77 KB | None | 0 0
  1.  
  2. #include <Windows.h>
  3.  
  4. HWND child;
  5. HDC bbuf = 0;
  6.        
  7. LRESULT CALLBACK WndProc(HWND window, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  8.     switch (uMsg) {
  9.     case WM_CREATE:
  10.         return 0;
  11.        
  12.     case WM_MOUSEMOVE:
  13.         InvalidateRect(window, NULL, true);
  14.        
  15.         return 0;
  16.    
  17.     case WM_PAINT: {
  18.         PAINTSTRUCT ps;
  19.         POINT mpos;
  20.         GetCursorPos(&mpos);
  21.         ScreenToClient(window, &mpos);
  22.    
  23.         BeginPaint(window, &ps);
  24.        
  25.         bbuf = bbuf ? bbuf : CreateCompatibleDC(ps.hdc);
  26.    
  27.         static auto& backbuffer = bbuf;
  28.    
  29.         // hardcoded size is the same in the CreateWindowEx call
  30.         static auto backbmp = CreateCompatibleBitmap(ps.hdc, 400, 400);
  31.    
  32.         static auto unused = SelectObject(backbuffer, backbmp);
  33.    
  34.         POINT points[2] = {
  35.             { 0, 0 },
  36.             { mpos.x, mpos.y }
  37.         };
  38.    
  39.         // give ourselves a white background so we can see the wblack line
  40.         SelectObject(backbuffer, (HBRUSH)GetStockObject(WHITE_BRUSH));
  41.         Rectangle(backbuffer, 0, 0, 400, 400);
  42.         SelectObject(backbuffer, (HBRUSH)GetStockObject(BLACK_BRUSH));
  43.         Polyline(backbuffer, points, 2);
  44.  
  45.         SendMessage(child, WM_PAINT, 0, 0);
  46.    
  47.         BitBlt(ps.hdc, 0, 0, 400, 400, backbuffer, 0, 0, SRCCOPY);
  48.    
  49.         EndPaint(window, &ps);
  50.    
  51.         return 0;
  52.     }
  53.  
  54.     case WM_ERASEBKGND:
  55.         return 0;
  56.        
  57.     case WM_NCDESTROY:
  58.         PostQuitMessage(0);
  59.         break;
  60.     }
  61.        
  62.     return DefWindowProc(window, uMsg, wParam, lParam);
  63. }
  64.    
  65. LRESULT CALLBACK ChildWndProc(HWND window, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  66.     switch (uMsg) {
  67.     case WM_CREATE:
  68.         return 0;
  69.    
  70.     case WM_PAINT: {
  71.         PAINTSTRUCT ps;
  72.    
  73.         BeginPaint(window, &ps);
  74.  
  75.         static auto backbuffer = CreateCompatibleDC(ps.hdc);
  76.         static auto backbmp = CreateCompatibleBitmap(ps.hdc, 100, 50);
  77.  
  78.         static auto unused = SelectObject(backbuffer, backbmp);
  79.  
  80.         BitBlt(backbuffer, 0, 0, 100, 50, bbuf, 50, 150, SRCCOPY);
  81.  
  82.         RECT r = { 0, 0, 50, 100 };
  83.  
  84.         SetBkMode(backbuffer, TRANSPARENT);
  85.         SetTextColor(backbuffer, RGB(255, 0, 0));
  86.         DrawText(backbuffer, "hello", 5, &r, DT_NOCLIP | DT_TABSTOP | DT_EXPANDTABS | DT_NOPREFIX);
  87.  
  88.         BitBlt(bbuf, 50, 150, 100, 50, backbuffer, 0, 0, SRCCOPY);
  89.    
  90.         EndPaint(window, &ps);
  91.    
  92.         return 0;
  93.     }
  94.    
  95.     case WM_ERASEBKGND:
  96.         return 0;
  97.     }
  98.        
  99.     return DefWindowProc(window, uMsg, wParam, lParam);
  100. }
  101.    
  102. int PASCAL WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int nShowCmd) {
  103.     WNDCLASS wc;
  104.     wc.style         = 0;
  105.     wc.lpfnWndProc   = WndProc;
  106.     wc.cbClsExtra    = 0;
  107.     wc.cbWndExtra    = 0;
  108.     wc.hInstance     = hinst;
  109.     wc.hIcon         = NULL;
  110.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  111.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  112.     wc.lpszMenuName  = NULL;
  113.     wc.lpszClassName = "test_window";
  114.        
  115.     RegisterClass(&wc);
  116.    
  117.     wc.style         = 0;
  118.     wc.lpfnWndProc   = ChildWndProc;
  119.     wc.cbClsExtra    = 0;
  120.     wc.cbWndExtra    = 0;
  121.     wc.hInstance     = hinst;
  122.     wc.hIcon         = NULL;
  123.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  124.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  125.     wc.lpszMenuName  = NULL;
  126.     wc.lpszClassName = "transparent_window";
  127.        
  128.     RegisterClass(&wc);
  129.        
  130.     HWND wnd = CreateWindowEx(NULL, "test_window", "test", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 50, 50, 400, 400, NULL, NULL, hinst, NULL);
  131.        
  132.     child = CreateWindowEx(NULL, "transparent_window", "", WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CHILD, 50, 150, 100, 50, wnd, NULL, hinst, NULL);
  133.    
  134.     MSG m;
  135.    
  136.     while (GetMessage(&m, NULL, 0, 0)) {
  137.         TranslateMessage(&m);
  138.         DispatchMessage(&m);
  139.     }
  140.        
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment