【发布时间】:2020-04-13 06:27:24
【问题描述】:
对于一个实验,我想创建很多小窗口。我的意思是很多,比如一千左右。
窗口很小,只包含一些标签(AB):
我创建了一百个作为实验,但它们的显示不是即时的,而是在将它们放在屏幕上时可见的。这是为什么呢?
我希望 C/C++ 程序非常快,所以我根本看不到屏幕上的窗口。这是一个错误的期望吗?或者我应该使用某种更轻的窗口类型(我不是 Windows 程序员,所以我只是猜测)可以更快地放置?
这是代码的相关部分:
HWND parent = 0;
for (int i = 0; i < 100; ++i)
{
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_BORDER,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
if (parent == 0)
parent = hWnd;
else
SetWindowLong(hWnd, GWL_HWNDPARENT, (long)parent);
SetWindowLong(hWnd, GWL_STYLE, 0);
SetMenu(hWnd, NULL);
SetWindowPos(hWnd, HWND_TOP, 100 + (i * 20), 100, 20, 20, 0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
}
...
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code that uses hdc here...
SetBkColor(hdc, RGB(0,255,0));
TextOut(hdc, 1, 1, TEXT("AB"), strlen("AB"));
EndPaint(hWnd, &ps);
}
break;
【问题讨论】:
-
调用
UpdateWindow会强制在创建下一个窗口之前绘制每个窗口。如果你把它拿出来,它们可能会出现得更快。 -
这个程序非常不习惯。它创建顶级窗口(没有 WS_CHILD),然后设置它们的父窗口(GWL_HWNDPARENT),这是一个令人困惑的“非此即彼”的情况,会导致问题。此外,您创建了一个 100 层深度的嵌套窗口链,这也不是普通程序所做的。
-
每个窗口都是一个复杂的对象,由其他对象组成。创建一个需要分配一堆不同的资源。而所有这些工作通常是通过几个抽象层来完成的。不是说操作系统还有其他事情要做。所以不,我认为即使是现代计算机也不是这么简单的任务。
-
你的目标是什么?您可以尝试创建窗口但不显示它们。然后在单独的循环中显示它们。这可能会使它在视觉上更快。
-
您只需要一个单个透明窗口(使用键色透明)。没有理由为每个标签创建一个窗口;您可以简单地将它们渲染到透明窗口上,从而消除那些与键颜色不匹配的区域的透明度。切换覆盖层的可见性归结为对
ShowWindow的一次调用。这将是即时的。