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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2009, 15:28   #1
Evgenijj
 
Регистрация: 07.03.2009
Сообщений: 3
Вопрос Для чего код в классе ?

У меня есть класс для захвата экрана. Вижул Си добавил свой код в объявление процедуры инициализации ( та что совпадает с именем класса) .
Этот кусок выглядит так ": RGBMassiv(0)"
Что означает этот кусок ? нужен ли он ?
Можно ли это использовать ?

Вопрос второй: Возможно ли сделать какими нибуть ухищьрениями RGBMassiv сделать двухмерным, чтоб получаль элементы по координатам, не высчитывая адрес ?

Полный текст класса
=ЗАГОЛОВОК========================= =====================
Код:
#pragma once

class CZakhvatEhkr
{
public:
	CZakhvatEhkr(void);
public:
	~CZakhvatEhkr(void);
public:
	CDC m_dcEhkr;
	CDC m_dcPam;
	CBitmap m_BmpPam;
	BITMAP m_BmpPamInfo;
	BITMAPINFO m_DibInfo;
	RGBQUAD* RGBMassiv;
public:
	//Обновление участка только в прямоугольнике rect
	void Zakhvat(RECT rect);
	//Захват окна целиком
	void Zakhvat(void);
public:
	BOOL Nachalo(HWND hwnd);
public:
	BOOL DibToBitmap(CBitmap* cbmp,CDC* cdc);

};

=КОД==================================================
#include "StdAfx.h"
#include "ZakhvatEhkr.h"

 CZakhvatEhkr::CZakhvatEhkr(void)
	 : RGBMassiv(0)
 {

		 return;
}

CZakhvatEhkr::~CZakhvatEhkr(void)
{
	delete RGBMassiv;
}
BOOL CZakhvatEhkr::Nachalo(HWND hwnd)
{
	HDC hDCEhkr = ::GetDC(hwnd);
	if (hDCEhkr==NULL)return false;
	RECT Rect;
	::GetClientRect(hwnd,&Rect);

	m_dcEhkr.Attach(hDCEhkr);
	m_dcPam.CreateCompatibleDC(&m_dcEhkr);
	m_BmpPam.CreateCompatibleBitmap(&m_dcEhkr,
									Rect.right,
									Rect.bottom
									);
	m_dcPam.SelectObject(m_BmpPam);
	m_BmpPam.GetBitmap(&m_BmpPamInfo);

	m_DibInfo.bmiHeader.biSize			= sizeof(BITMAPINFOHEADER);
	m_DibInfo.bmiHeader.biWidth			= m_BmpPamInfo.bmWidth;
	m_DibInfo.bmiHeader.biHeight		= -m_BmpPamInfo.bmHeight;
	m_DibInfo.bmiHeader.biPlanes		= 1;
	m_DibInfo.bmiHeader.biBitCount		= 32;
	m_DibInfo.bmiHeader.biCompression	= BI_RGB;
	m_DibInfo.bmiHeader.biSizeImage	= m_BmpPamInfo.bmWidth*m_BmpPamInfo.bmHeight*4;
	m_DibInfo.bmiHeader.biXPelsPerMeter	= 0;
	m_DibInfo.bmiHeader.biYPelsPerMeter	= 0;
	m_DibInfo.bmiHeader.biClrUsed		= 0;
	m_DibInfo.bmiHeader.biClrImportant	= 0;

	RGBMassiv=new RGBQUAD[m_DibInfo.bmiHeader.biSizeImage/4];
	return TRUE;
}
//Захват окна целиком
void CZakhvatEhkr::Zakhvat(void)
{
	RECT r;
	r.left=0;r.top=0;r.right=m_BmpPamInfo.bmWidth;r.bottom=m_BmpPamInfo.bmHeight;
	Zakhvat( r);
return;
}
//Обновление участка только в прямоугольнике rect
void CZakhvatEhkr::Zakhvat(RECT rect)
{
	if (rect.left<0) rect.left=0;
	if (rect.top<0) rect.top=0;
	if (rect.right>m_BmpPamInfo.bmWidth) rect.right = m_BmpPamInfo.bmWidth;
	if (rect.bottom>m_BmpPamInfo.bmHeight)rect.bottom = rect.bottom>m_BmpPamInfo.bmHeight;
	rect.right  = rect.right -  rect.left;
	rect.bottom = rect.bottom - rect.top;

	m_dcPam.BitBlt (
				rect.left,
				rect.top,
				rect.right,
				rect.bottom,
				&m_dcEhkr,
				rect.left,
				rect.top,
				SRCCOPY | CAPTUREBLT
			   );
	int i=GetDIBits ( 
					  m_dcPam.m_hDC,
				     (HBITMAP)m_BmpPam.m_hObject,
					 rect.top,
					  rect.bottom,
					  RGBMassiv,
					  &m_DibInfo,
					  DIB_RGB_COLORS
					);
	
	DibToBitmap(&m_BmpPam,&m_dcPam);
	return;
}

BOOL CZakhvatEhkr::DibToBitmap(CBitmap* cbmp,CDC* cdc)
{
	
	BITMAP bmp;
	cbmp->GetBitmap(&bmp);
	int i=SetDIBits(
					 cdc->m_hDC,
					 (HBITMAP) *cbmp,
					 0,
					 768,
					 RGBMassiv,
					 &m_DibInfo,
					 DIB_RGB_COLORS
					);
	return TRUE;
}
Модератор: тег CODE

Последний раз редактировалось MaTBeu; 07.03.2009 в 20:17.
Evgenijj вне форума Ответить с цитированием
Старый 07.03.2009, 16:17   #2
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

1) "процедура инициализации(та, что совпадает с именем класса)" называется "конструктор";
2) RGBMassiv(0) - это, собственно, инициализация указателя RGBMassiv. Мне кажется, правильнее было бы RGBMassiv(NULL), но в С++ 0 и NULL взаимозаменяемы. В общем, этот код значит, что указатель сейчас указывает в пустоту, т.е. никуда;
3) нужен ли он? Зависит от последующего кода. Иногда просто жизненно нужен для программы, и без него она работать не будет; иногда ничего не изменится... Вообще, мое мнение - инициализация переменных всегда нужна.
4) можно ли это использовать? Я не помню кода, написанного самой Visual Studio, который нельзя использовать...
5) Возможно ли сделать какими нибуть ухищрениями RGBMassiv сделать двумерным, чтоб получать элементы по координатам, не высчитывая адрес? Вопрос не поняла, но двумерный массив объявляется RGBQUAD** RGBMassiv; (насколько я помню). Но если вы не знаете основы работы с массивами, то зря вы в классы полезли...

И используйте тег CODE, это ж читать невозможно...
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 07.03.2009 в 16:20.
ACE Valery вне форума Ответить с цитированием
Старый 07.03.2009, 16:31   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
CZakhvatEhkr::~CZakhvatEhkr(void)
{
delete RGBMassiv;
}
за это delete руки надо отрывать)
выделяете память посредством new[], значит и вызывайте delete[]. Кроме того, RGBMassiv в Вашем классе не всегда существует, так что как минимум должно быть:
Код:
CZakhvatEhkr::~CZakhvatEhkr(void)
{
  if (RGBMassiv)
    delete[] RGBMassiv;
}
И учитесь называть функции/классы/методы/... на англицком языке. Транслит - зло. Ну что это за Zakhvat, CZakhvatEhkr? Уж куда лучше Capture и CScreenCapture.
Еще у Вас там:
RGBMassiv=new RGBQUAD[m_DibInfo.bmiHeader.biSizeImage/4];
Новую память то вы выделили, а старую куда дели?

Последний раз редактировалось pu4koff; 07.03.2009 в 16:41.
pu4koff вне форума Ответить с цитированием
Старый 09.03.2009, 14:12   #4
Evgenijj
 
Регистрация: 07.03.2009
Сообщений: 3
По умолчанию

Спасибо вам, особенно хорошенькой девушке
Evgenijj вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для чего нужен этот скрипт belvision JavaScript, Ajax 4 20.02.2013 15:16
Для чего предназначен раздел Events в С++ prikolist Общие вопросы C/C++ 1 16.02.2009 00:08
Для чего придумали TDataSource (Access)? JY_ БД в Delphi 1 28.10.2008 14:28
Для чего нужен мобильник? Altera Свободное общение 53 19.08.2008 21:12
Для чего вы программируете? Elefanter Свободное общение 14 17.02.2008 21:54