Как сменить картинку в Bitmap-e?
(CBitmap*)GetDlgItem(IDC_BITMAP);CBitmap не наследуется от CWnd. Если вместо Сишного (CBitmap*) писать static_cast<CBitmap*>(...) то об этом выяснится еще во время компиляции. Короче, CBitmap - это _не контрол_, на котором нарисована картинка, это _сама_ картинка. Какой контрол обычно используется в диалогах для изображения картинки я не знаю и исходя из
элемент управления picture - bitmapтоже понять не смог. Какой-нибудь CStatic или CImage? Ну, вобщем когда выяснишь, напиши правильный cast и ищи метод смены картинки...
Все равно спасибо А насчет элемента управления - это в мастере диалоговых окон есть такой - называется picture вот... Так что я кнопку оставил
CBitmap someBitmap;
someBitmap->LoadBitmap(IDC_BITMAP);
CDC someDC = (GetDlgItem(IDC_BITMAP->GetDC;
someDC.SelectObject(someBitmap);
someDC.ReleaseDC;
в мастере диалоговых окон есть такой - называется pictureНу вот ты пойди и в .rc файле посмотри что он там нагенерил, я все-таки подозреваю, что CStatic.
Чево? Ты это сам попробовал?
CBitmap someBitmap;
someBitmap->LoadBitmap(IDC_BITMAP);
CDC someDC = (GetDlgItem(IDC_BITMAP->GetDC;
someDC.SelectObject(someBitmap);
someDC.ReleaseDC;
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;
Ты предлагаешь в OnPaint такое писать? Что значит
//(перед удалением someBitmap, или в конце функции)LoadBitmap будет при каждом OnPaint происходить что ли?
Для стандартных контролей OnPaint давно написан, надо только картинку ему другую дать, при чем тут DC вообще?... DC нужен в _момент_ рисования. А подменить картинку можно когда угодно, и больше ни про OnResize ни про OnMove или как там они называются думать не надо будет, все контрол сам сделает.
CBitmap newBmp;
newBmp.LoadBitmap(IDB_BITMAP2);
m_bmp.SetBitmap(newBmp);
детачить точно не надо?
Не знаю. Там есть какая-то фишка в gdi, что если объект используется, то delete не срабатывает. По крайней мере так со всякими брашами. Если ты детачнишь, что ведь все равно нужно будет когда-то удалять битмар. Наверно правильно будет сделать newBitmap членом диалога, тогда после разрушения объекта диалога удалится и битмар. Короче не помню, нужно ботать как правильнее.
Оставить комментарий
vertyal17
Я создал в форме картинку (элемент управления picture - bitmap с идентификатором IDC_BITMAP, хочу картинку менять, как реакцию на событие.Как можно это сделать? Попробовал сделать из CWnd сделать CBitmap Типа так:
CBitmap * bitmap=(CBitmap*)GetDlgItem(IDC_BITMAP);
а потом менять bitmap->LoadBitmap(IDC_BITMAP)
но по систематическим вылетаниям приложения понял, что это в корне неверный подход.
Пока что остановился на том, что вместо bitmapa использую БОЛЬШУЮ кнопку CButton, и меняю на ней картинку (CButton.SetBitmap Но хотелось бы поправильнее както .