Внешний вид контролов.
От: bazuna  
Дата: 03.07.07 20:07
Оценка:
Здравствуйте!

Почему, если создавать какой-нибудь контрол, например кнопку,
следующим способом:
Create Window("BUTTON", "Button", 
              WS_VISIBLE | WS_CHILD  | BS_DEFPUSHBUTTON,
              10, 10, 50, 21, hParent, NULL, hInstance, NULL);


создается убогая кнопка в "старом стиле". В то время, когда
такую же кнопку создаешь с помощью редактора ресурсов,
в итоге она получается красивая и аккуратная.

Может у кого имеется простой пример на эту тему?

04.07.07 00:17: Перенесено модератором из 'Пользовательский интерфейс: проектирование, usability' — Хитрик Денис
Re: Внешний вид контролов.
От: SeLarin Россия http://selarin.livejournal.com
Дата: 03.07.07 20:43
Оценка:
Здравствуйте, bazuna, Вы писали:

B>создается убогая кнопка в "старом стиле".

А манифест к приложению приложен? Сорри за тавтологию.
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: Внешний вид контролов.
От: bazuna  
Дата: 05.07.07 10:48
Оценка:
Здравствуйте, SeLarin, Вы писали:

B>А манифест к приложению приложен? Сорри за тавтологию.


В том то и дело, что манифест мне не нужен.
На создаваемых контролах шрифт огромный и не MS Sans Serif.
Нашел выход — после создания контрола присваивать ему другой
шрифт. Может есть какой другой способ или когда создаешь контрол
вручную всегда придется назначать ему другой фонт.

Да и еще вопрос. Чтобы приложение было в стиле ХР, всегда придется
манифестом пользоваться? Другие способы есть?
Re[3]: Внешний вид контролов.
От: SeLarin Россия http://selarin.livejournal.com
Дата: 05.07.07 18:24
Оценка:
Здравствуйте, bazuna, Вы писали:

B>Здравствуйте, SeLarin, Вы писали:


B>>А манифест к приложению приложен? Сорри за тавтологию.


B>В том то и дело, что манифест мне не нужен.

B>На создаваемых контролах шрифт огромный и не MS Sans Serif.
Ну да. Стандартное поведение.

B>Нашел выход — после создания контрола присваивать ему другой

B>шрифт. Может есть какой другой способ или когда создаешь контрол
B>вручную всегда придется назначать ему другой фонт.
Использовать диалоги?

B>Да и еще вопрос. Чтобы приложение было в стиле ХР, всегда придется

B>манифестом пользоваться? Другие способы есть?
Насколько я знаю — нет.
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[4]: Внешний вид контролов.
От: bazuna  
Дата: 08.07.07 20:38
Оценка:
Здравствуйте, SeLarin, Вы писали:

B>>Да и еще вопрос. Чтобы приложение было в стиле ХР, всегда придется

B>>манифестом пользоваться? Другие способы есть?
SL>Насколько я знаю — нет.

А что тогда дает Visual Styles API? Какой эффект от него?
Re[5]: Внешний вид контролов.
От: SeLarin Россия http://selarin.livejournal.com
Дата: 09.07.07 05:30
Оценка:
Здравствуйте, bazuna, Вы писали:

B>А что тогда дает Visual Styles API? Какой эффект от него?

Во-первых

If you want your application to use visual styles, you must add an application manifest that indicates that ComCtl32.dll version 6 should be used if it is available. Version 6 includes some new controls and new options for other controls, but the biggest change is support for changing the appearance of controls in a window.

Ну а Visual Styles API позволяет управлять отрисовкой контролов. Подробнее можно прочитать на странице "Using Windows XP Visual Styles" в MSDN.
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[3]: Внешний вид контролов.
От: StDenis Россия  
Дата: 10.07.07 13:13
Оценка:
B>На создаваемых контролах шрифт огромный и не MS Sans Serif.
B>Нашел выход — после создания контрола присваивать ему другой
B>шрифт. Может есть какой другой способ или когда создаешь контрол
B>вручную всегда придется назначать ему другой фонт.
дык вполне такой нормальный способ:
SendMessage( hwndCtrl, WM_SETFONT, ( WPARAM ) SendMessage( hwndParent, WM_GETFONT, 0, 0 ), 0 );

или нет?
Re[4]: Внешний вид контролов.
От: Пётр Седов Россия  
Дата: 10.07.07 18:00
Оценка:
Здравствуйте, StDenis, Вы писали:
SD>дык вполне такой нормальный способ:
SD>
SendMessage( hwndCtrl, WM_SETFONT, ( WPARAM ) SendMessage( hwndParent, WM_GETFONT, 0, 0 ), 0 );

SD>или нет?
Не обязательно parent-окно осмысленно обрабатывает сообщение WM_GETFONT. Например, DefWindowProc(hWindow, WM_GETFONT, 0, 0) возвращает ноль. По-моему, лучше так:
inline void SetFont(HWND hControl, HFONT hFont, bool Repaint)
{
  assert(IsWindow(hControl));
  assert(GetObjectType(hFont) == OBJ_FONT);
  SendMessage(hControl, WM_SETFONT, reinterpret_cast<WPARAM>(hFont), Repaint);
}

HWND CreateButton(HWND hParent, ...)
{
  assert(IsWindow(hParent));
  HWND hButton = CreateWindowEx(..., hParent, ...);
  ...
  HFONT hFont = static_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT));
  SetFont(hButton, hFont, /*Repaint:*/false);
  ...
  return hButton;
}
Пётр Седов (ушёл с RSDN)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.