Боготворимые виртуозы! Помогите великодушно...А не то
все к чертям побью

(
Есть прога, главная цель которой рисовать произвольные графики,
причем несколько в одно окно и желательно разным цветом. Я создаю
контекст в памяти, и рисую на него, затем копируем битовй массив и т.п.
— стандартная техника. Конечно, график может требовать для отображения
большего пространства, чем окно — решаем через введение скроллеров, и
прокручиваем, как желаем...Но! Если создаваемый для отображения
в контексте памяти Bitmap имеет размеры, больше неких мистических значений,
то :
если вызов такой
memBmp->CreateCompatibleBitmap(&memDC,MAXHORIZONTAL,MAXVERTICAL);
то все отлично, график рисуется но только черно/белая палитра!!!

а если такой
memBmp->CreateCompatibleBitmap(this->GetDC(),MAXHORIZONTAL,MAXVERTICAL);
то последующее
memDC.GetCurrentBitmap()->DeleteObject();
memDC.SelectObject(memBmp); ->возвращает NULL, и не зацепляет сей битмап,
отказываясь с ним работать!
И это при том, что этот же вызов при ином(малом) значении MAXHORIZONTAL отрабатывает
и все рисуется в цвете! <

).
Начальная инициализация такая:
memDC.CreateCompatibleDC(this->GetDC());
memBmp = NULL;
memBmp = new CBitmap();
memBmp->CreateCompatibleBitmap(this->GetDC(),1,1);
Трабловый фрагмент:
memBmp->DeleteObject();
delete memBmp;
SetScrollPos(SB_VERT,0,true);
SetScrollPos(SB_HORZ,0,true);
memBmp = new CBitmap();
//memBmp->CreateCompatibleBitmap(&memDC,MAXHORIZONTAL,MAXVERTICAL);
memBmp->CreateCompatibleBitmap(this->GetDC(),MAXHORIZONTAL,MAXVERTICAL);
memDC.GetCurrentBitmap()->DeleteObject();
memDC.SelectObject(memBmp);
aRect.left=0; aRect.top=0;
aRect.right=MAXHORIZONTAL; aRect.bottom=MAXVERTICAL;
memDC.FillRect(&aRect,this->GetDC()->GetCurrentBrush());
Ведь задача наверняка типовая, и решается! Я уже двое суток во все дыры с ней
размножаюсь!Доки, книги прочитаны — ответа не вижу...мистику-исключаю.Помогите ПЛИЗ!
Здравствуйте Аноним, Вы писали:
А>Советую сходить на сайт firststeps.ru, и
А>зайти в раздел Visual C++.
Спасибо, но...
Может есть ссылки на second и выше степз?
Здравствуйте avanti, Вы писали:
[]
A>Трабловый фрагмент:
A> memBmp->DeleteObject();
A> delete memBmp;
A> SetScrollPos(SB_VERT,0,true);
A> SetScrollPos(SB_HORZ,0,true);
A>
A> memBmp = new CBitmap();
A> //memBmp->CreateCompatibleBitmap(&memDC,MAXHORIZONTAL,MAXVERTICAL);
A> memBmp->CreateCompatibleBitmap(this->GetDC(),MAXHORIZONTAL,MAXVERTICAL);
A>
A> memDC.GetCurrentBitmap()->DeleteObject();
A> memDC.SelectObject(memBmp);
A> aRect.left=0; aRect.top=0;
A> aRect.right=MAXHORIZONTAL; aRect.bottom=MAXVERTICAL;
A> memDC.FillRect(&aRect,this->GetDC()->GetCurrentBrush());
A>Ведь задача наверняка типовая, и решается! Я уже двое суток во все дыры с ней
A>размножаюсь!Доки, книги прочитаны — ответа не вижу...мистику-исключаю.Помогите ПЛИЗ!
Мдя...
По части
memBmp->CreateCompatibleBitmap(&memDC,MAXHORIZONTAL,MAXVERTICAL);
то там и есть черно белая палитра. Об этом прямо сказано в TFM.
А вот это накохер?
memDC.GetCurrentBitmap()->DeleteObject();
этак у тебя битмап не удалиться. Поскольку он выбран в контексте. Сначала сделай SelectObject. (хотя ето вообще криво _так_ делать, но ето дело вкуса
А
memDC.SelectObject(memBmp); ->возвращает NULL, и не зацепляет сей битмап,
вполне себе может возвращать NULL, т.к. возвращает _предыдущий_ выбранный битмап, а после всех етих танцев которые ты вытворяешь с контекстами, вообще не понятно чего у тебя там есть...
Конструкция
this->GetDC()
сама поебе весьма трабловая, кто ReleaseDC то делать будет? Или тебе это религия не позволяет?
В общем я бы сделал так
CClientDC dc(this);
//или CDC* dc = GetDC();
CDC mem_dc;
mem_dc.CreateCompatibleDC(&dc);
CBitmap mem_bmp;
mem_bmp.CreateCompatibleBitmap(&dc, MAXHORIZONTAL, MAXVERTICAL);
CBitmap* old_bmp = mem_dc.SelectObject(&mem_bmp);
CBrush* brush = dc.GetCurrentBrush(); //Кстати спорный случай, лучше brush все таки Create самому...
aRect.left=0;
aRect.top=0;
aRect.right = MAXHORIZONTAL;
aRect.bottom = MAXVERTICAL;
mem_dc.FillRect(&aRect, brush);
mem_dc.SelectObject(old_bmp);
// ReleaseDC(dc); ежели ты делал GetDC