Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить цветовую схему и размер шрифта 
:(
    Опции темы
Agentx86
Дата 8.5.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Как средствами WINAPI изменить цветову схему и размер шрифта в системе? 
Это находится в свойствах экрана->оформление.

Это сообщение отредактировал(а) Agentx86 - 8.5.2009, 12:39
PM MAIL   Вверх
Agentx86
Дата 8.5.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Вот нашел как можно изменить шрифт в Windows NT. Но этот способ в xp не работает. Если у когото есть какието идеи то предлагайте.
Идея этого способа в том что есть dll библиотека в которой есть эта функция. В xp эта библиотека другая. Из-за этого этот код и не работает.
Код

#include "windows.h"
///////////////////////////////////////////////////////////////
/// Arnon Mathias 13-Mar-2002
///////////////////////////////////////////////////////////////

DWORD  _MyExitWindows(UINT ExitFlags)
{
/// Из документации MSDN по функции ExitWindowsEx
  
  HANDLE            hToken; 
  TOKEN_PRIVILEGES  tkp;
  DWORD             dwRetVal;
 
/// Получаем маркер (token) для этого процесса. 
  if (!OpenProcessToken(GetCurrentProcess(), 
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  {
     ::MessageBox (NULL,"Open Process Token","Exit Windows",MB_OK);
     return (GetLastError());
  }

/// Получаем LUID для привелегии выключения (shutdown).
  LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
                       &tkp.Privileges[0].Luid); 

  tkp.PrivilegeCount = 1;  // устанавливаем привелегию "один"
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

/// Получаем привелегию выключения (shutdown) для этого процесса.
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
                          (PTOKEN_PRIVILEGES)NULL, 0);

/// Не получилось проверить возвращённое значение AdjustTokenPrivileges.
  if ( (dwRetVal = GetLastError()) != ERROR_SUCCESS) 
  {
     ::MessageBox (NULL,"AdjustTokenPrivileges","Exit Windows",MB_OK); 
     return dwRetVal;
  }
/// Выключаем или перезагружаем в соответствие с ExitFlags
  ::MessageBox ( NULL,
                 "Restarting Windows",
                 "System settings has changed",
                 MB_OK); 
  if (!ExitWindowsEx(ExitFlags, 0)) 
  {
     ::MessageBox (NULL,
                   "Error While trying to exit",
                   "Exit Windows",
                   MB_OK); 
     return (GetLastError());
  }

  return ERROR_SUCCESS;
}


DWORD  MyRestartWindows()
{
  return _MyExitWindows(EWX_LOGOFF|EWX_REBOOT);
}


DWORD   _MyChangeFontSize(unsigned short* lpszFontSize)
{ 
  // строка размера шрифта должна быть в формате unicode
  HMODULE hModule;
  hModule = LoadLibrary("syssetup.dll");
  if (hModule == NULL) 
  {
     return (GetLastError());
  }

  typedef DWORD  (WINAPI* MYPROC) (HANDLE,LPWSTR);
    MYPROC ProcAdd; 

    ProcAdd = (MYPROC) GetProcAddress(hModule,
                                      "SetupChangeFontSize"); 
    if (ProcAdd == NULL) 
  {
     return (GetLastError());
  }

//////////////////////////////////////////////////////////////////
/// Изменение размера шрифта:
/// SetupChangeFontSize имеет на входе два параметра:
///     Дескриптор (Handle) вызывающего окна (я использую NULL)
///     строка размера шрифта в формате unicode:
///     L"120" для больших (Large) шрифтов
///     L"96"  для маленьких (Small) шрифтов
///  SetupChangeFontSize вернёт 0 если операция прошла успешно.
  DWORD dwRetVal;
  dwRetVal = (ProcAdd) (NULL,lpszFontSize); 
  if (dwRetVal != ERROR_SUCCESS)
  {
     return dwRetVal;
  }
////////////////////////////////////////////////////////////////

  if ( !(FreeLibrary(hModule)) )
  {
     return (GetLastError()); 
  }
  return ERROR_SUCCESS;
}


void   Change2LargeFonts()
{
  DWORD  dwRetVal = _MyChangeFontSize(L"120");
  if (dwRetVal == ERROR_SUCCESS)
  {
     MyRestartWindows();
  }
}


void   Change2SmallFonts()
{
  DWORD    dwRetVal = _MyChangeFontSize(L"96");
  if (dwRetVal == ERROR_SUCCESS)
  {
     MyRestartWindows();
  }
}


int main(int argc, char* argv[])
{
  //  Change2LargeFonts();
  Change2SmallFonts();
  return 0;
}


PM MAIL   Вверх
586
Дата 8.5.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Описание шрифта (LOGFONT) можно получить и изменить с помощью функции SystemParametersInfo, с помощью параметров SPI_GETNONCLIENTMETRICS и SPI_SETNONCLIENTMETRICS. http://msdn.microsoft.com/en-us/library/ms724506(VS.85).aspx

Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    NONCLIENTMETRICS ncm;
    ncm.cbSize = sizeof(ncm);
    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);

    Caption = ncm.lfMenuFont.lfFaceName;
}

А изменить цвета с помощью функции SetSysColors.
Код
int elements[] = {COLOR_WINDOWTEXT};
COLORREF values[] = { RGB(0, 0, 255) };

SetSysColors(1, elements, values);


Это сообщение отредактировал(а) 586 - 9.5.2009, 00:29
PM   Вверх
Agentx86
Дата 10.5.2009, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



586, спасибо за примеры. Это частично мне помогло, но хочется именно то что я искал.
К примеру шрифт я смог изменить в окнах, а на рабочем столе нет. Изменять цвет я могу конкретного элемента, а хочется переключаться темы. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.