Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание метода для соединения 2 точек 
:(
    Опции темы
zabludshiy
Дата 27.11.2012, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 27.11.2012

Репутация: нет
Всего: нет



Здравствуйте уважаемые форумчане smile 
Мне необходимо реализовать алгоритм плавающего горизонта. Для этого создаю класс с помощью insert->new class...
Class type = Generic class.
Получаю шаблон класса, где создаю несколько методов, в один из которых будут передаваться координаты 2 точек, которые соединяются линией между собой. В итоге получилось следующее:

Код

void shapes::DrawLine(int X1, int Y1, int X2, int Y2){
    CClientDC* pDC=new CClientDC(this);
    pDC->MoveTo(X1,Y1);
    pDC->LineTo(X2,Y2);
    delete pDC;
};



При компиляции следующая ошибка (среда visual c++ 6.0):

:\Program Files\Microsoft Visual Studio\MyProjects\kr\shapes.cpp(54) : error C2664: 'CClientDC::CClientDC' : cannot convert parameter 1 from 'class shapes *const ' to 'class CWnd *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

Может кто-нибудь укажет направление "куда копать". В стандартных файлах, н-р CKлассView::OnDraw(CDC *pDC), в параметрах идет объявление контекста устройства CDC* pDC, но откуда берется и где инициализируется этот контекст не пойму. В литературе нашел объявление CClientDC* pDC=new CClientDC(this), которое можно использовать внутри событий и методов, но применить не получилось. Насколько я разобрался, чтобы соединить 2 точки в Visual C++ нужно работать с контекстом устройства, но как его получить, чтобы он корректно работал в методе не пойму. Если нужно его передавать как параметр, то где его объявление и инициализация делается в создаваемом классе? Не могу найти ответ. При создании класса с помощью мастера, я указывал его как стандартный , может нужно создавать класс, как MFC и указать его base class , например, View или какой нибудь другой? С Visual C++ 6.0 разбираюсь около месяца, поэтому если напечатал что-то не корректно, прошу строго не судить.
PM MAIL   Вверх
586
Дата 27.11.2012, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 6
Всего: 146



В "new CClientDC" нужно передавать указатель на окно, где будет производиться рисование.

Добавлено @ 23:43
Да и нежелательно для рисования каждой линии каждый раз создавать CClientDC. Лучше создать его перед рисованием.

Это сообщение отредактировал(а) 586 - 28.11.2012, 00:44
PM   Вверх
zabludshiy
  Дата 28.11.2012, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 27.11.2012

Репутация: нет
Всего: нет



Спасибо за направление, ситуация начала проясняться smile , но остались вопросы.
Я класс создал в отдельном файле (вернее 2 файлов shapes.h b shapes.cpp) и подключаю файл shapes.h в СКлассView (krView.cpp). Создаваемое приложение однодокументное.
Если я объявляю переменную CWnd *W и передаю ее в контекст устройства pDC=new CClientDC(W), то компилятор ошибки не выдает, но будет ли это корректно работать. Правильно ли я получаю указатель на окно, где будет проводиться рисование или все сложнее и нужно вызывать какие-нибудь методы для получения указателя на окно. Я так понимаю нужен указатель на активное окно, тогда метод будет применяться к нужному окну. Если так, то еще нужно переменной W присвоить указатель на активное окно или что-то в этом роде, но как это сделать что-то не могу найти. smile 


Код

// shapes.h: interface for the shapes class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SHAPES_H__0C820262_2CDD_4E5D_9572_09BEB708965B__INCLUDED_)
#define AFX_SHAPES_H__0C820262_2CDD_4E5D_9572_09BEB708965B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class shapes  
{
    CClientDC* pDC; CWnd *W;
public:
    shapes();
    virtual ~shapes();
    void MakeProject(int*,int*,int*);
    void DrawLine(int,int,int,int);
};

#endif // !defined(AFX_SHAPES_H__0C820262_2CDD_4E5D_9572_09BEB708965B__INCLUDED_)

и
Код

// shapes.cpp: implementation of the shapes class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "kr.h"
#include "shapes.h"
#include "math.h"
#include "krDoc.h"
#include "krView.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

shapes::shapes()
{
    pDC=new CClientDC(W);
}
shapes::~shapes()
{
    delete pDC;
}

void shapes::DrawLine(int X1, int Y1, int X2, int Y2){
    pDC->MoveTo(X1,Y1);
    pDC->LineTo(X2,Y2);
};
void shapes::MakeProject(int *x,int *y,int *z){
    ...
};



PM MAIL   Вверх
586
Дата 29.11.2012, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 6
Всего: 146



Окно передавай в конструктор:
Код
shapes::shapes(CWnd *w)
{
    W = w;
    pDC=new CClientDC(w);
}


В конструктор передавай указатель на класс, который объявлен в "krView.h".

В результате, должно быть примерно так:
Код
void CkrView::OnDraw(CDC* pDC)
{
    CkrDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    shapes sh(this);
    sh.DrawLine(5, 5, 80, 30);
}

Если у тебя так, то и создавать объект CClientDC не нужно вообще, используй объект, который пришёл в OnDraw.

Это сообщение отредактировал(а) 586 - 29.11.2012, 07:03
PM   Вверх
zabludshiy
  Дата 30.11.2012, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 27.11.2012

Репутация: нет
Всего: нет



Спасибо, получилось smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.