Добрый день!
Помогите пожалуйста с установкой визуальных стилей Windows XP в программе, написаной на WinAPI в 2005-й студии. Я облазил весь форум и перепробовал все что смог найти в интернете. Стал подозревать что проблема во мне :)
Вообщем хочу я чтобы кнопочки, таблички и т.д. вылезали красиво обмалеванными в стиле XP. Перечитав всё, что я смог найти, я понял, что надо рядом с исполняемым файлом проекта (например DuperAPP.exe) создать файл манифеста с именем DuperAPP.exe.manifest со следующим содержанием:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity processorArchitecture="*" version="5.1.0.0" type="win32"
name="Microsoft.Windows.Shell.shell32" />
<description>Windows Shell</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls"
version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*"
processorArchitecture="*" />
</dependentAssembly>
</dependency>
</assembly>
После добавления мною этого манифеста при попытке запуска приложения я получаю сообщение "Приложению не удалось запуститься, поскольку MSVCR80D.dll не был найден. Повторная установка приложения может исправить эту проблему." И всё :(
На форуме нашел похожую ошибку, там было написано — в настройках проекта в пути Mainfest Tool -> Input and Output -> Embed Manifest поставить "no". Я так и сделал — после этого сообщение об ошибке исчезло, но все окошки опять в старом убогом стиле и к тому же файл манифеста урезался почти в два раза и в нём стало так:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
Пожалуйста, помогите мне, я уже измучался! Я два дня потратил на поиски и не сдвинулся ни на ёту!
Объясните, пожалуйста, что надо тыкать или что писать?
Я создаю стандартный пустой проект Win32 Project, пишу с использованием WTL или на чистом API.
Скажите, как заставить этот код отображать красивую Windows XP кнопку?:
#include "Windows.h"
#include "tchar.h"
LRESULT CALLBACK ButtonProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
// Регистрируем класс окна.
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wc.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = ButtonProc;
wc.lpszClassName = _T("TestButton");
wc.lpszMenuName = 0;
wc.style = CS_HREDRAW | CS_VREDRAW;
if(!RegisterClassEx(&wc)) MessageBox(NULL, _T("happened."), _T("Shit with class"), MB_OK);
// Создаем главное окно.
HWND hButWnd = CreateWindowEx(0, _T("TestButton"), _T("XPButton"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0);
if(!hButWnd) MessageBox(NULL, _T("happened."), _T("Shit with window"), MB_OK);
ShowWindow(hButWnd, SW_SHOW);
// Создаем дочернюю кнопку в главном окне.
HWND hButton = CreateWindowEx(0, _T("Button"), _T("Please, be XP!"), WS_CHILD, 0, 0, 200, 50, hButWnd, 0, hInstance, 0);
if(!hButton) MessageBox(NULL, _T("happened."), _T("Shit with button"), MB_OK);
ShowWindow(hButton, SW_SHOW);
// Запускаем обработку сообщений.
MSG msg;
while(GetMessage(&msg, hButWnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}