-
Доброго времени суток! При разработке столкнулся с небольшой проблемой. Требуется добавить своё 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);
Так вот, подменю добавляется как и положено, только отрисовка его элементов выглядит "по старому", не как в Висте или Семерке - высота пунктов меньше, нет градиентной заливки и закругленных краев. Как решить эту проблему?
-
инсталлировать дельфи под Вистой. под ней же компилить. имхо.
-
Да ну нет, не может же быть такого. Чего же под 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 меню - нет.
-
> Maksim V. (10.03.2010 19:32:02) [2]
И главное как же оно решит, на какой платформе будет запускаться программа, ведь такой настройки то нет.
-
Нет возможности установить под вистой делфи 7, но если так в лоб подумать, то к чему тут вообще платформа. Я делаю приложение вообще без VCL обертки. Тем более когда выпустили делфи 7, висты и в помине толком то не было, откуда делфи узнает целевую платформу? Может я компилирую вообще под Windows 2000, а программа будет на семерке работать, какая разница, все равно все сводится к вызову системных функций. Хотя может какие-то хитрые директивы компилятору надо указать?
-
Разобрался. Короче если перед TrackPopupMenu вызвать DestroyMenu, то меню будет отображено в старом стиле. Очень спорный момент, когда требуется обновлять хэндл подменю, полученный через GetMenuItemInfo в сообщении WM_INITMENUPOPUP.
-
> Maksim V. © (10.03.10 14:04)
Манифест в ресурсы положи правильный и не забудь убрать тот что там может быть уже есть, если уже успел добавить (XPManifest)
-
> Может я компилирую вообще под Windows 2000, а программа > будет на семерке работать, какая разница, все равно все > сводится к вызову системных функций
Кстати, разница бывает что есть, как ни странно. Но это не твой случай.
-
> 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: <dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly> > DVM © (05.12.10 16:19) [7] > Кстати, разница бывает что есть, как ни странно. Но это > не твой случай.
Можно пример случая?
-
> Maksim V. © (05.12.10 17:48) [8]
> Манифест я позаимствовал из мюторрента.
вроде все на месте
> Можно пример случая?
Визуальная часть программы настраивается компилируется под XP а запускается под W7 - при определенном сочетании анкоров и выравниваний под w7 немного искажаются размеры формы и положение контролов на ней. И наоборот, если скомпилировать под w7 - в WinXP искажаются.
-
> DVM © (05.12.10 19:48) [9] > Визуальная часть программы настраивается компилируется под > XP а запускается под W7 - при определенном сочетании анкоров > и выравниваний под w7 немного искажаются размеры формы и > положение контролов на ней. И наоборот, если скомпилировать > под w7 - в WinXP искажаются.
Я использую шаблоны диалогов, а там всё в диалоговых юнитах, в ресурс хакере клепаю. Если требуется менять размеры диалоговых окон/контролов на них (или позиции контролов), опять же, пересчитываю в диалоговых юнитах размеры/расстояния. Всё просто и универсально. :)
|