0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 30
1

Работа с MFC. Разработка программы MiniDraw

20.01.2017, 23:59. Показов 2102. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здрасте)

тут такая проблемка.

есть ли люди, которые немного разбираются в MFC приложении.

У нас при запуске программы в окне рисуем эллипсы. Надо сделать чтобы по нажатию на ALT рисовала элипсы зеленого цвета.
Помогите кто чем может) куда нужно этот обработчик закинуть по ALT


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
// KGunichDoc.h : interface of the CKGunichDoc class
//
#include "Afxtempl.h"
 
#pragma once
 
class CLine : public CObject
{
protected :
    int m_X1, m_Y1, m_X2 , m_Y2;
public :
    CLine (int X1, int Y1, int X2, int Y2)
    {
        m_X1 = X1; m_Y1 = Y1; m_X2 = X2; m_Y2 = Y2;
    }
    void Draw (CDC *PDC) ;
};
 
class CKGunichDoc : public CDocument
{
protected: // create from serialization only
    CTypedPtrArray<CObArray , CLine*> m_LineArray;
    CKGunichDoc();
    DECLARE_DYNCREATE(CKGunichDoc)
 
// Attributes
public:
 
// Operations
public:
void AddLine (int X1, int Y1, int X2, int Y2) ;
    CLine *GetLine (int Index) ;
    int GetNumLines () ;
 
// Overrides
public:
    virtual BOOL OnNewDocument();
    virtual void Serialize(CArchive& ar);
 
// Implementation
public:
    virtual ~CKGunichDoc();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif
 
protected:
 
// Generated message map functions
protected:
    DECLARE_MESSAGE_MAP()
public:
    virtual void DeleteContents();
    afx_msg void OnEditClearAll();
    afx_msg void OnUpdateEditClearAll(CCmdUI *pCmdUI);
    afx_msg void OnEditUndo();
    afx_msg void OnUpdateEditUndo(CCmdUI *pCmdUI);
};
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// KGunichDoc.cpp : implementation of the CKGunichDoc class
//
 
#include "stdafx.h"
#include "KGunich.h"
 
#include "KGunichDoc.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
 
// CKGunichDoc
 
IMPLEMENT_DYNCREATE(CKGunichDoc, CDocument)
 
BEGIN_MESSAGE_MAP(CKGunichDoc, CDocument)
    ON_COMMAND(ID_EDIT_CLEAR_ALL, &CKGunichDoc::OnEditClearAll)
    ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR_ALL, &CKGunichDoc::OnUpdateEditClearAll)
    ON_COMMAND(ID_EDIT_UNDO, &CKGunichDoc::OnEditUndo)
    ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, &CKGunichDoc::OnUpdateEditUndo)
END_MESSAGE_MAP()
 
 
// CKGunichDoc construction/destruction
 
CKGunichDoc::CKGunichDoc()
{
    // TODO: add one-time construction code here
 
}
 
CKGunichDoc::~CKGunichDoc()
{
}
 
BOOL CKGunichDoc::OnNewDocument()
{
    if (!CDocument::OnNewDocument())
        return FALSE;
 
    // TODO: add reinitialization code here
    // (SDI documents will reuse this document)
 
    return TRUE;
}
 
 
 
 
// CKGunichDoc serialization
 
void CKGunichDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: add storing code here
    }
    else
    {
        // TODO: add loading code here
    }
}
 
 
// CKGunichDoc diagnostics
 
#ifdef _DEBUG
void CKGunichDoc::AssertValid() const
{
    CDocument::AssertValid();
}
 
void CKGunichDoc::Dump(CDumpContext& dc) const
{
    CDocument::Dump(dc);
}
#endif //_DEBUG
 
void CLine::Draw(CDC *PDC)
{
    PDC->MoveTo(m_X1, m_Y1);
    PDC->LineTo(m_X2, m_Y2);
}
void CKGunichDoc::AddLine(int X1, int Y1, int X2, int Y2)
{
    CLine *pLine=new CLine(X1, Y1, X2, Y2);
    m_LineArray.Add(pLine);
}
CLine* CKGunichDoc::GetLine(int Index)
{
    if(Index<0||Index>m_LineArray.GetUpperBound ())
    return 0;
    return m_LineArray.GetAt(Index);
}
 
int CKGunichDoc::GetNumLines()
{
    return (int)m_LineArray.GetSize();
}
 
 
// CKGunichDoc commands
 
void CKGunichDoc::DeleteContents()
{
    // TODO: Add your specialized code here and/or call the base class
int Index=(int)m_LineArray.GetSize();
    while(Index--)
    delete m_LineArray.GetAt (Index);
    m_LineArray.RemoveAll ();
 
    CDocument::DeleteContents();
}
 
void CKGunichDoc::OnEditClearAll()
{
    // TODO: Add your command handler code here
DeleteContents();
    UpdateAllViews(0);
 
}
 
void CKGunichDoc::OnUpdateEditClearAll(CCmdUI *pCmdUI)
{
    // TODO: Add your command update UI handler code here
pCmdUI->Enable((int)m_LineArray.GetSize());
}
 
