Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Открытие изображения по нажатию на кнопку  (Прочитано 16477 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NAYGER
Участник

ru
Offline Offline

« : 09-12-2009 02:04 » 

Код:
// загрузка изображения, 5.bmp - имя файла
HBITMAP hBmp = (HBITMAP)LoadImage(NULL, "5.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//отображаем изображение
CPaintDC dc(this);
::DrawState (dc.m_hDC, NULL, NULL, (WPARAM)hBmp, (LPARAM)0, 0,0, 1280, 768, DST_BITMAP);
CDialog::OnPaint();
Для вывода изображения на экран надо прописать этот код в ::OnPaint(), потому что, если написать данный код в ::OnButton1(), то ничего происходить не будет.
Хотелось бы узнать, как связать нажатие кнопки с выводом изображения?
« Последнее редактирование: 09-12-2009 05:42 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #1 : 09-12-2009 04:09 » 

где ты сию чушь вычитал ? )

1) CPaintDC dc(this); - может находиться только в обработчике OnPaint() (никаких OnButton)

2) если даже в OnPaint(), вызывать в таком порядке, как ты привёл, то покажется просто пустой серый диалог. Так как  CDialog::OnPaint(); затрёт все твои труды.

Цитата
Хотелось бы узнать, как связать нажатие кнопки с выводом изображения?
всё зависит от задачи - надо разово показать картинку или зажечь её (и пущай горит) ? )
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #2 : 09-12-2009 05:38 » 

Цитата
если даже в OnPaint(), вызывать в таком порядке, как ты привёл, то покажется просто пустой серый диалог. Так как  CDialog::OnPaint(); затрёт все твои труды.
Фиг его знает, у меня в OnPaint() этот код стоит, и ничего, при запуске программы картинка на экране светится Улыбаюсь

Цитата
всё зависит от задачи - надо разово показать картинку или зажечь её (и пущай горит) ?
В общем, хотелось бы, чтоб после нажатия на кнопку вылез стандартный диалог, в котором можно было бы выбрать нужную картинку для вывода на экран.

А пока имею только поле, в которое ввожу название картинки, и после нажатия на кнопку картинка должна показаться на экран, если я в поле введу другое название картинки, то после нажатия на кнопку уже другая картинка должна быть на экране.
« Последнее редактирование: 09-12-2009 06:09 от NAYGER » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #3 : 09-12-2009 06:07 » 

Фиг его знает, у меня в OnPaint() этот код стоит, и ничего, при запуске программы картинка на экране светится Улыбаюсь
ну, значит, сам диалог ничего не рисует - я не проверял ) А вообще, вызов родитель::OnPaint() делается, если нужно нарисовать морду родительского класса, а потом рисовать поверх (или не рисовать вообще). Да и то, если рисовать поверх, нужно будет вызвать GetDC/ReleaseDC

Стандартный диалог - читай про CFileDialog в MSDN.
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #4 : 09-12-2009 06:14 » 

Да суть не в диалоге в общем, а как после нажатия на кнопку изображение на экран вывести.
Или в ::OnPaint() как-то написать,
Если нажата кнопка Button1, то показываем изображение.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #5 : 09-12-2009 06:17 » 

в классе диалога завести переменную/хендл/указатель , который заполнить по нажатию кнопки, а при перерисовке из этой переменной выводить картинку
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #6 : 09-12-2009 09:00 » 

Вот нашел:
Код:
В файле My1Dlg.h
добавляешь переменную BOOL flag;
afx_msg void OnBnClickedButton();
 
На диалог ставишь кнопку.
В файле My1Dlg.cpp 
 
BEGIN_MESSAGE_MAP(CMy1Dlg, CDialog)
        ON_BN_CLICKED(IDC_BUTTON, &CMy1Dlg::OnBnClickedButton)
END_MESSAGE_MAP()
void CMy1Dlg::CMy1Dlg()
{
flag=false;
}
 
void CMy1Dlg::OnBnClickedButton()
{
 flag=!flag;
Invalidate();
}
 
void CMy1Dlg::OnPaint()
{
.....
if(flag) {Рисуешь картинку}
....
}

А проще нельзя сделать?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #7 : 09-12-2009 09:06 » 

куда уж проще то ? Улыбаюсь А пример с флагом - это учень уж просто, это негибко
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #8 : 09-12-2009 09:13 » 

Мда, что-то я погорячился Улыбаюсь
Записан
NAYGER
Участник

ru
Offline Offline

