Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/137: Рейтинг темы: голосов - 137, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 35

Смена шрифта для текста в WinAPI

23.03.2011, 20:32. Показов 28949. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем!)Уважаемые программисты, обращаюсь к Вам за помощью!У меня возникли проблемы при решении следующей задачи: нужно создать главное окно, зарегистрировать его, создать для него соответствующую оконную процедуру,где должна выводиться строка текста(до этого момента проблем не возникло).И вот собственно где проблема: отработать следующее событие: при нажатии ЛЕВОЙ кнопки мыши шрифт для текста изменяется на другой (например из "Times New Roman"--->"Monotype Corsiva").Программирую я на Visual C++ 6.0.И вся проблема в том, что компилятор у меня не ругается, но и не меняет шрифт для строки текста.Всем СПАСИБО заранее!)Ниже приведены мои старания.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "stdafx.h"   // Обязательно включаемые файлы
#include "string.h"
#include "stdlib.h"
#include "windows.h"
 
//---Прототип исп. ф-ии
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);      //Оконная ф-я главного окна
BOOL OnCreate(HWND, LPCREATESTRUCT); // Прототип ф-ии OnCreate
void OnPaint(HWND); // Прототип ф-ии OnPaint
void OnDestroy(HWND);   // Прототип ф-ии OnDestroy
 
//---Глобальные переменные
HINSTANCE hInst; 
HFONT hFont1, hFont2;   // Шрифты
 
//---Главная функция WinMain
int APIENTRY WinMain(HINSTANCE hInstance,
                              HINSTANCE hPrevInstance,
                              LPSTR     lpCmdLine,
                              int       nCmdShow)
{ char szClassName[] = "MainWindow";          // Имя класса
  char szTitle[] = "Главное Окно";   // Заголовок окна
  MSG Msg;      // Структура Msg типа MSG для получения сообщений Windows
  WNDCLASS wc;  // Структура wc типа WNDCLASS для задания характеристик окна
  HWND hwnd;  // Дескриптор окна приложения
 
//---Регистрация главного окна
  ZeroMemory(&wc, sizeof(wc));  
  wc.lpfnWndProc = WndProc;                     
  wc.hInstance = hInstance;    
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);   
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);     
  wc.hbrBackground = GetStockBrush(WHITE_BRUSH); 
  wc.lpszClassName = szClassName;                       
 
//---Регистрируем главное окно
  RegisterClass(&wc);
 
hwnd = CreateWindow( szClassName,           
                            szTitle,                
                            WS_OVERLAPPEDWINDOW,    
                            0,                      
                            0,                      
                            GetSystemMetrics(SM_CXFULLSCREEN),                  
                            GetSystemMetrics(SM_CXFULLSCREEN),                  
                            HWND_DESKTOP,                   
                            NULL,                   
                            hInstance,              
                            NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);     
 
//---Запуск цикла обработки сообщений
    while(GetMessage(&Msg, NULL, 0, 0))
    {
        
        TranslateMessage(&Msg);
    
        DispatchMessage(&Msg);
    }
    return Msg.wParam;  
 
} // Конец функции WinMain  
 
//---Оконная функция WndProc главного окна
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ 
    static char text1[]="ПРИВЕТ";
    static char text2[]="ВСЕМ";
    static RECT rc;
    static int x1,y1;
    static TEXTMETRIC tm;
    POINT cp;
    GetClientRect(hwnd,&rc);
 
    switch(msg) //Переход по значению msg - номеру сообщения            
    {   
 
    // Задание начальных координат вывода текста
    case WM_CREATE:
    {
        HDC hdc=GetDC(hwnd);    
        GetTextMetrics(hdc,&tm);
        x1=(GetSystemMetrics(SM_CXSCREEN)-tm.tmAveCharWidth*strlen(text1))/2;
        y1=(GetSystemMetrics(SM_CYSCREEN)-tm.tmHeight)/2;
        ReleaseDC(hwnd,hdc);
    };break;
    // Вывод текста в окно
    case WM_PAINT:
    {
        PAINTSTRUCT ps;      
        HDC hdc;
        hdc = BeginPaint(hwnd, &ps);
        HFONT
            hFont=CreateFont(15,5,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH,"Times New Roman");
        
        SelectObject(hdc,hFont);
 
        TextOut(hdc,x1,y1-10,text1,strlen(text1));
        TextOut(hdc,x1,y1+10,text2,strlen(text2));
        DeleteObject(hFont);
        EndPaint(hwnd, &ps);
    };break;
 
    case WM_LBUTTONDOWN: //Отработка события нажатия ЛЕВОЙ кнопки мыши (ЗДЕСЬ ТО И ПРОБЛЕМА!)
    {
        
            HFONT hFont=CreateFont(15,5,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH,"Monotype Corsiva");
 
            InvalidateRect(hwnd,&rc,TRUE);
            UpdateWindow(hwnd);
    };break;
 
    // Если пользователь удалил окно
    case WM_DESTROY:
    {
        PostQuitMessage(0);
    }; break;
        
    default: return DefWindowProc(hwnd, msg, wParam, lParam);
    } // Конец оператора switch
    return 01;
}// Конец процедуры WinProc
 
