Конференция "WinAPI" » Стиль меню под Vista и 7 [D7]
 
  • Maksim V. © (10.03.10 14:04) [0]
    Доброго времени суток! При разработке столкнулся с небольшой проблемой. Требуется добавить своё Popup меню в подменю. Код примерно следующий:


     SubMenu := GetSubMenu(GetMenu(hMain), 0);

     hPopup := CreatePopupMenu;

     ZeroMemory(@lpmii, SizeOf(TMenuItemInfoW));
     lpmii.cbSize   := SizeOf(TMenuItemInfoW);
     lpmii.fMask    := MIIM_SUBMENU;
     lpmii.hSubMenu := hPopup;
     SetMenuItemInfoW(SubMenu, 1, TRUE, lpmii);

     InsertMenuW(hPopup, 0, MF_BYCOMMAND, uIdMenuItem, @pszText[1]);

     DestroyMenu(hPopup);
     DrawMenuBar(hMain);



    Так вот, подменю добавляется как и положено, только отрисовка его элементов выглядит "по старому", не как в Висте или Семерке - высота пунктов меньше, нет градиентной заливки и закругленных краев. Как решить эту проблему?
  • oldman © (10.03.10 19:09) [1]
    инсталлировать дельфи под Вистой.
    под ней же компилить.
    имхо.
  • Maksim V. © (10.03.10 19:32) [2]
    Да ну нет, не может же быть такого. Чего же под Vista делфи может накомпилировать нежели чем на XP?

    Ведь наподобие код "работает":

     Menu := LoadMenuW(hInstance, MAKEINTRESOURCEW(uId));
     SubMenu := GetSubMenu(Menu, 0);
     GetCursorPos(P);
     SetForegroundWindow(hWnd);
     InsertMenuW(SubMenu, 0, MF_BYCOMMAND, uIdMenuItem, @pszText[1]);
     TrackPopupMenu(SubMenu, TPM_CENTERALIGN or TPM_LEFTBUTTON, P.X, P.Y, 0, aWnd, nil);
     DestroyMenu(Menu);



    То есть можно спокойно присоединить элементы меню в подменю загруженного шаблона, а вот чтобы присоединить уже готовое Popup меню - нет.
  • Anatoly Podgoretsky © (11.03.10 08:52) [3]
    > Maksim V.  (10.03.2010 19:32:02)  [2]

    И главное как же оно решит, на какой платформе будет запускаться программа, ведь такой настройки то нет.
  • Maksim V. © (11.03.10 16:18) [4]
    Нет возможности установить под вистой делфи 7, но если так в лоб подумать, то к чему тут вообще платформа. Я делаю приложение вообще без VCL обертки. Тем более когда выпустили делфи 7, висты и в помине толком то не было, откуда делфи узнает целевую платформу? Может я компилирую вообще под Windows 2000, а программа будет на семерке работать, какая разница, все равно все сводится к вызову системных функций. Хотя может какие-то хитрые директивы компилятору надо указать?
  • Maksim V. © (05.12.10 13:29) [5]
    Разобрался. Короче если перед TrackPopupMenu вызвать DestroyMenu, то меню будет отображено в старом стиле. Очень спорный момент, когда требуется обновлять хэндл подменю, полученный через GetMenuItemInfo в сообщении WM_INITMENUPOPUP.
  • DVM © (05.12.10 16:18) [6]

    > Maksim V. ©   (10.03.10 14:04) 

    Манифест в ресурсы положи правильный и не забудь убрать тот что там может быть уже есть, если уже успел добавить (XPManifest)
  • DVM © (05.12.10 16:19) [7]

    > Может я компилирую вообще под Windows 2000, а программа
    > будет на семерке работать, какая разница, все равно все
    > сводится к вызову системных функций

    Кстати, разница бывает что есть, как ни странно. Но это не твой случай.
  • Maksim V. © (05.12.10 17:48) [8]

    > DVM ©   (05.12.10 16:18) [6]
    > Манифест в ресурсы положи правильный и не забудь убрать
    > тот что там может быть уже есть, если уже успел добавить
    > (XPManifest)


    Манифест я позаимствовал из мюторрента.
    <?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="client"
         type="win32"
     />
     <description>Application description here</description>
     <!-- Enable Windows XP and higher themes with common controls -->
     <dependency>
       <dependentAssembly>
         <assemblyIdentity
           type="win32"
           name="Microsoft.Windows.Common-Controls"
           version="6.0.0.0"
           processorArchitecture="X86"
           publicKeyToken="6595b64144ccf1df"
           language="*"
         />
       </dependentAssembly>
     </dependency>
     <!-- Disable Windows Vista UAC compatability heuristics -->
     <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
       <security>
         <requestedPrivileges>
           <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
         </requestedPrivileges>
       </security>
     </trustInfo>
     <!-- Enable Windows Vista-style font scaling on Vista -->
     <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
       <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
         <dpiAware>true</dpiAware>
       </asmv3:windowsSettings>
     </asmv3:application>
    </assembly>




    > DVM ©   (05.12.10 16:19) [7]
    > Кстати, разница бывает что есть, как ни странно. Но это
    > не твой случай.

    Можно пример случая?
  • DVM © (05.12.10 19:48) [9]

    > Maksim V. ©   (05.12.10 17:48) [8]


    > Манифест я позаимствовал из мюторрента.

    вроде все на месте


    > Можно пример случая?

    Визуальная часть программы настраивается компилируется под XP а запускается под W7 - при определенном сочетании анкоров и выравниваний под w7 немного искажаются размеры формы и положение контролов на ней. И наоборот, если скомпилировать под w7 - в WinXP искажаются.
  • Maksim V. © (05.12.10 20:10) [10]

    > DVM ©   (05.12.10 19:48) [9]
    > Визуальная часть программы настраивается компилируется под
    > XP а запускается под W7 - при определенном сочетании анкоров
    > и выравниваний под w7 немного искажаются размеры формы и
    > положение контролов на ней. И наоборот, если скомпилировать
    > под w7 - в WinXP искажаются.

    Я использую шаблоны диалогов, а там всё в диалоговых юнитах, в ресурс хакере клепаю. Если требуется менять размеры диалоговых окон/контролов на них (или позиции контролов), опять же, пересчитываю в диалоговых юнитах размеры/расстояния. Всё просто и универсально. :)
 
Конференция "WinAPI" » Стиль меню под Vista и 7 [D7]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]