Можно ли создать метку с прозрачным фоном внутри окна, используя только команды WinAPI?
Я пытаюсь добавить изображение в диалоговое окно, которое будет служить фоновым изображением, а затем отобразить текст на этом изображении. Все, что я пробовал до сих пор, показывает текстовую метку поверх фонового изображения с серым прямоугольником, нарисованным вокруг него.
Это пример моего кода (показывает весь обработчик сообщений для диалогового окна):
INT_PTR CALLBACK OfferWindowProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hWndBackground;
HWND hWndLabel;
HBRUSH hLabelBackColour = NULL;
HFONT hfFont;
HWND hWndTitleLabel;
HDC hdcStatic = NULL;
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
//Load the background image
HANDLE hBitmap;
hBitmap = LoadImage(NULL, L"C:\\Users\\DavidHall\\Documents\\bg.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (hBitmap != NULL)
{
hWndBackground = CreateWindow(L"STATIC", L"image box", WS_CHILD | WS_VISIBLE | SS_BITMAP, 0, 0, 100, 100, hDlg, (HMENU) 2000, NULL, NULL);
SendMessage(hWndBackground, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hBitmap));
}
// Create the label using CreateWindowEx
hfFont = CreateFont(20, 0, 0, 0, fontWeight, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
DEFAULT_PITCH, L"Verdana");
hWndTitleLabel = CreateWindowEx( WS_EX_TRANSPARENT, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , xPos, yPos, width, height, hwnd, (HMENU) id, hInst, NULL);
SendMessage(hWndTitleLabel, WM_SETTEXT, NULL, (LPARAM) labelText.c_str());
SendMessage(hWndTitleLabel, WM_SETFONT, (WPARAM)hfFont, NULL);
return (INT_PTR)TRUE;
case WM_CLOSE:
EndDialog(hDlg, LOWORD(wParam));
// Delete the brush - is that correct?
DeleteObject(hLabelBackColour);
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
default:
break;
}
return (INT_PTR)FALSE;
}
Я пробовал разные комбинации вещей, в том числе:
SetLayeredWindowAttributes
SetBkMode(hdc, TRANSPARENT)
- Обработка сообщения
WM_CTLCOLORSTATIC
2 ответа
Я нашел кое-что, что, похоже, работает, хотя, поскольку я новичок в программировании на чистом WinAPI, это могло быть очень плохой практикой, и я бы понятия не имел!
Я обрабатываю сообщение WM_CTLCOLORSTATIC, как показано:
case WM_CTLCOLORSTATIC:
hdcStatic = (HDC) wParam;
SetTextColor(hdcStatic, RGB(0,0,0));
SetBkMode (hdcStatic, TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);
Это дает эффект того, что моя метка появляется поверх моего изображения с прозрачным фоном.
Я не могу комментировать, но думаю, вам стоит взглянуть на этот ответ Криса Беке: Прозрачные элементы управления Win32 во всех версиях Windows a>, у меня это сработало, и мне даже не пришлось вызывать InvalidateRect . Надеюсь, это будет полезно. Для ответа Криса потребуется узорчатая кисть, посмотрите этот ответ.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .