Visual Styles в VS2005
От: Pe3oHaHc  
Дата: 20.08.07 13:06
Оценка:
Добрый день!

Помогите пожалуйста с установкой визуальных стилей 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.