//---Функция OnDestroy обработки сообщений WM_DESTROY
void OnDestroy(HWND)
{ 
  PostQuitMessage(0); 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2011, 20:32
Ответы с готовыми решениями:

Смена шрифта во время набора текста
Здравстствуйте Пытаюсь сделать простейший текстовый редактор,на подобии Блокнота. Хочу сделать возможность выбора шрифта в нем. В...

Изменение размера шрифта текста с разными размерами шрифта в RichTextBox
Добрый вечер! Возникла такая проблема - в RichTextBox находится текст, размер которого мы можем изменять из ComboBox. Т.е выделяем фрагмент...

Изменение шрифта для текста в richTextBox
Всем привет еще раз. в Richtextbox есть текст. необходимо при нажатии на кнопку поменять шрифт и размер у этого текста на "Courier...

46
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
13.07.2021, 08:40
Студворк — интернет-сервис помощи студентам
Чтобы самому написать Save() ?
Но тогда ни исходники DLL, ни загадочные дескрипторы не нужны.

Добавлено через 3 часа 12 минут
C++
1
2
3
4
5
6
7
8
9
10
#include <fstream>
 
int main()
{
    std::ofstream("colors.rtf")
    << R"({\rtf1\ansi\ansicpg1251
{ \colortbl; \red255\green0\blue0; \red0\green255\blue0; \red0\green0\blue255;
}\cf1 Красный \cf2 Зелёный \cf3 Синий}
)";
}
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
13.07.2021, 19:09
Цитата Сообщение от politoto Посмотреть сообщение
Чтобы самому написать Save() ?
Но тогда ни исходники DLL, ни загадочные дескрипторы не нужны.
а объясните ваш синтаксис как будет печататься текст? Я читал немного про применение тегов но пока не разобрался со всем этим. Я открывал тему как красить в тот или иной цвет символ но если есть функции WinApi то я думал их и использовать.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
13.07.2021, 22:12
А что конкретно нужно?
Откуда берётся текст, и что с ним нужно сделать?

Вас интересует структура RTF?
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
14.07.2021, 00:48
Цитата Сообщение от politoto Посмотреть сообщение
А что конкретно нужно?
как ставить теги между текстом, как это применять или вы просто написали текст
C++
1
2
3
4
R"({\rtf1\ansi\ansicpg1251
{ \colortbl; \red255\green0\blue0; \red0\green255\blue0; \red0\green0\blue255;
}\cf1 Красный \cf2 Зелёный \cf3 Синий}
)"
а colors.rtf это просто создание файла? Это строка я воспринял это как что-то серьёзное?

Добавлено через 1 минуту
Тупанул в общем.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
14.07.2021, 07:15
Верно. Создали файл colors.rtf и записали в него трёхцветный текст в формате RTF.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
14.07.2021, 16:12
Цитата Сообщение от politoto Посмотреть сообщение
Верно. Создали файл colors.rtf и записали в него трёхцветный текст в формате RTF.
я так понял что у вас просто строка получилась мне не понятно как она красится. Какие части по вашему мнению здесь покрашены должны быть?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
14.07.2021, 16:56
Откройте получившийся файл в Wordpad или LibreOffice и посмотрите.

В таблице \colortbl перечисляются цвета, которые можно дальше использовать в документе ( \cf1 \cf2 etc.).
Со шрифтами похожая схема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.07.2021, 16:56
Помогаю со студенческими работами здесь

Считать из текстового файла параметры шрифта и применить их для текста
в текстовом файле содержатся несколько строк в формате %№вопроса%название шрифта%размер шрифта%цвет%признак ответа% (Признак ответа 1 –...

Одинаковый межстрочный отступ для текста с разным размером шрифта
Посоветуйте пожалуйста, как сделать одинаковый вертикальный отступ допустим в 15px для текста с разным размером шрифта и разным line-height...

Программа для смена текста?
Потскажите программу которая в случии если не переключил язык переписывала на другой что бы не стерать все и непечатать заного?

Изменение шрифта Winapi
Как можно менять шрифт в каждом дочернем окне, при это при изменении размеров окна, чтобы он сохранялся, а не менялся?!

Создать панель инструментов выбора гарнитуры шрифта для выделенного текста
помогите пожалуйста как можно создать панель инструментов, на которой реализовать возможность выбора гарнитуры шрифта, для ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru