NAYGER
Участник
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 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 09-12-2009 04:09 » |
|
где ты сию чушь вычитал ? ) 1) CPaintDC dc(this); - может находиться только в обработчике OnPaint() (никаких OnButton) 2) если даже в OnPaint(), вызывать в таком порядке, как ты привёл, то покажется просто пустой серый диалог. Так как CDialog::OnPaint(); затрёт все твои труды. Хотелось бы узнать, как связать нажатие кнопки с выводом изображения?
всё зависит от задачи - надо разово показать картинку или зажечь её (и пущай горит) ? )
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #2 : 09-12-2009 05:38 » |
|
если даже в OnPaint(), вызывать в таком порядке, как ты привёл, то покажется просто пустой серый диалог. Так как CDialog::OnPaint(); затрёт все твои труды. Фиг его знает, у меня в OnPaint() этот код стоит, и ничего, при запуске программы картинка на экране светится всё зависит от задачи - надо разово показать картинку или зажечь её (и пущай горит) ? В общем , хотелось бы, чтоб после нажатия на кнопку вылез стандартный диалог , в котором можно было бы выбрать нужную картинку для вывода на экран. А пока имею только поле, в которое ввожу название картинки, и после нажатия на кнопку картинка должна показаться на экран, если я в поле введу другое название картинки, то после нажатия на кнопку уже другая картинка должна быть на экране.
|
|
« Последнее редактирование: 09-12-2009 06:09 от NAYGER »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 09-12-2009 06:07 » |
|
Фиг его знает, у меня в OnPaint() этот код стоит , и ниче го, при запуске программы картинка на экране светится ну, значит, сам диалог ничего не рисует - я не проверял ) А вообще, вызов родитель::OnPaint() делается, если нужно нарисовать морду родительского класса, а потом рисовать поверх (или не рисовать вообще). Да и то, если рисовать поверх, нужно будет вызвать GetDC/ReleaseDC Стандартный диалог - читай про CFileDialog в MSDN.
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #4 : 09-12-2009 06:14 » |
|
Да суть не в диалоге в общем, а как после нажатия на кнопку изображение на экран вывести. Или в ::OnPaint() как-то написать, Если нажата кнопка Button1, то показываем изображение.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 09-12-2009 06:17 » |
|
в классе диалога завести переменную/хендл/указатель , который заполнить по нажатию кнопки, а при перерисовке из этой переменной выводить картинку
|
|
|
Записан
|
|
|
|
NAYGER
Участник
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) {Рисуешь картинку} .... } А проще нельзя сделать?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 09-12-2009 09:06 » |
|
куда уж проще то ? А пример с флагом - это учень уж просто, это негибко
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #8 : 09-12-2009 09:13 » |
|
Мда, что-то я погорячился
|
|
|
Записан
|
|
|
|
NAYGER
Участник
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(); }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #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
Участник
Offline
|
|
« Ответ #11 : 09-12-2009 10:12 » |
|
Блин, что-то не получается этот последний камень преткновения обрулить.
Люди добрые, если есть у кого время, гляньте исходник:
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #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);
|
|
|
Записан
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 09-12-2009 11:20 » |
|
NAYGER, "сного" - это шедевр ! )) Татьяна бы тебя подвесила за я* на первом столбе на всю ночь в полнолуние в назидание...
|
|
|
Записан
|
|
|
|
Sel
Злобный
Администратор
Offline
|
|
« Ответ #16 : 09-12-2009 11:27 » |
|
Клинический случай...
|
|
|
Записан
|
Слово не воробей. Всё не воробей, кроме воробья.
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 09-12-2009 11:48 » |
|
Ну это я код не переделывал. А так - при нажатии кнопки вытащить текст один раз
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 09-12-2009 12:02 » |
|
Ну это, я полагал, вообще само собой ) Это сейчас, когда картинки маленькие, всё нормально, а потом бы затормозило и всё равно пришлось бы переделать
|
|
|
Записан
|
|
|
|
|