Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.102.112] |
|
Сообщ.
#1
,
|
|
|
Сообщ.
#2
,
|
|
|
Выяснилась ещё одна особенность: это происходит на мониторе с разрешением 3840х2160, при перетаскивании окна приложения на монитор с разрешением 1280х1024, всё нормально.
|
Сообщ.
#3
,
|
|
|
Прописал в манифест:
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/Wind...t;/dpiAware> </windowsSettings> </application> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> </application> </compatibility> теперь тулбар стал маленьким, но полосить перестало Прикреплённая картинка
Добавлено Я так понял косяк, что не обрабатывается событие WM_DPICHANGED |
Сообщ.
#4
,
|
|
|
Я на чистом WinAPI (без MFC) проект делал, даже Splitter-ы самодельные. Были нежелательные полосы при перетаскивании. Помогла такая штука
case WM_ERASEBKGND: return 0; |
Сообщ.
#5
,
|
|
|
Не, не помогает. Причем и в обработке сообщений, как дочерних окон, так и главного окна. Видимо всё таки косяк в масштабируемости окна под разрешение монитора. |
Сообщ.
#6
,
|
|
|
Посмотрите на стили WS_CHILD и WS_CLIPCHILDREN влияет на то какие области перерисовываются
При создании контролов на форме у меня стили форма: dwstyle = WS_POPUP | WS_BORDER | WS_SYSMENU | WS_CAPTION | WS_CLIPCHILDREN | WS_THICKFRAME; контроллы на ней: dwstyleedit = WS_CHILD | WS_VISIBLE; dwstylebutton = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; dwstytreeview = WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS; Ps В плане перерисовки одна и та же программа ведет себя неодинаково на XP и на 10-ке. |
Сообщ.
#7
,
|
|
|
Со стилями всё ок. На машине стоит Win10 одновременно подключено два монитора 3840х2160 и 1280х1024. В системе масштабируемость на первом мониторе стоит 150%, на втором 100%. Косяк возникает на первом мониторе, где масштабируемость 150%, при перетаскивании окна на второй экран всё отлично.
Добавлено Родитель: HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); Дочернии окна: case WM_CREATE: { CreateToolBar(hWnd); CreateStatusBar(hWnd); nleftWnd_width = LEFT_WINDOW_WIDTH; hcSizeEW = LoadCursor(NULL, IDC_SIZEWE); hcSizeNS = LoadCursor(NULL, IDC_SIZENS); GetClientRect(hWnd, &rect); ntopWnd_hight = (rect.bottom - rect.top - TOP_POS - BOTTOM_POS) / 2 ; g_hlefttopwnd = CreateWindowEx(WS_EX_WINDOWEDGE, szLeftTopWindowClass, L"", WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, rect.left, rect.top + TOP_POS, LEFT_WINDOW_WIDTH, (rect.bottom - rect.top - TOP_POS - BOTTOM_POS) / 2 - SPLITTER_BAR_WIDTH / 2, hWnd, NULL, hInst, NULL); if (NULL != g_hlefttopwnd) { ShowWindow(g_hlefttopwnd, SW_SHOW); UpdateWindow(g_hlefttopwnd); } g_hleftbotwnd = CreateWindowEx(WS_EX_WINDOWEDGE, szLeftBotWindowClass, L"", WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, rect.left, rect.top + TOP_POS + (rect.bottom - rect.top - TOP_POS - BOTTOM_POS) / 2 + SPLITTER_BAR_WIDTH/2, LEFT_WINDOW_WIDTH, (rect.bottom - rect.top - TOP_POS - BOTTOM_POS) / 2 - SPLITTER_BAR_WIDTH / 2, hWnd, NULL, hInst, NULL); if (NULL != g_hlefttopwnd) { ShowWindow(g_hleftbotwnd, SW_SHOW); UpdateWindow(g_hleftbotwnd); } g_hrightwnd = CreateWindowEx(WS_EX_CLIENTEDGE, szRightWindowClass, L"", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN, rect.left + LEFT_WINDOW_WIDTH + SPLITTER_BAR_WIDTH, rect.top + TOP_POS, rect.right - (rect.left + 3 + LEFT_WINDOW_WIDTH + SPLITTER_BAR_WIDTH), (rect.bottom - rect.top) - (TOP_POS + BOTTOM_POS), hWnd, NULL, hInst, NULL); if (NULL != g_hrightwnd) { ShowWindow(g_hrightwnd, SW_SHOW); UpdateWindow(g_hrightwnd); } } break; |
Сообщ.
#8
,
|
|
|
Проблема вообщем-то решена.
Косяки с перерисовкой на разных мониторах исчезают при: <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware> </windowsSettings> </application> Причём именно True/PM. В программе необходимо предусмотреть масштабирование компонентов и обработать WM_DPICHANGED, для того чтобы при перетаскивании на другой монитор менялся масштаб. Так же можно выставить настройки dpiAware манифеста непосредственно в VS. Добавлено Параметр gdiScaling, как оказалось тоже влияет на эти полосы от DrawFocusRect, его не указываем в манифесте или: <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/Wind.../gdiScaling> |
Сообщ.
#9
,
|
|
|
В итоге получаем:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="x86" name="App" type="win32"></assemblyIdentity> <description>MyApp</description> <!--уровень прав, с которыми должно быть запущено приложение--> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> <!--совместимость приложения с High-DPI--> <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <!-- параметр масштабирования для Windows 7 and 8 --> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- параметр масштабирования для Windows 10 1607 и выше --> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> <!-- автоматическое масштабирование GDI для Windows 10 1607 и выше --> <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">false</gdiScaling> </windowsSettings> </application> <!--совместимость с версиями Windows--> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows Vista --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" /> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" /> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" /> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" /> <!-- Windows 10 и Windows 11--> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> </application> </compatibility> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity> </dependentAssembly> </dependency> </assembly> |