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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить размер шрифта на BUTTON 
V
    Опции темы
586
Дата 11.8.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
case WM_SIZE:
        if(!b) break;
        GetClientRect(hWnd, &r);
        GetWindowRect(hB[0], &rb);
        for(int i=0; i<n*n; i++)
        {
            MoveWindow(hB[i], (i%n)*(r.right)/n+0.5,
                              (i/n)*(r.bottom)/n+0.5,
                              (i%n+1)*(r.right)/n-(i%n)*(r.right)/n+0.5,
                              (i/n+1)*(r.bottom)/n-(i/n)*(r.bottom)/n+0.5,
                              true);
            HFONT hFont = CreateFont( rb.bottom/2, 0, 0, 0, 
            FW_NORMAL,
            FALSE, FALSE, FALSE, 
            DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH,
            L"Arial" );
            SendMessage( hB[i], WM_SETFONT, (WPARAM)hFont, (LPARAM)(MAKELONG(TRUE,0) ) );
        }
        break;

Я так понял, шрифт одинаковый для всех кнопок, тогда зачем ты создаешь один и тот же шрифт несколько раз? Создай один шрифт и  отправляй в цикле  с помощью SendMessage WM_SETFONT. И незабывай удалять старый шрифт.
Примерно так:
Код
    case WM_SIZE:
        if(!b) break;
        GetClientRect(hWnd, &r);
        GetWindowRect(hB[0], &rb);
        HFONT hOldFont=(HFONT)SendMessage(hB[0], WM_GETFONT, 0, 0);
        HFONT hFont = CreateFont( rb.bottom/2, 0, 0, 0, 
            FW_NORMAL,
            FALSE, FALSE, FALSE, 
            DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH,
            L"Arial" );
        for(int i=0; i<n*n; i++)
        {
            MoveWindow(hB[i], (i%n)*(r.right)/n+0.5,
                              (i/n)*(r.bottom)/n+0.5,
                              (i%n+1)*(r.right)/n-(i%n)*(r.right)/n+0.5,
                              (i/n+1)*(r.bottom)/n-(i/n)*(r.bottom)/n+0.5,
                              true);
            SendMessage( hB[i], WM_SETFONT, (WPARAM)hFont, (LPARAM)(MAKELONG(TRUE,0) ) );
        }
        DeleteObject((HGDIOBJ)hOldFont);
        break;

PM   Вверх
ZufuS
Дата 11.8.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо. Работает. Не совсем понятно зачем hOldFont
Код

    case WM_SIZE:
        if(!b) break;
        DeleteObject(hFont);
        GetClientRect(hWnd, &r);
        GetWindowRect(hB[0], &rb);
        DeleteObject(hFont);
        hFont = CreateFont( (rb.bottom-rb.top)/4, 0, 0, 0,
        FW_NORMAL,
        FALSE, FALSE, FALSE,
        DEFAULT_CHARSET,
        OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY,
        DEFAULT_PITCH,
        L"Arial" );
        for(int i=0; i<n*n; i++)
        {
            wParam = lParam = NULL;
            MoveWindow(hB[i], (i%n)*(r.right)/n+0.5,
                              (i/n)*(r.bottom)/n+0.5,
                              (i%n+1)*(r.right)/n-(i%n)*(r.right)/n+0.5,
                              (i/n+1)*(r.bottom)/n-(i/n)*(r.bottom)/n+0.5,
                              true);
        SendMessage( hB[i], WM_SETFONT, (WPARAM)hFont, (LPARAM)(MAKELONG(TRUE,0) ) );
        }
        break;

у меня и так работает. Также не совсем понятно что значит HFONT hOldFont=(HFONT)SendMessage(hB[0], WM_GETFONT, 0, 0);
если это для того чтобы сохранить hFont в hOldFont, то чем это отличается от hOldFont = hFont? И надо ли при выходе из программы вызывать DeleteObject для неудалённых объектов?
PM   Вверх
586
Дата 11.8.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ZufuS @  11.8.2007,  22:54 Найти цитируемый пост)
для того чтобы сохранить hFont в hOldFont

да
Цитата(ZufuS @  11.8.2007,  22:54 Найти цитируемый пост)
Не совсем понятно зачем hOldFont

Идея в том, чтобы его окна не использовали, а потом удалить. Поэтому и вызываю DeleteObject после цикла. Я просто не знаю, можно ли шрифт удалять, если он ассоциирован с окном. Решил перестраховаться. smile 
PM   Вверх
ZufuS
Дата 12.8.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ясно, спасибо
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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