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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток всем!)Уважаемые программисты, обращаюсь к Вам за помощью!У меня возникли проблемы при решении следующей задачи: нужно создать главное окно, зарегистрировать его, создать для него соответствующую оконную процедуру,где должна выводиться строка текста(до этого момента проблем не возникло).И вот собственно где проблема: отработать следующее событие: при нажатии ЛЕВОЙ кнопки мыши шрифт для текста изменяется на другой (например из "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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2011, 20:32
Ответы с готовыми решениями:

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

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

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

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

46
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
24.03.2011, 12:45 2
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
130
131
132
#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;   // Шрифты
HFONT hFont = NULL;
 
//---Главная функция 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);
                
                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");
 
        };break;
        // Вывод текста в окно
        case WM_PAINT:
        {
                PAINTSTRUCT ps;      
                HDC hdc;
                hdc = BeginPaint(hwnd, &ps);                        
                
                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: //Отработка события нажатия ЛЕВОЙ кнопки мыши (ЗДЕСЬ ТО И ПРОБЛЕМА!)
        {
                        if (hFont) DeleteObject(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, NULL,TRUE); // можно просто NULL для всей клиентской облости
                        UpdateWindow(hwnd);
        };break;
 
        // Если пользователь удалил окно
        case WM_DESTROY:
        {
                PostQuitMessage(0);
                if (hFont) DeleteObject(hFont);
        }; break;
                
        default: return DefWindowProc(hwnd, msg, wParam, lParam);
        } // Конец оператора switch
        return 0; // 0 а не 01
}// Конец процедуры WinProc
 
//---Функция OnDestroy обработки сообщений WM_DESTROY
void OnDestroy(HWND)
{ 
  PostQuitMessage(0); 
}
2
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 35
26.03.2011, 18:53  [ТС] 3
bobrovskii, СПАСИБО ОГРОМНЕЙШЕЕ!теперь то всё наконец то получилось!очень рад что ты мне помог!ещё раз СПАСИБО!)насколько я понял моя ошибка была в том, что не нужно было специально создавать шрифт в сообщении WM_PAINT,а лучше сразу обработать, а заодно и создать другой в сообщени левой кнопки мыши WM_LBUTTON.ну и насколько вижу ты вроде бы как проверил всё на условие-если уже этот шрифт существует, то удалить его-в WM_LBUTTON и в WM_DESTROY.Благодарю за помощь!)))
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
30.06.2021, 04:56 4
А в текстовом документе возможно менять шрифт и цвет текста?
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
01.07.2021, 17:07 5
А что есть текстовый документ?

Rich Edit умеет редактировать текст с разными цветами и шрифтами:
https://docs.microsoft.com/en-... t-controls
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
03.07.2021, 04:32 6
Цитата Сообщение от politoto Посмотреть сообщение
Rich Edit
я так понял что под Rich Edit есть API функции, которые могут обрабатывать тексты? Где находится эта прога или её нужно качать?
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
03.07.2021, 05:19 7
Код в основном в comctl32.dll
https://docs.microsoft.com/en-... rols-intro
В современные Windows ничего качать не нужно.
Это тот элемент управления, который используется во wordpad.exe ( можно открывать также командой write ).
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
03.07.2021, 06:37 8
А
Цитата Сообщение от politoto Посмотреть сообщение
wordpad.exe
может поддерживать картинки в тексте или эта штука работает строго с текстом?
Я так понял что эти функции обрабатывают файлы с расширением от wordpad?
Получается что мы открываем файл функцией write и обрабатываем текст используя API Rich Edit, что почти равносильно обработке информации через с++, можно конечно и своё приложение сделать и API к нему но у Виндовс есть очень много средств о которых многие не задумываются которые позволяют решать 90% задач и ничего не нужно качать, я то если честно всего изучить тоже не могу.
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
03.07.2021, 07:11 9
Старинный пример приложения MFC, использующего Rich Edit, и напоминающего Wordpad из Windows XP
https://github.com/microsoft/V... le/wordpad
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
03.07.2021, 08:35 10
Цитата Сообщение от politoto Посмотреть сообщение
Старинный пример приложения MFC, использующего Rich Edit, и напоминающего Wordpad из Windows XP
Так всё таки Rich Edit это Wordpad или нет? Есть полноценное им управление или нет только частичное?
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
03.07.2021, 09:04 11
Nexi99, Wordpad.exe только использует Rich Edit Control.
Ваша программа может сама создать такое текстовое окошко внутри своих окон.

