C 为什么许多窗口的窗口创建速度慢?能快点吗?

C 为什么许多窗口的窗口创建速度慢?能快点吗?,c,windows,winapi,window,C,Windows,Winapi,Window,作为一个实验,我想创建许多小窗口。我的意思是很多,大约一千个 窗口很小,仅包含一些标签(AB): 我做了一百个实验,但是它们的显示不是瞬间的,当它们被放在屏幕上时是可见的。为什么呢 我希望C/C++程序速度非常快,所以我根本看不到屏幕上的窗口。这是一个错误的期望吗?或者我应该使用某种更轻的窗口类型(我不是Windows程序员,所以我只是猜测),它可以更快地安装 以下是代码的相关部分: HWND parent = 0; for (int i = 0; i < 100; ++i

作为一个实验,我想创建许多小窗口。我的意思是很多,大约一千个

窗口很小,仅包含一些标签(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;
HWND父项=0;
对于(int i=0;i<100;++i)
{
HWND HWND=CreateWindowW(szWindowClass,szTitle,WS_BORDER,
CW_usefault,0,CW_usefault,0,nullptr,nullptr,hInstance,nullptr);
如果(!hWnd)
{
返回FALSE;
}
如果(父项==0)
父项=hWnd;
其他的
SetWindowLong(hWnd,GWL_HWNDPARENT,(长)父级);
SetWindowLong(hWnd,GWL_样式,0);
设置菜单(hWnd,空);
设置窗口位置(hWnd,hWnd_顶部,100+(i*20),100,20,20,0);
显示窗口(hWnd、nCmdShow);
更新窗口(hWnd);
}
...
案例WM_油漆:
{
PAINTSTRUCT-ps;
HDC HDC=开始喷漆(hWnd和ps);
//TODO:在此处添加任何使用hdc的图形代码。。。
色(hdc,RGB(0255,0));
文本输出(hdc,1,1,文本(“AB”)、strlen(“AB”);
端漆(hWnd和ps);
}
打破

SetWindowLong
SetMenu
SetWindowPos
ShowWindow
都可以通过在
CreateWindowW
参数中提供相同的信息来删除

然后还可以删除对
UpdateWindow
的调用


重要的不是C/C++的速度,而是发送windows消息的Win32 API调用。

SetWindowLong
SetMenu
SetWindowPos
ShowWindow
都可以通过在
CreateWindowW
参数中提供相同的信息来删除

然后还可以删除对
UpdateWindow
的调用


这里重要的不是C/C++的速度,而是发送windows消息的Win32 API调用。

调用
UpdateWindow
强制在创建下一个窗口之前绘制每个窗口。如果你把它去掉,它们可能会显示得更快。这个程序非常不地道。它创建顶级窗口(无WS_子窗口),但随后设置它们的父窗口(GWL_HWNDPARENT),这是一个令人困惑的“非此即彼”的情况,将导致问题。此外,您还创建了一个100层深的嵌套窗口链,这也不是普通程序所做的。每个窗口都是一个复杂的对象,由其他对象组成。创建一个需要分配大量不同的资源。所有这些工作通常是通过几个抽象层来完成的。更不用说操作系统还有其他事情要做。所以,不,我不认为这是一个如此简单的任务,即使是现代计算机。你的目标是什么?您可以尝试创建窗口,但不显示它们。然后在单独的循环中显示它们。这可能会使它在视觉上更快。您只需要一个透明窗口(使用关键颜色透明度)。没有理由为每个标签创建一个窗口;您可以简单地将这些渲染到透明窗口上,从而移除与关键点颜色不匹配的区域中的透明度。切换覆盖的可见性归结为对
ShowWindow
的单个调用。这将是即时的。调用
UpdateWindow
将强制在创建下一个窗口之前绘制每个窗口。如果你把它去掉,它们可能会显示得更快。这个程序非常不地道。它创建顶级窗口(无WS_子窗口),但随后设置它们的父窗口(GWL_HWNDPARENT),这是一个令人困惑的“非此即彼”的情况,将导致问题。此外,您还创建了一个100层深的嵌套窗口链,这也不是普通程序所做的。每个窗口都是一个复杂的对象,由其他对象组成。创建一个需要分配大量不同的资源。所有这些工作通常是通过几个抽象层来完成的。更不用说操作系统还有其他事情要做。所以,不,我不认为这是一个如此简单的任务,即使是现代计算机。你的目标是什么?您可以尝试创建窗口,但不显示它们。然后在单独的循环中显示它们。这可能会使它在视觉上更快。您只需要一个透明窗口(使用关键颜色透明度)。没有理由为每个标签创建一个窗口;您可以简单地将这些渲染到透明窗口上,从而移除与关键点颜色不匹配的区域中的透明度。切换覆盖的可见性归结为对
ShowWindow
的单个调用。这将是即时的。谢谢,当我知道如何用参数做同样的事情时,我会尝试。谢谢,当我知道如何用参数做同样的事情时,我会尝试。