移动窗口时C ++ / WinApi内存使用率上升

时间:2018-11-24 15:41:06

标签: c++ user-interface winapi

所以我在玩我的测试应用程序时,发现当我将窗口移到屏幕边缘时,ram的使用率正在上升。

在内存为19mb的情况下,字体也会消失,并且该应用会出现错误。

但是,当窗口不触摸屏幕边缘时,不会发生这种情况。

这是我的youtube video,表示我的意思。

我认为我的代码效率不高。

用于绘制文字的代码:

void drawText(LPCWSTR text, LPCWSTR fontName,int fontSize, int x, int y, HDC hdc) {

    //Creat font from name and size

    HFONT font =  CreateFont(
        fontSize,
        0,
        0,
        0,
        FW_NORMAL, 
        FALSE,
        FALSE,
        FALSE,
        ANSI_CHARSET,
        OUT_CHARACTER_PRECIS,
        CLIP_CHARACTER_PRECIS,
        CLEARTYPE_QUALITY,
        DEFAULT_PITCH,
        fontName);

    //Change Current Font

    HFONT oldFont = (HFONT) SelectObject(hdc, font);

    //Draw Text
    TextOut(hdc,
        x,
        y,
        text,
        wcslen(text));

    //Set back old font
    SelectObject(hdc, oldFont);
}

实施:

   case WM_PAINT:
      PAINTSTRUCT ps;
      HDC hdc = BeginPaint(hwnd, &ps);

      int y = 10;

      drawText(L"Hey, im Roboto", L"Roboto", 50, 10, y, hdc);
      y += 80;
      drawText(L"Hey, im Arial", L"Arial",50, 10, y, hdc);
      y += 80;
      drawText(L"Hey, im Lucida Grande", L"Lucida Grande", 50, 10, y, hdc);

      EndPaint(hwnd, &ps);

      break;

1 个答案:

答案 0 :(得分:2)

这似乎是内存泄漏的一种常见情况。根据{{​​3}}:

  

当系统或另一个应用程序请求绘制应用程序窗口的一部分时,将发送WM_PAINT消息。

这意味着,每当系统要请求程序重绘窗口时,WM_PAINT消息就会发送到WindowProc回调函数。而且,如果您使用鼠标移动窗口,则每次窗口完全改变位置时都会重新绘制窗口!您可以和MSDN一起玩,看看确实如此。

无论哪种方式,每次出于任何原因需要重新绘制窗口时,您都在创建一种新字体。例如,当它移动了一点时。这样,内存使用量将快速增加。而如果您将Control Spy v2.0应用于字体后删除字体,则会从内存中取消分配字体,因此不会显着增加实际内存。