Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2016, 10:42   #1
ukdug179
Пользователь
 
Регистрация: 21.09.2016
Сообщений: 13
По умолчанию В Visual C++ MFC не работает ввод символов

Программа, которая считает выражение. Члены выражения нужно вводить с клавиатуры. При компиляции никаких ошибок нет, программа при запуске выводит нужное сообщение, но при нажатии клавиш ничего не происходит.
keystrokesView.cpp:
Код:
#include "stdafx.h"
// SHARED_HANDLERS можно определить в обработчиках фильтров просмотра реализации проекта ATL, эскизов
// и поиска; позволяет совместно использовать код документа в данным проекте.
#ifndef SHARED_HANDLERS
#include "keystrokes.h"
#endif

#include "keystrokesDoc.h"
#include "keystrokesView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CkeystrokesView

IMPLEMENT_DYNCREATE(CkeystrokesView, CView)

BEGIN_MESSAGE_MAP(CkeystrokesView, CView)
    // Стандартные команды печати
    ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CkeystrokesView::OnFilePrintPreview)
    ON_WM_CONTEXTMENU()
    ON_WM_RBUTTONUP()
END_MESSAGE_MAP()

// создание/уничтожение CkeystrokesView

void CkeystrokesView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    int x,A,G;                                  //для хранения x,A,G в числовом виде
    CkeystrokesDoc* pDoc = GetDocument(); 
    ASSERT_VALID(pDoc);
    if(char(nChar)!='x' & char(nChar)!='a')
    {
        pDoc->StringData += char(nChar);                            /*оператор -> используется для обращения к объекту StringData документа, на который ссылается pDoc*/
        Invalidate();                                               /*Чтобы  заставить программу вызвать OnDraw() и перерисовать обновленную строку мы  вызовем  метод Invalidate() объекта вида: */
    }
    if(char(nChar)=='x')                        //если нажимаю "х", то в value_x записывается последовательность ранее введенных символов
    {                                                               
        pDoc->value_x=pDoc->StringData;
        pDoc->vyvod="Введи A (Для окончания ввода нажмите клавишу a)";
        pDoc->StringData="";                    //удаляю введенные ранее символы
        Invalidate();   
    }
    if(char(nChar)=='a')                        //если нажимаю "a", то в value_A записывается последовательность ранее введенных символов
    {                                                               
        pDoc->value_A=pDoc->StringData;
        pDoc->vyvod="G=";
        x=_ttoi(pDoc->value_x);
        A=_ttoi(pDoc->value_A);
        G=(-1/(x*x-A*A)-2*A*A/(3*((x*x-A*A)*(x*x-A*A))));
        pDoc->value_G.Format(TEXT("%d"),G);
        pDoc->StringData=pDoc->value_G;             
        Invalidate();   
    }
    CView::OnChar(nChar, nRepCnt, nFlags);//!!!!!!!!!
}

CkeystrokesView::CkeystrokesView()
{
    // TODO: добавьте код создания
}


CkeystrokesView::~CkeystrokesView()
{
}

BOOL CkeystrokesView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: изменить класс Window или стили посредством изменения
    //  CREATESTRUCT cs

    return CView::PreCreateWindow(cs);
}

// рисование CkeystrokesView

void CkeystrokesView::OnDraw(CDC* pDC)
{
    CkeystrokesDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    pDC->TextOut(0, 0, pDoc->vyvod);
    pDC->TextOut(0, 20, pDoc->StringData);

    // TODO: добавьте здесь код отрисовки для собственных данных
}

// печать CkeystrokesView

void CkeystrokesView::OnFilePrintPreview()
{
#ifndef SHARED_HANDLERS
    AFXPrintPreview(this);
#endif
}

BOOL CkeystrokesView::OnPreparePrinting(CPrintInfo* pInfo)
{
    // подготовка по умолчанию
    return DoPreparePrinting(pInfo);
}

void CkeystrokesView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: добавьте дополнительную инициализацию перед печатью
}

void CkeystrokesView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: добавьте очистку после печати
}

void CkeystrokesView::OnRButtonUp(UINT /* nFlags */, CPoint point)
{
    ClientToScreen(&point);
    OnContextMenu(this, point);
}

void CkeystrokesView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
{
#ifndef SHARED_HANDLERS
    theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
#endif
}

// диагностика CkeystrokesView

#ifdef _DEBUG
void CkeystrokesView::AssertValid() const
{
    CView::AssertValid();
}

void CkeystrokesView::Dump(CDumpContext& dc) const
{
    CView::Dump(dc);
}

CkeystrokesDoc* CkeystrokesView::GetDocument() const // встроена неотлаженная версия
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CkeystrokesDoc)));
    return (CkeystrokesDoc*)m_pDocument;
}
#endif //_DEBUG
keyStroke.h:
Код:
#pragma once

class CkeystrokesView : public CView
{
protected: // создать только из сериализации
    CkeystrokesView();
    DECLARE_DYNCREATE(CkeystrokesView)

// Атрибуты
public:
    CkeystrokesDoc* GetDocument() const;

// Операции
public:

// Переопределение
public:
    virtual void OnDraw(CDC* pDC);  // переопределено для отрисовки этого представления
    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);

// Реализация
public:
    void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    virtual ~CkeystrokesView();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Созданные функции схемы сообщений
protected:
    afx_msg void OnFilePrintPreview();
    afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
    DECLARE_MESSAGE_MAP()
};