void CKGunichDoc::OnEditUndo()
{
    // TODO: Add your command handler code here
int Index=(int)m_LineArray.GetUpperBound();
    if (Index>-1)
    {
        delete m_LineArray.GetAt(Index);
        m_LineArray.RemoveAt(Index);
    }
    UpdateAllViews(0);
 
}
 
void CKGunichDoc::OnUpdateEditUndo(CCmdUI *pCmdUI)
{
    // TODO: Add your command update UI handler code here
pCmdUI->Enable((int)m_LineArray.GetSize());
 
}
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
// KGunichView.h : interface of the CKGunichView class
//
 
 
#pragma once
 
 
class CKGunichView : public CView
{
protected: // create from serialization only
    
    CString m_ClassName;
    int m_Dragging;
    HCURSOR m_HCross;
    CPoint m_PointOld;
    CPoint m_PointOrigin;
    CKGunichView();
 
    
 
    DECLARE_DYNCREATE(CKGunichView)
 
// Attributes
public:
    CKGunichDoc* GetDocument() const;
 
// Operations
public:
 
// Overrides
public:
    virtual void OnDraw(CDC* pDC);  // overridden to draw this view
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
    virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
 
// Implementation
public:
    virtual ~CKGunichView();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif
 
protected:
 
// Generated message map functions
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};
 
#ifndef _DEBUG  // debug version in KGunichView.cpp
inline CKGunichDoc* CKGunichView::GetDocument() const
   { return reinterpret_cast<CKGunichDoc*>(m_pDocument); }
#endif
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// KGunichView.cpp : implementation of the CKGunichView class
//
 
#include "stdafx.h"
#include "KGunich.h"
 
#include "KGunichDoc.h"
#include "KGunichView.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
 
// CKGunichView
 
IMPLEMENT_DYNCREATE(CKGunichView, CView)
 
BEGIN_MESSAGE_MAP(CKGunichView, CView)
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
    ON_WM_LBUTTONDOWN()
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
 
// CKGunichView construction/destruction
 
CKGunichView::CKGunichView()
{
    // TODO: add construction code here
m_Dragging = 0;
    m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);
 
}
 
CKGunichView::~CKGunichView()
{
}
 
BOOL CKGunichView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
m_ClassName=AfxRegisterWndClass(
        CS_HREDRAW|CS_VREDRAW, // стили окна
        0,                    // без указателя;
        (HBRUSH)::GetStockObject (WHITE_BRUSH),
                              // задать чисто белый фон;
        0);                   //без значка
    cs.lpszClass = m_ClassName;
 
    return CView::PreCreateWindow(cs);
}
 
// CKGunichView drawing
 
void CKGunichView::OnDraw(CDC* pDC)
{
    CKGunichDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    int Index=pDoc->GetNumLines();
    while(Index--)
        pDoc->GetLine (Index)->Draw (pDC);
 
 
    // TODO: add draw code for native data here
}
 
 
// CKGunichView printing
 
BOOL CKGunichView::OnPreparePrinting(CPrintInfo* pInfo)
{
    // default preparation
    return DoPreparePrinting(pInfo);
}
 
void CKGunichView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: add extra initialization before printing
}
 
void CKGunichView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: add cleanup after printing
}
 
 
// CKGunichView diagnostics
 
#ifdef _DEBUG
void CKGunichView::AssertValid() const
{
    CView::AssertValid();
}
 
void CKGunichView::Dump(CDumpContext& dc) const
{
    CView::Dump(dc);
}
 
CKGunichDoc* CKGunichView::GetDocument() const // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CKGunichDoc)));
    return (CKGunichDoc*)m_pDocument;
}
#endif //_DEBUG
 
 
// CKGunichView message handlers
 
void CKGunichView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
m_PointOld=point;
    m_PointOrigin=point;
 
    SetCapture();
    m_Dragging=1;
    
RECT Rect;
    GetClientRect(&Rect);
    ClientToScreen(&Rect);
    ::ClipCursor(&Rect);
 
    CView::OnLButtonDown(nFlags, point);
}
 
void CKGunichView::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
::SetCursor (m_HCross);
    if (m_Dragging)
    {
        CClientDC ClientDC (this);
        //ClientDC.SetROP2(R2_NOT);
        //ClientDC.MoveTo(m_PointOrigin);
        //ClientDC.LineTo(m_PointOld);
        //ClientDC.MoveTo (m_PointOrigin);
        //ClientDC.LineTo(point);
        //m_PointOld=point;
        
    }        
 
    CView::OnMouseMove(nFlags, point);
}
 
void CKGunichView::OnLButtonUp(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
if (m_Dragging)
    {
        m_Dragging = 0;
        ::ReleaseCapture();
        ::ClipCursor (NULL);
        CClientDC ClientDC (this);
        ClientDC.SetROP2 (R2_NOT);
        ClientDC.MoveTo (m_PointOrigin);
        ClientDC.LineTo (m_PointOld);
        ClientDC.SetROP2 (R2_COPYPEN);
        ClientDC.MoveTo (m_PointOrigin);
        ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y);
        CKGunichDoc* pDoc=GetDocument();
        pDoc->AddLine(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y);
    }
 
    CView::OnLButtonUp(nFlags, point);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.01.2017, 23:59