« Ответ #9 : 09-12-2009 09:22 » 

Почему, при таком виде ничего не выводится:
Код:
void CMyDlg::OnPaint()
{
...
 {   
if(flag)
   {
    HBITMAP hbit = (HBITMAP)::LoadImage(NULL,"Картинки\\"+namebmp+".bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
 CPaintDC dc(this);
::DrawState (dc.m_hDC, NULL, NULL, (WPARAM)hbit, (LPARAM)0, 0,0, 1280, 768, DST_BITMAP);
   }
 }
CDialog::OnPaint();
}
Где CString namebmp; - это название изображения вводимое в edit.

А при таком виде работает:
Код:
void CMyDlg::OnPaint()
{
...
 {   
if(flag)
   {
    HBITMAP hbit = (HBITMAP)::LoadImage(NULL,"Картинки\\5.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
 CPaintDC dc(this);
::DrawState (dc.m_hDC, NULL, NULL, (WPARAM)hbit, (LPARAM)0, 0,0, 1280, 768, DST_BITMAP);
   }
 }
CDialog::OnPaint();
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #10 : 09-12-2009 09:35 » 

Ну, ответ очевиден, потому что содержимое namebmp не равно "5".

Пользуйся дебагом -
 F9 - установка брекпоинта
 F5 - запуск отладки

Также, если так лень нормально форматировать код отступами, выдели в студии блок кода и нажми Alt+F8.

А ещё: так не делают -
Код:
void CMyDlg::OnPaint()
{
...
{   
...
{
CPaintDC dc(this);
}
}
CDialog::OnPaint();
}

Если сам полностью рисуешь контекст, то в начале OnPaint ВСЕГДА -
Код:
void CMyDlg::OnPaint()
{
CPaintDC dc(this);// <<<<<<<<<<<<<<<<<<

...
...
// а CDialog::OnPaint(); - не надо уже
}

Если хочешь рисовать поверх родителя, то
Код:
void CMyDlg::OnPaint()
{
CDialog::OnPaint();
// CPaintDC dc(this); - это нельзя уже!
CDC* pDC=GetDC();

...
...


ReleaseDC(pDC);//обязательно освободить после GetDC
pDC=0;
}
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #11 : 09-12-2009 10:12 » 

Блин, что-то не получается этот последний камень преткновения обрулить.

Люди добрые, если есть у кого время, гляньте исходник:
 

* OpenBMP.rar (25.59 Кб - загружено 890 раз.)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 09-12-2009 10:18 » 

Опять жесть. С удовольствием бы помог, только русские имена файлов на немецкой системе показываются только в эксплорере. Жаль

Могу только предположить, что от сложения константной строки "Картинки\\" и объкта типа CString ничего хорошего не получится, насколько мне известно нет такого оператора в С++. Наоборот делать можно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #13 : 09-12-2009 10:22 » 

В любом случае, переменная namebmp пустая , там "" . Так сказал отладчик )

вот так заработает
Код:
CString txt;
GetDlgItemText(IDC_EDIT1,txt);
HBITMAP hbit = (HBITMAP)::LoadImage(NULL,txt+".bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #14 : 09-12-2009 11:16 » 

Алексей1153++,  благодарю, снова выручил Улыбаюсь
« Последнее редактирование: 09-12-2009 11:18 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #15 : 09-12-2009 11:20 » 

NAYGER, "сного" - это шедевр ! )) Татьяна бы тебя подвесила за я* на первом столбе на всю ночь в полнолуние в назидание...
Записан

Sel
Злобный
Администратор

ru
Offline Offline

« Ответ #16 : 09-12-2009 11:27 » 

Клинический случай...
Записан

Слово не воробей. Всё не воробей, кроме воробья.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 09-12-2009 11:42 » 

А не проще сделать UpdateData или обновить мемберную переменную любым другим способом в обработчике нажатия на кнопку? А то в отрисовке опрашивать контрол, посылать синхронное сообщение, это не то чтобы совсем неспортивно, а просто ...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #18 : 09-12-2009 11:48 » 

Ну это я код не переделывал. А так - при нажатии кнопки вытащить текст один раз
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 09-12-2009 11:54 » 

... и сразу загрузить картинку, а в OnPaint только отрисовывать. Ага Идеально.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #20 : 09-12-2009 12:02 » 

Ну это, я полагал, вообще само собой ) Это сейчас, когда картинки маленькие, всё нормально, а потом бы затормозило и всё равно пришлось бы переделать
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines