Форум программистов, компьютерный форум CyberForum.ru

MFC WinApi для создания интерфейса - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
Rybis
0 / 0 / 0
Регистрация: 13.02.2014
Сообщений: 16
10.07.2014, 20:11     MFC WinApi для создания интерфейса #1
В общем я хочу научиться делать приложения простым языком форма с кнопочками и это приложение должно обращаться к винде залазить в файлы и тд. Слышал о функциях WinApi Как бы они решают мою проблему с обращением к винде а вот форму тоже в Api Делать? Да и в общем MFC Это упрощение winapi?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
10.07.2014, 20:13     MFC WinApi для создания интерфейса #2
Цитата Сообщение от Rybis Посмотреть сообщение
Да и в общем MFC Это упрощение winapi?
- MFC это высокоуровневая надстройка над АПИ, позвоялет экономить код, а главное время на разработку

Этапы создания MFC приложения
Мои MFC поделки
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
10.07.2014, 22:34     MFC WinApi для создания интерфейса #3
Цитата Сообщение от Rybis Посмотреть сообщение
MFC. Это упрощение winapi?
Это "обертка" к WinAPI. Одна из многих, зато "искаропки". Для простых/стандартных интерфейсов более, чем достаточна.

MFC шаг за шагом
-=ЮрА=-
10.07.2014, 22:51
  #4

Не по теме:

Цитата Сообщение от gazlan Посмотреть сообщение
Для простых/стандартных интерфейсов более, чем достаточна.
- не только простых, подходит для проектирования интерфейсов любой сложности, в том числе и со скинами.

Avazart
 Аватар для Avazart
6896 / 5136 / 251
Регистрация: 10.12.2010
Сообщений: 22,568
Записей в блоге: 17
10.07.2014, 23:45     MFC WinApi для создания интерфейса #5
Да но кроме еще есть VCL и Qt и другие "окна", но начинать лучше с WinApi - хотя бы для понимания что оно такое и как оно выглядит.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.07.2014, 00:12     MFC WinApi для создания интерфейса #6
Если ты хочешь делать простые (без нучиться) - то юзай Visual Basic или Delphi, если хочешь именно научиться, то однозначно Qt и лучше с линуксом )
Avazart
11.07.2014, 00:28
  #7

Не по теме:

Цитата Сообщение от abit Посмотреть сообщение
Если ты хочешь делать простые (без нучиться) - то юзай Visual Basic или Delphi, если хочешь именно научиться, то однозначно Qt и лучше с линуксом )
Кто сказал что нельзя учиться на Delphi ?
Везде свои нюансы, в том числе Qt

Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
11.07.2014, 00:42     MFC WinApi для создания интерфейса #8
MFC? Ну, если только нужен диалог с двумя с половиной кнопками, да и это в этом случае я бы лучше WTL взял. Для чего-нибудь более сложного это очень, кхм, сомнительный выбор
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
11.07.2014, 00:57     MFC WinApi для создания интерфейса #9
Цитата Сообщение от Voivoid Посмотреть сообщение
Для чего-нибудь более сложного это очень, кхм, сомнительный выбор
Немного больше, чем 2.5
Миниатюры
MFC WinApi для создания интерфейса  
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
11.07.2014, 01:32     MFC WinApi для создания интерфейса #10
Цитата Сообщение от gazlan Посмотреть сообщение
Немного больше, чем 2.5
Ну да, пяток кнопочек, пяток textbox'ов и график ( ну еще куча табов с непонятно каким содержимым ). И? Что ты этим хотел сказать-то? Что на MFC при желании можно писать GUI приложения? Можно, никто с этим вроде не спорит. Что можно делать легко и непринужденно красивые и комплексные интерфейсы? Нет, не убедил ( то, что у тебя на скриншоте ты же надеюсь не считаешь чем-то таким выдающимся? ).
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
11.07.2014, 02:00     MFC WinApi для создания интерфейса #11
Цитата Сообщение от Voivoid Посмотреть сообщение
красивые и комплексные интерфейсы
Многое, из того, чем пользуюсь (и выбрал, как лучшее в своем классе), сделано именно на MFC. Почтовый клиент, например. Или программа визуального сравнения файлов (на скриншоте). Для себя я тоже выбрал MFC.
Миниатюры
MFC WinApi для создания интерфейса  
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
11.07.2014, 02:10     MFC WinApi для создания интерфейса #12
gazlan, извиняюсь, что вмешиваюсь, но это не такое уж сложное приложение, опять же. Одна менюшка, десяток однотипных кнопочек и 2 richtextbox, которые из коробки поддерживают выделение и подсветку. Хотя может в MFC нету их, но контрол самый обычный.