Ответы с готовыми решениями:

Книги по MFC - разработка оконных приложений
Какие есть хорошие книги по созданию готовых windows приложений, то есть, чтобы ввод был не сконсоли, а было создано окно с кнопками и т.д....

Visual С++. Разработка Windows-приложений с помощью MFC
Комплекс задач по Visual С++. Разработка Windows-приложений с помощью MFC и API-функций - Давыдов В.Г. Ресурсы: меню, ускорители и...

Разработка приложения «Интеллектуальный словарь» на MFC AppWizard (exe)
Срочно!!!Разработка приложения «Интеллектуальный словарь». В файле хранится словарь (пр., русско-английский). Есть возможность перевода...

4
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
21.01.2017, 10:40 2
При нажатом ALT все эллипсы должны рисоваться зелеными или только тот, который пользователь рисует мышкой?
Если все, то можно у CView должен быть OnKeyDown. В нем проверять состояние нажатости ALT, выставлять какую-нибудь переменную-флаг и если она изменилась, то вызывать перерисовку (Invalidate()), а в CKGunichView::OnDraw по этой переменной уже определять каким цветом рисовать.
Если же только один эллипс, то нужно в CLine добавлять переменную для хранения цвета, а проверку ALT'а делать при создании нового эллипса, (т.е. в CKGunichView::OnLButtonUp )
1
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 30
21.01.2017, 11:21  [ТС] 3
Сейчас программа рисует элипсы,но при нажатииAlt она рисует зеленым цветом до тех пор пока он нажат.
Был бы очень плагодарен если это можно было в коде описать ваши действия
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
21.01.2017, 12:14 4
Дело в том что вставить твои куски кода в пустой сгенерированный MFC-проект просто так не получиться, потому что нужны всякие там resource.h, *.rc и другая дребедень. А писать правильный, рабочий и безошибочный код "слету", без отладчика, прямо в браузере, лично я не умею. Поэтому, если хочешь кода, то выкладывай архив с проектом, но VisualStudio у меня старая - 2010. А лучше бы 2008.
1
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 30
22.01.2017, 13:45  [ТС] 5
спасибо большое. все реализовал через создание класса эллипс)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2017, 13:45
Помогаю со студенческими работами здесь

Написание программы с использованием файловых переменных. Разработка программы для работы с текстовым файлом
Помогите пожалуйста : С помощью текстового редактора создать текстовый файл file1. Переписать строки файла file1 в новый текстовый файл...

Поменять стиль MFC-программы
Как это можно сделать в уже созданном проекте? Спасибо.

Правильная архитектура программы на MFC
Здорова! Как правильно создавать программы на mfc чтобы они не подвисали? Какая архитектура должна быть правильная, типо в потоках она...

Работа в MFC
Всем привет. Кто может помочь с написанием программы вот такого типа...

MFC: остановка программы в нужном месте
Есть ли команда в mfc для завершения программы в нужном месте? Например при выполнении определенного условия программа завершается. Можно...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
Apache Airflow для оркестрации и автоматизации рабочих процессов
Mr. Docker 16.03.2025
Управление сложными рабочими процессами — одна из главных головных болей инженеров данных и DevOps-специалистов. Представьте себе: каждый день нужно запускать десятки скриптов в определенной. . .
Оптимизация приложений Java для ARM
Javaican 16.03.2025
ARM-архитектура переживает настоящий бум популярности в технологическом мире. Когда-то воспринимаемая исключительно как решение для мобильных устройств и встраиваемых систем, сегодня она штурмует. . .
Управление состоянием в Vue 3 с Pinia и Composition API
Reangularity 16.03.2025
Когда я начал работать с Vue несколько лет назад, мне казалось достаточным использовать простую передачу данных через props и события между компонентами. Однако уже на среднем по сложности проекте. . .
Введение в DevSecOps: основные принципы и инструменты
Mr. Docker 16.03.2025
DevSecOps - это подход к разработке программного обеспечения, который объединяет в себе принципы разработки (Dev), безопасности (Sec) и эксплуатации (Ops). Суть подхода заключается в том, чтобы. . .
GitHub Actions vs Jenkins: Сравнение инструментов CI/CD
Mr. Docker 16.03.2025
В этой битве за эффективность и скорость выпуска программных продуктов ключевую роль играют специализированные инструменты. Два гиганта в этой области — GitHub Actions и Jenkins — предлагают разные. . .
Реактивное программировани­е с Kafka Stream и Spring WebFlux
Javaican 16.03.2025
Реактивное программирование – это программная парадигма, ориентированная на потоки данных и распространение изменений. Она позволяет выражать статические или динамические потоки данных и. . .
Простая нейросеть на КуМир: Учебное пособие по созданию и обучению нейронных сетей
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru