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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Картинка в окне диалога  (Прочитано 19634 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Richi
Гость
« : 27-03-2006 09:51 » 

Ситуация такова: главное окно проги - окно диалога. На это окно выводится лого в виде BMP картинки. С этим проблем нет. Проблема вот в чем: отрисовка лого у меня вызывается из фунции OnPaint() - (обработчик сообщения WM_PAINT). В этом случае при запуске проги, это лого на миг появляется в окне и тут же чем-то затирается. Если же я после этого искусственно вызываю WM_PAINT (например смещаю окно к краю экрана), тогда лого тут же отрисовывается нормально и уже не пропадает.
Вопрос: как вызвать отрисовку лого уже после того, как окно появилось?
Заранее спасибо.
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 27-03-2006 10:02 » 

ну после ShowWindow, используй InvalidateRect
Записан

Удачного всем кодинга! -=x[PooH]x=-
Richi
Гость
« Ответ #2 : 27-03-2006 10:14 » 

А ShowWindow нет Жаль   Диалог вызывается при помощи DoModal.
Записан
nikedeforest
Команда клуба

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

« Ответ #3 : 27-03-2006 10:20 » 

Ну после DoModal используй InvalidateRect Ага.
Записан

ещё один вопрос ...
Richi
Гость
« Ответ #4 : 27-03-2006 10:39 » 

А после DoModal окно уже закрыто...
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #5 : 27-03-2006 10:42 » 

лучше, конечно, не извращаться, а выяснить чем затирается картинка, я лично не могу понять, чем она может затираться.

и еще, ты вызываешь в OnPaint() стандартный для диалога OnPaint()? Если да, то выводи картинку после него.
Записан

Удачного всем кодинга! -=x[PooH]x=-
nikedeforest
Команда клуба

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

« Ответ #6 : 27-03-2006 10:47 » 

Не понял. В МФЦ кажется диалог создается с помощью функции DoModal(). А ты говоришь, что окно закрыто. Я не знаток МФЦ, но здесь кто-то из нас что-то путает. Тебе советуют перерисовать заданную область окна. С помощью функции InvalidateRect ты можешь объявить недействительной либо все окно, либо его часть. В твоем случае лучше часть окна и именно ту часть в которой содержится логотип. Можешь координаты задать в структуру Rect или как там ее, ты их знаешь, раз логотип рисуешь.
Записан

ещё один вопрос ...
Richi
Гость
« Ответ #7 : 27-03-2006 11:10 » 

Сейчас расскажу поподробнее. Я немного неточно описал в самом начале. Главное окно проги - диалог. У него есть меню. Один из пунктов этого меню открывает другое диалоговое окно при помощи DoModal(). Вот в это второе окно я как раз и вывожу лого. Как известно, функция DoModal() завершает свою работу после того, как вызванное ею окно закрыто. DoModal() возвращает способ закрытия окна - IDOK при закрытии окна кнопкой ОК, либо IDCANCEL при закрытии окна кнопкой Cancel, или нажатии на "X".
Для отрисовки лого я создал класс, производный от CStatic. На диалоге, в том месте, где предполагается лого, устанавливается контрол этого класса. Один из методов этого класса InsertBmp( CBitmap *pBmp, BOOL bStretchBmp ) "приклеивает" на этот контрол битмэп. Первый параметр - указатель на битмэп, второй - способ "приклейки": либо битмэп растягивается до размеров контрола, либо наоборот, контрол подгоняется под размер BMP.
Записан
Richi
Гость
« Ответ #8 : 27-03-2006 11:15 » 

лучше, конечно, не извращаться, а выяснить чем затирается картинка, я лично не могу понять, чем она может затираться.

и еще, ты вызываешь в OnPaint() стандартный для диалога OnPaint()? Если да, то выводи картинку после него.
Я так и делаю. Но в том то и проблема, что первоначально OnPaint() вызывается до того, как окно появилось на экране. Вот когда я смещаю это окно к краю экрана, тем самым я заставляю это окно перерисоваться при помощи того же OnPaint(). Вот тогда лого нормально отрисовывается.
Записан
Джон
просто
Администратор

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

« Ответ #9 : 27-03-2006 11:54 » 

Какие стили у контрола? И покажи код.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Richi
Гость
« Ответ #10 : 27-03-2006 12:21 » 

Код, как я BMP наклеиваю?
вот он
А о каких стилях ты говоришь?
//=========================================================
void CStaticEx::InsertBmp( CBitmap *pBmp, BOOL bStretchBmp )
{
   CDC*      PicDC;
   CDC      MemDC;
   RECT      Rect;
   BITMAP      m_bmInfo;

   GetClientRect(&Rect);
   PicDC = GetDC();
   MemDC.CreateCompatibleDC(PicDC);
   MemDC.SelectObject(pBmp);
   pBmp->GetObject(sizeof(BITMAP), &m_bmInfo);

   if( bStretchBmp )
   {   //-- stretch BMP --
      Rect.top = Rect.top +1;
      Rect.bottom = Rect.bottom -1;
      Rect.left = Rect.left +1;
      Rect.right = Rect.right -1;
   }
   else
   {   //-- stretch control --
      Rect.top = Rect.top +1;
      Rect.bottom = m_bmInfo.bmHeight;
      Rect.left = Rect.left +1;
      Rect.right = m_bmInfo.bmWidth;
   }

   PicDC->StretchBlt(Rect.left, Rect.top, Rect.right-Rect.left,
      Rect.bottom - Rect.top,&MemDC,0,0, m_bmInfo.bmWidth, m_bmInfo.bmHeight, SRCCOPY);

}
//=========================================================
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #11 : 27-03-2006 13:39 » 

а void CStaticEx::OnPaint(или что-то в этом роде - я с MFC не работаю) переопределяешь?

давай код твоего OnPaint (код вставь в теги [ code] [ /code])
« Последнее редактирование: 27-03-2006 13:42 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Richi
Гость
« Ответ #12 : 27-03-2006 14:19 » 

OnPaint() - это стандартный обработчик сообщения WM_PAINT. Это сообщение генерируется в случае, если окно необходимо перерисовать. Из этой функции и вызывается отрисовка лого.
 
Код:
void CMyDlg::OnPaint()
{
      CPaintDC dc(this); // device context for painting
      m_Logo.InsertBmp( &bmpLogo, 1 );
}
m_Logo - это объект класса CStaticEx
Таким образом вызывается функция, код которой я приводил выше.

Может быть есть какое-то стандартное виндовское сообщение, которое отправляется после того, как отрисовка окна диалога завершена?
« Последнее редактирование: 27-03-2006 14:26 от Richi » Записан
Джон
просто
Администратор

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

« Ответ #13 : 27-03-2006 14:39 » 

Когда ты на диалоге CStatic добавляешь там можно его стили указать - рамка, и тд
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Richi
Гость
« Ответ #14 : 27-03-2006 14:48 » 

Вот, с файла ресурсов скопировал
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
Записан
Джон
просто
Администратор

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

« Ответ #15 : 27-03-2006 15:01 » 

Нееет не диалога, контролла. типа

CONTROL         "",IDC_STATIC,"Static",SS_BLACKFRAME,187,99,72,50
или
CONTROL         "",IDC_STATIC,"Static",SS_BITMAP,187,99,72,50 // вот так правильно
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Джон
просто
Администратор

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

« Ответ #16 : 27-03-2006 15:06 » 

Ааааа подожди - я совсем ничего не понял. Если это у тебя контрол? Зачем ты его в OnPaint() актуаллизируешь. Каждый контрол сам себя рисует (на то он и контрол).
Если же ты хочешь в девайсконтекст диалога рисовать то и передавай его в InsertBmp.
Если проект небольшой и ничего секретного - кинь на мыло. Быстрее будет.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Richi
Гость
« Ответ #17 : 27-03-2006 15:12 » 

LTEXT           " ",IDC_LOGO,7,283,335,70

или опять не то?
Записан
Richi
Гость
« Ответ #18 : 27-03-2006 16:09 » 

Если проект небольшой и ничего секретного - кинь на мыло. Быстрее будет.
Проект большой, к тому же он работает с USB девайсом и без него не поднимется.
Я пришлю тебе небольшой тестовый проектик, где я делаю практически то же самое, только битмэпки клеятся на кнопки.
На какой мэйл слать?
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #19 : 28-03-2006 05:32 » 

тебе надо
Код:
void CMyDlg::OnPaint()
{
      CPaintDC dc(this); // device context for painting
      m_Logo.InsertBmp( &bmpLogo, 1 );
}
заменить на
Код:
void CStaticEx::OnPaint()
{
      CPaintDC dc(this); // device context for painting
      m_Logo.InsertBmp( &bmpLogo, 1 );
}
Записан

Удачного всем кодинга! -=x[PooH]x=-
Richi
Гость
« Ответ #20 : 29-03-2006 08:15 » 

Спасибо всем за помощь.
Джон, тебе отдельное спасибо за присланный примерчик. Все оказалось гораздо проще, чем я думал.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines