Настройка моего приложения API-интерфейса и предотвращение системы, чтобы сделать его размытым и неправильно расположенным - PullRequest
0 голосов
/ 08 января 2020

У меня есть простое приложение с родительским окном и 4 дочерними windows. Он выглядит хорошо при настройках дисплея от Windows xp и Windows 7 до 125%.

Однако при Windows 7 более 125% и Windows 10 125%, windows, меню, текстовые поля и окна сообщений становятся размытыми, а дочерние windows переполняются.

Я хочу исправить их, чтобы они выглядели нормально, поэтому я попытался заменить их размеры обновленными размерами в соответствии с dpi:

//Get resoulation 
int resX=GetSystemMetrics(SM_CXVIRTUALSCREEN) , resY=GetSystemMetrics(SM_CYVIRTUALSCREEN);
//Get current dpi
HDC screen = GetDC(0);
int dpiX = GetDeviceCaps(screen, LOGPIXELSX);
int dpiY = GetDeviceCaps(screen, LOGPIXELSY);
//Do some calculations about the resoulation 
if( resX <= 800 ){
        winWidth=resX/1.45;
        winHeight=resY/1.3;
    }
//...

//Update width and height of the main window according to the current dpi
int updatedWinWidth=(winWidth * dpiX) / 96 , updatedWinHeight=(winHeight * dpiY) / 96 ;
//Creating parent window with updated width and height
hwnd=CreateWindowEx( WS_EX_CLIENTEDGE , myClassName , L"Compressor Reporter" ,  WS_OVERLAPPED  | WS_MINIMIZEBOX | WS_SYSMENU ,CW_USEDEFAULT, CW_USEDEFAULT,  updatedWinWidth , updatedWinHeight, NULL , NULL , hInstance , NULL );

//Updating width and height for child window, width and height variables are the dafault width and height for the child 
int updatedWidth = ( width * dpiX) / 96 , updatedHeight= (height * dpiY) / 96;
//Creating the child window
hwndList1 = CreateWindow(WC_LISTVIEW , L"" ,  WS_VISIBLE | WS_CHILD | LVS_REPORT | WS_BORDER  | WS_VSCROLL | LVS_OWNERDRAWFIXED, middle-(10+updatedWidth) , middleH-(10+updatedHeight) , updatedWidth , updatedHeight, hwnd, NULL, GetModuleHandle(NULL), 0); 



//Font settings
HDC hdc=GetDC( hHeader1);
int points=0;
switch(GetDeviceCaps( hdc , LOGPIXELSY)){
    case 96:
        points=11;
        break;
    default:
        points=10.5;
}

int fonth=-MulDiv(points, GetDeviceCaps( hdc , LOGPIXELSY) , 72 );

ReleaseDC(hHeader1 , hdc);

hF2=CreateFont(fonth, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Tahoma");

SendMessage(hHeader1,WM_SETFONT,(WPARAM)hF2,MAKELPARAM(TRUE,0));

Однако результат тот же.

Я также изменяю Compressor Reporter.exe.embed.manifest и добавляю тег application внутри него, как показано ниже. Но когда я перестроил свое приложение, то, что я добавил, не появляется, и я вижу, что нет тега application.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<application xmlns="urn:schemas-microsoft-com:asm.v3">
 <windowsSettings>
        <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
        <dpiAware>true</dpiAware>
    </windowsSettings>
</application>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
   <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
</trustInfo>
</assembly>

Что я делаю не так и как я могу исправить размытые windows, текст, меню и messageBoxы и заставить ребенка windows правильно позиционировать?

Спасибо

1 Ответ

1 голос
/ 09 января 2020

Возможно, вы пропустили этот документ .

Настольные приложения, использующие более старые Windows технологии программирования (необработанное программирование на Win32, Windows Forms, Windows Presentation Framework ( WPF) и др. c.) Не могут автоматически обрабатывать масштабирование DPI без дополнительной работы разработчика. Без такой работы приложения будут выглядеть размытыми или иметь неправильный размер во многих распространенных сценариях использования ios.

Чтобы обновить существующее настольное приложение для правильной обработки масштабирования DPI, его необходимо обновить таким образом что, как минимум, важные части его пользовательского интерфейса обновляются в соответствии с изменениями DPI.

Большинство настольных приложений работают в режиме осведомленности о DPI системы. Приложения, поддерживающие системный DPI, обычно масштабируются до DPI основного дисплея (дисплея, на котором находился системный трей во время запуска сеанса Windows). При изменении DPI Windows растровое изображение растягивает пользовательский интерфейс этих приложений, что часто приводит к их размытости. При обновлении приложения, поддерживающего Системный DPI, для обеспечения поддержки каждого монитора-DPI код, который обрабатывает макет пользовательского интерфейса, должен быть обновлен таким образом, чтобы он выполнялся не только во время инициализации приложения, но также всякий раз, когда уведомление об изменении DPI ( WM_DPICHANGED) в случае Win32) получено. Обычно это включает пересмотр любых предположений в коде о том, что пользовательский интерфейс необходимо масштабировать только один раз.

Вы можете понять, как это работает, с помощью примера .

Не забудьте добавить SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE), который изменяет осведомленность о DPI во время работы приложения.

Возможны случаи:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...