Для сравнения: подобная формочка на WPF делается за час. От знакомых Qt-шников слышал, что там даже еще проще. Ну и рендер на видюхе как бонус.

MFC WinApi для создания интерфейса

ну а как изменить внешний вид кнопки (например, сделать её овальной), если честно, на MFC даже думать не хочу.. Если даже на каких-нибудь винформах это сводится к написанию своего юзерконтрола и переопределением миллиона методов/событий и тп, но на нижних уровнях там по-моему такой ад, что обычный ответ, который я слышал, "используйте другую технологию или используйте, что есть".
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
11.07.2014, 02:41     MFC WinApi для создания интерфейса #13
Цитата Сообщение от Psilon Посмотреть сообщение
сделать её овальной
Проще всего, использовать картинку (обычно, так делается в играх). Но можно и самому нарисовать что угодно, перекрыв виртуальный метод Draw: любой формы, с градиентной заливкой итд. Полно примеров в Google.
Non-Rectangular Control Buttons
Circular Push Button
Миниатюры
MFC WinApi для создания интерфейса  
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
11.07.2014, 02:51     MFC WinApi для создания интерфейса #14
Цитата Сообщение от gazlan Посмотреть сообщение
Проще всего, использовать картинку (обычно, так делается в играх). Но можно и самому нарисовать что угодно, перекрыв виртуальный метод Draw: любой формы, с градиентной заливкой итд. Полно примеров в Google.
Non-Rectangular Control Buttons
Circular Push Button
Кто бы сомневался, что можно. Понятное дело, что если очень захотеть, то все можно. Вопрос-то в удобстве. Писать кучу кода чтобы сделать овальную кнопку было нормально лет 15-20 назад. Но сейчас это дичь какая-то. Технологии давно уже скакнули вперед, какой смысл оставаться на месте
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
11.07.2014, 03:01     MFC WinApi для создания интерфейса #15
gazlan, класс.

Овальная кнопка на MFC:
Кликните здесь для просмотра всего текста
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
    // MyBtn.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "MyBtn.h"
     
    #include "MemDC.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CMyBtn
     
    CMyBtn::CMyBtn()
    {
    }
     
    CMyBtn::~CMyBtn()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CMyBtn, CButton)
    //{{AFX_MSG_MAP(CMyBtn)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CMyBtn message handlers
     
    void CMyBtn::SetRound(void)
    {
    HRGN rgn;
    CRect wrect;
    GetClientRect(&wrect);
    SetWindowRgn( NULL, FALSE );
    rgn = CreateEllipticRgn( wrect.left, wrect.top,
    wrect.right, wrect.bottom );
     
    SetWindowRgn(rgn, TRUE);    
    }
     
    void CMyBtn::GradientFill (CDC* pDC, CRect* pRect)
    {
    CBrush* pBrush[64];
     
    for (int i=0; i<64; i++)
    {
    pBrush[i] = new CBrush (RGB (0, 0, 255 - (i * 4)));
    }
     
    int nWidth = pRect->Width ();
    int nHeight = pRect->Height ();
    CRect rect;
     
    for (i=0; iFillRect (&rect, pBrush[(i * 63) / nHeight]);
    }
    for (i=0; i<64; i++)
    delete pBrush[i];
    }
    void CMyBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    // TODO: Add your code to draw the specified item
    CRect Rect = lpDrawItemStruct->rcItem;
    CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    CRgn rgn;
    CRect rect;
    rect = Rect;
    UINT state = lpDrawItemStruct->itemState;
    CMemDC  *pMemDC = new CMemDC( pDC, Rect);
    CBrush hbr;
    hbr.CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
    //pDC->FillRect( &Rect, &hbr);
    pMemDC->FillRect( &Rect, &hbr);
    hbr.DeleteObject();
    if( !(state & ODS_DISABLED) )
    {
    if (state & ODS_SELECTED)
    {
    CPen pen( PS_SOLID, 2, GetSysColor( COLOR_3DHILIGHT ) );
    CPen *pPen;
    CPoint start, end;
    start.x = rect.left;
    start.y = rect.bottom;  
    end.x = rect.right;
    end.y = rect.top;
    rect.left += 2;
    rect.top += 2;
    rect.right -= 2;
    rect.bottom -= 2;
    pPen = pMemDC->SelectObject( &pen );
    pMemDC->Arc( &rect, start, end );
    pMemDC->SelectObject( pPen );
    pen.DeleteObject();
    }
    }
    rgn.CreateEllipticRgn( rect.left, rect.top,
    rect.right, rect.bottom );
    pMemDC->SelectClipRgn( &rgn );  
    GradientFill( pMemDC, &Rect );
    SetRound();
    CString title;
    GetWindowText( title );
    if( title.GetLength() != 0 )
    {
    DrawWhiteText( pMemDC, &Rect, title );
    title.ReleaseBuffer();
    }
    delete pMemDC;
    }
    void CMyBtn::DrawWhiteText(CDC* pDC, CRect* pRect, CString& text )
    {
    CFont font;
    int nHeight = -16;
    font.CreateFont (nHeight, 0, 0, 0, FW_BOLD,
    TRUE, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS,
    CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH |
    FF_DONTCARE, "Times New Roman");
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB (255, 255, 255));
    CFont* pOldFont = pDC->SelectObject (&font);
    pDC->DrawText (text, -1, pRect, DT_SINGLELINE | DT_CENTER |
    DT_VCENTER);
    pDC->SelectObject (pOldFont);
    }

