前提・実現したいこと
子ウィンドウを"閉じるボタン"として親ウィンドウ子ウィンドウともにSetLayeredWindowAttributes
の指定色で透過しました.
あとから全体に描画はする予定で一時的にGRAY_BRUSH
で中央に色が塗ってありますが"閉じるボタン"としての子ウィンドウ部分は透過部分もボタンとして作用してほしいです.
SetLayeredWindowAttributes
の透過部分のLBUTTONDOWN等のメッセージは受け取るようにはできませんか?
該当のソースコード
C
1#define UNICODE 2 3#include <Windows.h> 4 5LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 6LRESULT CALLBACK WindowDestroyProc(HWND, UINT, WPARAM, LPARAM); 7HINSTANCE hGlobalInstance; 8 9const wchar_t CLASS_NAME[] = L"CLASS NAME"; 10const wchar_t DESTROY_CLASS_NAME[] = L"DESTROY CONTROL CLASS NAME"; 11 12HWND mhwnd; 13 14int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR nCmdLine, int nCmdShow) { 15 UNREFERENCED_PARAMETER(hPrevInstance); 16 UNREFERENCED_PARAMETER(nCmdLine); 17 hGlobalInstance = hInstance; 18 19 WNDCLASSEX wc = { 20 sizeof(WNDCLASSEX), CS_VREDRAW | CS_HREDRAW, WindowProc, 21 0, 0, hInstance, 22 NULL, (HCURSOR)LoadCursor(NULL,IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), 23 NULL, CLASS_NAME, NULL 24 }; 25 26 RegisterClassEx(&wc); 27 28 HWND hwnd = CreateWindowEx( 29 WS_EX_LAYERED, CLASS_NAME, NULL, WS_POPUP | WS_BORDER, 30 100, 100, 960, 540, 31 NULL, NULL, hInstance, NULL 32 ); 33 34 mhwnd = hwnd; 35 36 SetLayeredWindowAttributes(hwnd, 0x0, 0, LWA_COLORKEY); 37 38 ShowWindow(hwnd, nCmdShow); 39 UpdateWindow(hwnd); 40 41 MSG msg = {}; 42 43 while (GetMessage(&msg, NULL, 0, 0) > 0) { 44 TranslateMessage(&msg); 45 DispatchMessage(&msg); 46 } 47 48 return (int)msg.wParam; 49} 50 51LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 52 switch (uMsg) { 53 case WM_CREATE: 54 { 55 WNDCLASSEX wdc = { 56 sizeof(WNDCLASSEX), NULL, WindowDestroyProc, 57 0, 0, hGlobalInstance, 58 NULL, (HCURSOR)LoadCursor(NULL,IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), 59 NULL, DESTROY_CLASS_NAME, NULL 60 }; 61 RegisterClassEx(&wdc); 62 HWND dwnd = CreateWindowEx( 63 0, DESTROY_CLASS_NAME, NULL, WS_CHILD, 64 815, 30, 105, 30, 65 hwnd, NULL, hGlobalInstance, NULL 66 ); 67 68 ShowWindow(dwnd, SW_SHOW); 69 UpdateWindow(dwnd); 70 } 71 break; 72 73 case WM_LBUTTONDOWN: 74 PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, NULL); 75 break; 76 77 case WM_PAINT: 78 { 79 PAINTSTRUCT ps; 80 HDC hdc = BeginPaint(hwnd, &ps); 81 RECT rc = { 50, 50, 910, 530 }; 82 83 FillRect(hdc, &rc, (HBRUSH)GetStockObject(GRAY_BRUSH)); 84 85 EndPaint(hwnd, &ps); 86 } 87 break; 88 89 case WM_DESTROY: 90 PostQuitMessage(0); 91 return 0; 92 } 93 94 return DefWindowProc(hwnd, uMsg, wParam, lParam); 95} 96 97LRESULT CALLBACK WindowDestroyProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 98 switch (uMsg) { 99 case WM_LBUTTONUP: 100 SendMessage(mhwnd, WM_DESTROY, 0, 0); 101 return 0; 102 103 case WM_PAINT: 104 { 105 PAINTSTRUCT ps; 106 HDC hdc = BeginPaint(hwnd, &ps); 107 RECT rc = { 5, 5, 100, 25 }; 108 109 FillRect(hdc, &rc, (HBRUSH)GetStockObject(GRAY_BRUSH)); 110 111 EndPaint(hwnd, &ps); 112 } 113 break; 114 115 } 116 return DefWindowProc(hwnd, uMsg, wParam, lParam); 117}
補足情報
Windows10 Pro
VisualStudio2017 Community

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。