У меня есть простое приложение с родительским окном и 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 правильно позиционировать?
Спасибо