Как отобразить статические элементы управления на LayeredWindow

0

Я создаю окно 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 в главном окне обратного вызова или когда я создаю главное окно?

Теги:
winapi

1 ответ

1
Лучший ответ

Когда вы используете UpdateLayeredWindow(), вы несете ответственность за рисование содержимого всего окна в растровое изображение, а затем присваиваете этому растровому изображению значение UpdateLayeredWindow() каждом изменении содержимого окна. Излишне говорить, что это не работает, когда есть дочерние элементы управления. Вместо этого используйте SetLayeredWindowAttributes() чтобы активировать альфа/прозрачность в противном случае - обычное окно (чтобы вы могли нормально использовать дочерние элементы управления) и рисовать PNG в окне в ответ на стандартное сообщение WM_PAINT.

  • 0
    Где вызвать SetLayeredWindowAttributes () вместо UpdateLayeredWindow ()?
  • 0
    SetLayeredWindowAttributes() после создания окна или всякий раз, когда вам нужно обновить значение альфа / прозрачности окна.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню