Как сменить картинку в Bitmap-e?

vertyal17

Я создал в форме картинку (элемент управления picture - bitmap с идентификатором IDC_BITMAP, хочу картинку менять, как реакцию на событие.
Как можно это сделать? Попробовал сделать из CWnd сделать CBitmap Типа так:
CBitmap * bitmap=(CBitmap*)GetDlgItem(IDC_BITMAP);
а потом менять bitmap->LoadBitmap(IDC_BITMAP)
но по систематическим вылетаниям приложения понял, что это в корне неверный подход.
Пока что остановился на том, что вместо bitmapa использую БОЛЬШУЮ кнопку CButton, и меняю на ней картинку (CButton.SetBitmap Но хотелось бы поправильнее както .

rosali

(CBitmap*)GetDlgItem(IDC_BITMAP);
CBitmap не наследуется от CWnd. Если вместо Сишного (CBitmap*) писать static_cast<CBitmap*>(...) то об этом выяснится еще во время компиляции. Короче, CBitmap - это _не контрол_, на котором нарисована картинка, это _сама_ картинка. Какой контрол обычно используется в диалогах для изображения картинки я не знаю и исходя из
элемент управления picture - bitmap
тоже понять не смог. Какой-нибудь CStatic или CImage? Ну, вобщем когда выяснишь, напиши правильный cast и ищи метод смены картинки...

vertyal17

Ну я примерно так и понял, что CBitmap это чтото не то, и что он не наследуется от CWnd
Все равно спасибо А насчет элемента управления - это в мастере диалоговых окон есть такой - называется picture вот... Так что я кнопку оставил

Bird_V

Правильно так:

CBitmap someBitmap;
someBitmap->LoadBitmap(IDC_BITMAP);
CDC someDC = (GetDlgItem(IDC_BITMAP->GetDC;
someDC.SelectObject(someBitmap);
someDC.ReleaseDC;

rosali

в мастере диалоговых окон есть такой - называется picture
Ну вот ты пойди и в .rc файле посмотри что он там нагенерил, я все-таки подозреваю, что CStatic.

rosali


CBitmap someBitmap;
someBitmap->LoadBitmap(IDC_BITMAP);
CDC someDC = (GetDlgItem(IDC_BITMAP->GetDC;
someDC.SelectObject(someBitmap);
someDC.ReleaseDC;
Чево? Ты это сам попробовал?

Bird_V

Много раз. ПРосто синиаксис местами хромает, а идея верная!

CBitmap someBitmap;
someBitmap.LoadBitmap(IDB_BITMAP); //тут --- имя ресурса, опечатка: было -> вместо .
CDC someDC = (GetDlgItem(IDC_BITMAP->GetDC; //тут --- имя элемента на форме
someDC.SelectObject(&someBitmap); //опечатка: нужен указатель на CBitmap
someDC.ReleaseDC;

Ну, ещё можно так (правилнее в некотором смысле):

CBitmap someBitmap, *oldBitmap;
someBitmap.LoadBitmap(IDB_BITMAP); //тут --- имя ресурса
CDC someDC = (GetDlgItem(IDC_BITMAP->GetDC; //тут --- имя элемента на форме
oldBitmap = someDC.SelectObject(&someBitmap);
//(...ляляля...)
//(перед удалением someBitmap, или в конце функции)
someDC.SelectObject(oldBitmap);
someDC.ReleaseDC;

Ещё вариант --- использовать временный DC, и делать через BitBlt (imho, самый правильный метод)

CBitmap someBitmap; CDC someDC, memDC; CRect rt;
someBitmap.LoadBitmap(IDB_BITMAP); //тут --- имя ресурса, опечатка: было -> вместо .
someDC = (GetDlgItem(IDC_BITMAP->GetDC; //тут --- имя элемента на форме
(GetDlgItem(IDC_BITMAP->GetClientRect(&rt);
memDC.CreateCompatibleDC(&someDC);
memDC.SelectObject(&someBitamp);
someDC.BitBlt(0, 0, rt.Width rt.Height &memDC, 0, 0);
someDC.SelectObjectCBitmap*) NULL);
someBitmap.DeleteObject;
someDC.ReleaseDC;
someDC.ReleaseObject;

rosali

Кто в MFC рюхает, объясните мне, а то я наверное совсем тупой, не понимаю о чем вообще речь
Ты предлагаешь в OnPaint такое писать? Что значит
//(перед удалением someBitmap, или в конце функции)
LoadBitmap будет при каждом OnPaint происходить что ли?
Для стандартных контролей OnPaint давно написан, надо только картинку ему другую дать, при чем тут DC вообще?... DC нужен в _момент_ рисования. А подменить картинку можно когда угодно, и больше ни про OnResize ни про OnMove или как там они называются думать не надо будет, все контрол сам сделает.

bastii

Все очень просто, если связать переменную m_bmp типа CStatic с IDC_STATIC1 (идентификатор статика где сидит картинка). Тогда сменить можно так:

CBitmap newBmp;
newBmp.LoadBitmap(IDB_BITMAP2);
m_bmp.SetBitmap(newBmp);

Dasar

детачить точно не надо?

bastii

Не знаю. Там есть какая-то фишка в gdi, что если объект используется, то delete не срабатывает. По крайней мере так со всякими брашами. Если ты детачнишь, что ведь все равно нужно будет когда-то удалять битмар. Наверно правильно будет сделать newBitmap членом диалога, тогда после разрушения объекта диалога удалится и битмар. Короче не помню, нужно ботать как правильнее.
Оставить комментарий
Имя или ник:
Комментарий: