На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> SplitterBar , Сплитер и следы на экране
    Добрые люди помажите кто знает!
    Сплитер оставляет полосы на окнах при протаскивании его через дочернии окна, не пойму что не так.
    Причем скрин окна не показывает эти полосы, но на фото с телефона они четко видны.
    Прикреплённая картинка
    Прикреплённая картинка
    Прикреплённая картинка
    Прикреплённая картинка
    Сообщение отредактировано: Beer_man -
      Выяснилась ещё одна особенность: это происходит на мониторе с разрешением 3840х2160, при перетаскивании окна приложения на монитор с разрешением 1280х1024, всё нормально.
        Прописал в манифест:
        <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
          Я на чистом WinAPI (без MFC) проект делал, даже Splitter-ы самодельные. Были нежелательные полосы при перетаскивании. Помогла такая штука
          ExpandedWrap disabled
                case WM_ERASEBKGND:
                    return 0;
            :(
            Не, не помогает. Причем и в обработке сообщений, как дочерних окон, так и главного окна.
            Видимо всё таки косяк в масштабируемости окна под разрешение монитора.
              Посмотрите на стили WS_CHILD и WS_CLIPCHILDREN влияет на то какие области перерисовываются
              При создании контролов на форме у меня стили
              форма:
              ExpandedWrap disabled
                dwstyle = WS_POPUP | WS_BORDER | WS_SYSMENU | WS_CAPTION | WS_CLIPCHILDREN | WS_THICKFRAME;

              контроллы на ней:
              ExpandedWrap disabled
                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-ке.
              Сообщение отредактировано: H g -
                Со стилями всё ок. На машине стоит Win10 одновременно подключено два монитора 3840х2160 и 1280х1024. В системе масштабируемость на первом мониторе стоит 150%, на втором 100%. Косяк возникает на первом мониторе, где масштабируемость 150%, при перетаскивании окна на второй экран всё отлично.

                Добавлено
                Родитель:
                ExpandedWrap disabled
                  HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);


                Дочернии окна:
                ExpandedWrap disabled
                  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;
                  Проблема вообщем-то решена.
                  Косяки с перерисовкой на разных мониторах исчезают при:
                  ExpandedWrap disabled
                     <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>
                    В итоге получаем:

                    ExpandedWrap disabled
                      <?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>
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0561 ]   [ 20 queries used ]   [ Generated: 27.04.24, 11:58 GMT ]