Как создать 3D-кнопки на языке C++
Я пытался сделать так, чтобы мои кнопки выглядели как стандартные кнопки, показанные на странице Microsoft Типы кнопок - Win32 apps | Microsoft Docs[^], но все, что я пробовал, привело к появлению кнопок "плоского" стиля. То, что я помню, как делал:
Добавление манифеста, подобного следующему, в мою программу:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Supports Windows Vista / Server 2008 --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <!-- Supports Windows 7 / Server 2008 R2 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- Supports Windows 8 / Server 2012 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- Supports Windows 8.1 / Server 2012 R2 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- Supports Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> </application> </compatibility> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type="Win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> </dependentAssembly> </dependency> </assembly>
Я сделал это как путем добавления "{MyApp}.exe.manifest " в исполняемый каталог, так и путем встраивания его в Visual Studio 2019.
Я также попытался добавить в программу следующую прагму:
#pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' \ publicKeyToken='6595b64144ccf1df' language='*'\"")
Моя функция создания кнопки:
void Button::instantiate(int left, int top, int width, int height, const wString & str) { CREATESTRUCT cs = { 0 }; cs.dwExStyle = 0; cs.lpszClass = _T("BUTTON"); cs.lpszName = c_cast<TCHAR*>(str.c_str()); cs.style = BS_PUSHBUTTON | WS_CHILD | WS_TABSTOP; cs.x = left; cs.y = top; cs.cx = width; cs.cy = height; cs.hwndParent = 0; //Will be set up in ControlWin::instantiate cs.hMenu = (HMENU) idC.id(); cs.hInstance = gDwlGlobals->dwlApp->instance(); cs.lpCreateParams = NULL; ControlWin::instantiate(cs, gDwlGlobals->errors()[(int)Error::Button_CreationFailure]); if (!hwndC) throw dwl::Exception(_T("Unable to create dwl::Button")); SendMessage(hwndC, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(false, 0)); ShowWindow(hwndC, SW_SHOW); }
Я настроил Visual Studio на использование последних файлов (10.0 / v142), но все равно получаю плоские кнопки, хотя они выглядят лучше, чем кнопки, которые появились, когда Мои настройки были WinXP. Мой текущий препроцессор определяет для проекта следующее:
#pragma comment(lib, "comctl32.lib") ... #define _WIN32_WINNT 0x0600
Есть идеи?
Спасибо,
Дэвид
Что я уже пробовал:
Смотреть выше. И поскольку это должно быть не менее 30 символов, см. выше.
David O'Neil
Подумав, я думаю, что мои кнопки принимают стиль Windows, но это беглый плоский стиль Win10. Блич!!! Есть ли способ принудить его к округлому стилю былых славных дней?