Я создаю окно hwnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle,0, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
Затем я показываю png изображение
CImage img;
img.Load(Path);
int iWidth = img.GetWidth();
int iHeight = img.GetHeight();
HDC hdcScreen = GetDC(NULL);
HDC hDC = CreateCompatibleDC(hdcScreen);
HBITMAP hBmp = CreateCompatibleBitmap(hdcScreen, iWidth, iHeight);
HBITMAP hBmpOld = (HBITMAP)SelectObject(hDC, hBmp);
img.Draw(hDC,0, 0, iWidth, iHeight, 0, 0, iWidth, iHeight);
BLENDFUNCTION blend = {0};
blend.BlendOp = AC_SRC_OVER;
blend.BlendFlags=0;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = AC_SRC_ALPHA;
POINT ptPos = {0, 0};
SIZE sizeWnd = {iWidth, iHeight};
POINT ptSrc = {0, 0};
UpdateLayeredWindow(hWnd, hdcScreen, &ptPos, &sizeWnd, hDC, &ptSrc, 0, &blend, ULW_ALPHA);
SelectObject(hDC, hBmpOld);
DeleteObject(hBmp);
DeleteDC(hDC);
ReleaseDC(NULL, hdcScreen);
И я хочу, чтобы в этом окне создавались некоторые статические элементы управления, например индикатор выполнения.
#define ID_MainProgressBar 2000
HWND MainProgressBar=CreateWindowEx(WS_EX_LAYERED,PROGRESS_CLASS,NULL,WS_CHILD|WS_VISIBLE|PBS_SMOOTH,200,200,180,100,hwnd1,(HMENU)ID_MainProgressBar,hInst,NULL);
И я не вижу этого элемента. Другой вопрос, когда нужно вызвать HWND MainProgressBar = CreateWindowEx в главном окне обратного вызова или когда я создаю главное окно?
Когда вы используете UpdateLayeredWindow()
, вы несете ответственность за рисование содержимого всего окна в растровое изображение, а затем присваиваете этому растровому изображению значение UpdateLayeredWindow()
каждом изменении содержимого окна. Излишне говорить, что это не работает, когда есть дочерние элементы управления. Вместо этого используйте SetLayeredWindowAttributes()
чтобы активировать альфа/прозрачность в противном случае - обычное окно (чтобы вы могли нормально использовать дочерние элементы управления) и рисовать PNG в окне в ответ на стандартное сообщение WM_PAINT
.
SetLayeredWindowAttributes()
после создания окна или всякий раз, когда вам нужно обновить значение альфа / прозрачности окна.