#ifndef _DEBUG  // отладочная версия в keystrokesView.cpp
inline CkeystrokesDoc* CkeystrokesView::GetDocument() const
   { return reinterpret_cast<CkeystrokesDoc*>(m_pDocument); }
#endif
keystrokeDoc.h:
Код:
 #pragma once


class CkeystrokesDoc : public CDocument
{
protected: // create from serialization only
    CkeystrokesDoc();
    DECLARE_DYNCREATE(CkeystrokesDoc)
    CString StringData,vyvod,value_x,value_A,value_G;


// Атрибуты
public:

// Операции
public:

// Переопределение
public:
    virtual BOOL OnNewDocument();
    virtual void Serialize(CArchive& ar);
#ifdef SHARED_HANDLERS
    virtual void InitializeSearchContent();
    virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
#endif // SHARED_HANDLERS

// Реализация
public:
    virtual ~CkeystrokesDoc();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Созданные функции схемы сообщений
protected:
    DECLARE_MESSAGE_MAP()

#ifdef SHARED_HANDLERS
    // Вспомогательная функция, задающая содержимое поиска для обработчика поиска
    void SetSearchContent(const CString& value);
#endif // SHARED_HANDLERS
};

Последний раз редактировалось Alex11223; 21.09.2016 в 10:48.
ukdug179 вне форума Ответить с цитированием
Старый 21.09.2016, 11:06   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Между BEGIN_MESSAGE_MAP(CkeystrokesView, CView) и END_MESSAGE_MAP() нет декларации обработчика.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 21.09.2016, 13:57   #3
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Выложи проект целиком (размести его на каком-нибудь бесплатном файлообменике). Просто так ничего не понятно - нужно код, то что называется, "пощупать" в работе (мой профессиональный уровень не позволяет мне, посмотрев на кусочек кода, сказать где ошибки).
ura_111 вне форума Ответить с цитированием
Старый 21.09.2016, 15:03   #4
ukdug179
Пользователь
 
Регистрация: 21.09.2016
Сообщений: 13
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Выложи проект целиком (размести его на каком-нибудь бесплатном файлообменике). Просто так ничего не понятно - нужно код, то что называется, "пощупать" в работе (мой профессиональный уровень не позволяет мне, посмотрев на кусочек кода, сказать где ошибки).
http://rgho.st/92qBMDgnj
ukdug179 вне форума Ответить с цитированием
Старый 21.09.2016, 16:44   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Моего опыта не достаточно чтобы ответить на все твои вопросы, поэтому надо тебя подключать к работе (философский принцип: "перевод количества в качество")...

Итак.

1) Сделай копию этого проекта - будем экспериментировать вместе.
Вот тебе таблица символов набери из них какой-нибудь простенький пример для твоей задачи:

1.jpg

На мой набор (симулирования ввода)- результат вывело такой (чтобы вывести символы - нажми правую кнопку в рабочей программе - "Вывод контекстного меню"):

2.jpg

Если будут проблемы с расчетом (у меня было аварийное завершение программы, но может я не до конца понимаю что нужно вводить и происходило "деление на 0-ль при расчете G")- временно измени формулу:

3.jpg

Сделай скришоты и выложи здесь что получилось.

P.S.1: это не решение проблемы, а скорее первые результаты. Я реально только учусь программирования и мой метод - это метод тыка (может даже я знаю меньше чем ты). По этой причине очень полезно подключить ещё кого-то к решению задачи - тебя... Ну по крайне мере понятно в какую сторону копать... В крайнем случае можно прокладку сделать - дополнительное диалоговое окно, параметры из которого переходят в ф-цию OnChar(...). Не очень изящное решение...

Ты согласен работать над проблемой вместе или нет?

Последний раз редактировалось ura_111; 21.09.2016 в 17:04.
ura_111 вне форума Ответить с цитированием
Старый 21.09.2016, 19:11   #6
ukdug179
Пользователь
 
Регистрация: 21.09.2016
Сообщений: 13
По умолчанию

Спасибо за помощь. Я сейчас пробовал скопипастить пример из методички, который якобы должен работать, но он тоже не работает. И не только у меня не работает. При написании программы за основу был взят этот пример. Похоже, он изначально не правильный. Поэтому сейчас не вижу смысла биться в стену наугад. Буду спрашивать препода.
Еще раз спасибо за помощь
ukdug179 вне форума Ответить с цитированием
Старый 21.09.2016, 19:44   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

У меня вроде получилось!

Добавь:

1.jpg

Вот что -то выводи с клавиатуры:

2.jpg

Последний раз редактировалось ura_111; 21.09.2016 в 19:47.
ura_111 вне форума Ответить с цитированием
Старый 22.09.2016, 14:30   #8
ukdug179
Пользователь
 
Регистрация: 21.09.2016
Сообщений: 13
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
У меня вроде получилось!

Добавь:

Вложение 83520

Вот что -то выводи с клавиатуры:

Вложение 83521
Спасибо огромное Все работает
ukdug179 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MFC ввод даных mato Visual C++ 5 14.05.2012 20:55
Visual Studio->MFC ali_men Visual C++ 0 15.05.2011 14:49
Visual C++ MFC Циклы Dobray Visual C++ 5 16.05.2010 20:42
Visual c++(MFC) CUtty Visual C++ 1 13.10.2008 21:21