овальная кнопка на WPF (на Qt писал только в консоли, поэтому не могу судить насколько там удобно, но говорят, удобнее, чем WPF):
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
<Button x:Name="btn" Height="30" Width="100" Background="Transparent" BorderThickness="0" BorderBrush="Transparent">
  <Button.Content>
    <Border CornerRadius="5" Height="25" Width="95" Margin="0" BorderBrush="Black" BorderThickness="4" >
      <TextBlock Text="Click on Me" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Border>
  </Button.Content>
</Button>
это если использовать градиент. Если использовать просто "круглая кнопка", то одна строчка

имхо несколько различная сложность написания... (не говоря уже про умные слова вроде "сопровождаемость" и "читабельность").
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
11.07.2014, 03:40     MFC WinApi для создания интерфейса #16
Цитата Сообщение от Psilon Посмотреть сообщение
несколько различная сложность написания
Один мой знакомый часто говорил: "язык неважен - программы пишутся на библиотеках".

Любители овальных кнопок пишут (или находят готовым) этот код один раз и используют "до конца жизни". И такое (библиотечное) использование для них ничем не отличается от вашего примера.

А вот результирующий (бинарный) код может оказаться и компактнее и быстрее. Что выбирать: Low level или RAD - зависит от целей. Где-то экономят байты и пишут на Asm, в другом месте признают только Fortran, а где-то и C# сойдет.

