文本框隐藏在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形成另一幅画
我在支持 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形成另一幅画