David O'Neil Ответов: 2

Как создать 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. Блич!!! Есть ли способ принудить его к округлому стилю былых славных дней?

2 Ответов

Рейтинг:
12

Espen Harlinn

В зависимости от того, сколько усилий вы хотите вложить в это: Владелец-нарисуйте кнопки значков на обычном языке C (без MFC)[^]

С уважением
Эспен Харлинн


David O'Neil

Спасибо. Я подожду, прежде чем принять ответ, чтобы посмотреть, знает ли кто-нибудь еще способ заставить Win7 вести себя так, как я пробовал, но вы, вероятно, правы.

Sandeep Mewara

+5
очень давно! :)

Espen Harlinn

Правда - слишком долго, надеюсь, у тебя все хорошо :-)

Рейтинг:
1

Rick York

Дэвид : взгляните на мой пост здесь Странное и чудесное[^]

В самом низу темы человек упоминает API диспетчера рабочего стола Windows : Функция DwmSetWindowAttribute (dwmapi.ч) - Win32-приложений, Майкрософт документы[^]

Я провел с ним несколько экспериментов, пытаясь получить атрибуты, и в большинстве случаев это не удавалось. Я не очень далеко продвинулся с этим.


David O'Neil

Windows 7 останется вершиной дизайна пользовательского интерфейса Microsoft. Так грустно, что с тех пор они так далеко ушли под гору. :(

Rick York

Я не могу не согласиться! Хотя мне тоже очень нравился XP.