Раз все эти среды живы - значит востребованы. У каждой есть своя ниша.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
11.07.2014, 04:05     MFC WinApi для создания интерфейса #17
Цитата Сообщение от gazlan Посмотреть сообщение
У каждой есть своя ниша
Но у MFC не давно осталось своей ниши. Её заняли как минимум Qt и htmlayout
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
11.07.2014, 06:00     MFC WinApi для создания интерфейса #18
Цитата Сообщение от Voivoid Посмотреть сообщение
Qt и htmlayout
Думаю, за все время (а для Win'32 просматриваю много), HTMLayout встретился раза два или три. Qt попадается. Засилье Delphi. Возможно, для других платформ ситуация иная.
uglyPinokkio
11.07.2014, 07:09
  #19

Не по теме:



Цитата Сообщение от gazlan Посмотреть сообщение
Многое, из того, чем пользуюсь (и выбрал, как лучшее в своем классе)
А можно аргументы за ExamDiff против KDiff3 ?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2014, 08:08     MFC WinApi для создания интерфейса
Еще ссылки по теме:

Реализация графического интерфейса пользователя в приложениях WinAPI. Ошибка default C++
Литература для создания элементарного языка управляющих сигналов и интерпретатора для него C++
Приложение для сортировки массива в MFC C++

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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,297
Завершенные тесты: 1
11.07.2014, 08:08     MFC WinApi для создания интерфейса #20
По поводу MFC мне бы хотелось процитировать высказывание одного человека, с мнением
которого я почти полностью согласен.

SV.
Как много людей берется обскакать MFC, не понимая, в чем ее фишка. Да, как библиотека
контролов MFC — тоненькая обертка над Win API и не поддерживает ничего сверх того.
Языков разметки, утилизации трехмерного ускорителя и так далее. Как у инструмента
создания SDI- и MDI-приложений, у этой библиотеки нет конкуретнов, а если есть — я
хочу их знать! Просто очень много людей создает bells and whistles software, и очень мало —
software для созидания. Последнее, разумеется, почти (?) полностью состоит из SDI- и
MDI-приложений.

Разумеется, классы Doc/View не бог весть какая трудоемая задача, и их можно прикрутить
хоть к Qt, хоть к HTMLayout, но это надо делать (и потому нет стандарта де-факто и де-юре).
Между тем, к MFC существуют расширители. Наборы классов для создания визиоподобных
приложений, например. Сейчас все это подыхает, как и созидательный софт вообще, а
когда-то так цвело пышным цветом. Стингрей, Дундас и кто там еще. Не говоря про
внутренние библиотеки-деривативы, которые были вполне interchangeable. Можно было с
одного грамотно написанного проекта взять представление документа и встроить в любой
другой грамотно написанный проект за пару дней. Грамотно написанных проектов только
почти не было. Какой-нибудь неграмотный мудак с полным непониманием ООП и MVC
обычно брал View и втыкал в нее все данные, операции, сериализацию и т.д.

Кроме того, поддержка DI со стороны IDE тоже значила многое.

Классы контролов, OLE и прочего функционала добавлялись, чтоб программистам "креативного"
софта по два раза не вставать. Сейчас этот аспект MFC улучшен сторонними производителями:
BCG, CodeJock и сотнями энтузиастов с CodeProject'а, но не настолько, чтобы конкурировать с
Qt/HTMLayout и компанией. Последнее и устаревший язык библиотеки, конечно, губят ее и
почти уже погубили.

...

Я очень сильно извиняюсь, но это и есть bells and whistles. Свистелки-перделки. Например,
сетевая активность в виде графика. Обоснование для таких графиков может быть одно —
реальное время слежения. Но для реального времени нужен простейший график, который
программируется за час. Все графические навороты вокруг рисования графика (зуминги,
риски на осях, сопоставления нескольких графиков, наложение фонов) в реальном времени
не нужны — вы просто не успеете с ними управляться. Соответственно, все, что нужно для
работы с графиками со стороны сетевого экрана для НАСТОЯЩЕЙ аналитики — сохранение
логов в CSV/XML, откуда можно их загрузить в любой аналитический софт. Соответственно,
вы пишете или сетевой экран с экспортом, простейшей менюшкой с командами типа "Открыть
папку с логами" и простейшим графиком реального времени, или аналитический софт с
загрузкой/сохранением, но тогда вам НЕ НУЖНЫ контролы (aka компоненты), а нужно, в
первую очередь, поддержать документ с данными и его многочисленные представления:
табличное, графическое и пр.

Такой подход с нынешним юзером не работает. Он, ленивая скотина, хочет чувствовать себя
защищенным, но ни хрена не хочет анализировать и вообще работать с данными, хочет
чувствовать ситуацию под контролем, но не пытаясь разобраться в "контролируемом" предмете.
Для таких и нужны навороченные графики реального времени и вообще GUI к задачам,
которые традиционно были демонами.

Мой поинт в том, что вы рассматриваете исключительно свистелки и сравниваете библиотеки
для их создания, включая в список MFC, которая, вообще-то, предназначалась не для этого, а
для создания полезного софта, которому действительно нужен GUI. В дивном новом мире
айфонов она, бедолага, конечно, оказывается неконкурентоспособной.

Еще раз: возьмите десктопное приложение под большую винду (это ваше изначальное
ограничение), ценность GUI для которого неоспорима. То есть, не сетевой экран со свистом.
Что это будет? В доброй половине случаев — приложение с документом в центре. То есть,
приложение, для которого контролы/компоненты оказываются на сугубо вспомогательных
ролях, как и библиотеки, построенные вокруг компонентно-контрольных форм.
Yandex
Объявления
11.07.2014, 08:08     MFC WinApi для создания интерфейса
Закрытая тема Создать тему
Опции темы

Текущее время: 20:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru