文本框隐藏在gif动画后面

Textbox hide behind animation of gif

我在支持 winapi(不是 MFC)的 C++ 中制作 window,我在 window 上用 gdi++ 制作了 gif 动画,我创建了 TextBox,它显示了,但有些部分是在gif后面。此 link 中的图像:1

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {


    switch (msg) {
    case WM_CREATE: 




            hMWDC = GetDC(hwnd);
            pGphcs = new Graphics(hMWDC);
            WCHAR path[MAX_PATH];
            GetModuleFileNameW(NULL, path, MAX_PATH);
            PathRemoveFileSpecW(path);
            PathAppendW(path, L"gifs\test.gif");
            pImg = new Image(path);
            if (pImg) {
                nFrmCnt = pImg->GetFrameCount(&FrameDimensionTime);
                SetTimer(hwnd, DRAW_ANIM, 100, NULL);

            }

        break;


    case WM_TIMER:
        if (wParam == DRAW_ANIM)
        {
            pImg->SelectActiveFrame(&FrameDimensionTime, nFrm);
            Rect DRC(0, 0, pImg->GetWidth(), pImg->GetHeight());
            pGphcs->Clear(Color(128, 128, 128));
            pGphcs->DrawImage(pImg, DRC);
            if (nFrm < (nFrmCnt - 1)) nFrm++; else nFrm = 0;
        }
        break;


hwndText = CreateWindow(L"EDIT",
        L"",
        WS_CHILD | WS_VISIBLE,
        350, 480, 55, 20,
        hWnd, NULL, NULL, NULL);

我希望 gif 作为背景,而 TextBox 将在其前面。 但是没有,:(

出于性能原因,给定 HWND 的默认设备上下文不会从 parent window 的客户区剪切 child window。

如果 parent window 在与 child window 相同的位置绘制某些东西,它也会在 child window 上绘制。接受一些(现在最小的)性能损失你可以自动剪辑 children windows 从主框架 window 绘画区域,通过在 创建主框架时添加 WS_CLIPCHILDREN 样式框架 window。使用此样式,为主框架 window 获得的任何 HDC 的区域将由 child 控制排除的绘画区域占用。这可以防止 child window 被 parent window activity.

覆盖

主框架 window 设置 WS_CLIPCHILDREN 应该可以解决您的问题。

hwnd = CreateWindow( class_name, title, some_styles | WS_CLIPCHILDREN, ... );

有时child windows互相重叠,然后互相透支。在这种情况下 WS_CLIPSIBLINGS 应用于 child windows(相同的 parent window),保护一个 child形成另一幅画