Как создавать и управлять, можно узнать из документации и примеров
https://docs.microsoft.com/en-... t-controls

PS c DLL я немного наврал. В разных версиях был зоопарк разных DLL.
Wordpad.exe из моей копии Windows использует Msftedit.dll
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
05.07.2021, 01:59 12
Цитата Сообщение от politoto Посмотреть сообщение
Ваша программа может сама создать такое текстовое окошко внутри своих окон.
а зачем создавать окошко Rich Edit Control Wordpad.exe нельзя использовать?
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
05.07.2021, 08:43 13
Если не хочется создавать своё окошко, проще использовать Microsoft Word для генерации документов
https://docs.microsoft.com/en-... g-visual-c

Или window-less Rich Edit.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
05.07.2021, 20:23 14
Цитата Сообщение от politoto Посмотреть сообщение
проще использовать Microsoft Word для генерации документов
а на с++ там что можно программировать? Ничего только на VB который там есть нужно ещё 1 язык учить а я к сожалению не бессмертный хоть и соблазн попробовать разные языки есть. Так я и не понял про Rich Edit может ли он управлять/взаимодействовать с Wordpad или нет?
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
06.07.2021, 11:47 15
Объектная модель традиционного Microsoft Office позоволяет управлять его приложениями на разных языках
https://docs.microsoft.com/en-... sual-c-mfc

WordPad.exe управляет встроенным в него окном Rich Edit, используя предназначенные для этого стандартные программные интерфейсы Windows. Вы можете написать свой аналог Wordpad, и использовать те же готовые программные механизмы.
А Wordpad.exe удалить.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
06.07.2021, 22:59 16
Цитата Сообщение от politoto Посмотреть сообщение
Объектная модель традиционного Microsoft Office позоволяет управлять его приложениями на разных языках
https://docs.microsoft.com/en-... sual-c-mfc
Ни картинок где что нажимать, а что такое Microsoft Developer Studio тоже не понятно ни нормального описания классов что они делают функции под Rich Edit мне понравились больше.
Я так понимаю что есть API под Rich Edit? А последний Rich Edit управляет Wordpad, мне бы в принципе его хватило, картинки смотрю тоже туда вставляются. Да вот только что такое Rich Edit, я без понятия, не видел как выглядит окно этой проги.
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
07.07.2021, 07:05 17
Это дочернее окно внутри Wordpad'а ( "лист бумаги", в котором редактируется текст )
В моей копии Windows 10 у него класс RICHEDIT50W
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
08.07.2021, 00:32 18
Цитата Сообщение от politoto Посмотреть сообщение
Это дочернее окно внутри Wordpad'а
Своего рода вспомогательное окно. Я вчера читал про Rich Edit пишут что нужно ещё окно создать да и вы об этом писали далее подключаются библиотеки с классами и функциями. Я думал это окно уже создано и его можно вывести и к нему можно подключиться. Ладно а это что за функции https://docs.microsoft.com/en-... -functions это для того чтобы редакторы самому делать с 0-ля?
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
08.07.2021, 10:47 19
Рисовать тексты бывает нужно не только в текстовых редакторах.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
08.07.2021, 22:48 20
Цитата Сообщение от politoto Посмотреть сообщение
Рисовать тексты бывает нужно не только в текстовых редакторах.
а для создания текстовых редакторов можно использовать эти функции и печатать ими текст красить имеется в виду обрабатывать если к примеру Rich Edit не устраивает, я так понимаю он это готовое решение для программной работы с текстом а пост выше это базовые изначальные функции. Хотелось бы поинтересоваться а как сохранить файл с набранным программно текстом?
0
08.07.2021, 22:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2021, 22:48
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru