MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как нарисовать рамку поверх окна приложения?"
Answer 894802
Рисование в DC чужого окна определенно "работает". Другое дело, что:
Нарисованное таким образом изображение затрется при первой обработке WM_PAINT в целевом окне (его понадобится постоянно перерисовывать).
Если вам нужно рисовать рамку вокруг какого-то окна, вам нужен DC не этого окна, а его родительского окна (или рабочего стола, если это окно верхнего уровня). Ведь на DC окна можно рисовать только внутри этого окна, а рамка нужна снаружи.
Подробнее см. в похожем вопросе: Рисование на окне другого приложения с помощью WinAPI
Что касается layered window, вот так у меня работает:
LRESULT CALLBACK LayerWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { HPEN framePen = ::CreatePen(PS_SOLID, 5, RGB(255, 0, 0)); RECT rect = {}; PAINTSTRUCT ps; ::GetClientRect(hwnd, &rect); HDC hdc = ::BeginPaint(hwnd, &ps); ::SelectObject(hdc, framePen); ::Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); ::EndPaint(hwnd, &ps); } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } void CreateLayer(){ HWND handle = FindWindow(L"ConsoleWindowClass", L"C:\\WINDOWS\\system32\\cmd.exe"); SetForegroundWindow(handle); RECT rect = {}; ::GetWindowRect(handle, &rect); WNDCLASSEX wx = {}; wx.cbSize = sizeof(WNDCLASSEX); wx.lpfnWndProc = LayerWndProc; wx.lpszClassName = L"TestBorderWindow"; wx.hCursor = ::LoadCursor(NULL, IDC_ARROW); wx.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); ::RegisterClassEx(&wx); HWND hWnd = CreateWindowEx(WS_EX_LAYERED, L"TestBorderWindow", L"Demo", WS_POPUP, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, (HINSTANCE)GetModuleHandle(NULL), NULL); ::GetWindowRect(handle, &rect); SetLayeredWindowAttributes(hWnd, RGB(255,255,255), 0, LWA_COLORKEY); ::SetWindowPos(handle, hWnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW); ShowWindow(hWnd,SW_SHOW); } int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); MSG msg; CreateLayer(); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.