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

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

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

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

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

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

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

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

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

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

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


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

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

Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru