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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перерисовка в VC  (Прочитано 13233 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ламер.
Гость
« : 02-08-2004 05:38 » 

Возникла проблема с прорисовкой:
На ChildView основного окна рисую прямоугольник
В классе CChildView обрабатываю PreTranslateMessage и передаю управление в свой класс в функцию RelayEvent:

   switch(pMsg->message){
   
      case WM_LBUTTONDOWN:   OnLButtonDown(CPoint(pMsg->lParam));break;
      case WM_PAINT:         OnPaint();break;
      case WM_LBUTTONUP:      OnLButtonUp(CPoint(pMsg->lParam));break;
      case WM_MOUSEMOVE:      OnMouseMove(CPoint(pMsg->lParam));break;
   }

На OnPaint прорисовываю свой прямоугольник

 //Получаем CDC
 CMainFrame* pMainFrame=(CMainFrame*)(g_theApp.m_pMainWnd);//Получаем главное окно приложения
CDC* DrawDC=pMainFrame->m_wndView.GetDC();
 //Рисуем контур
  ObjectRect ORect=((GraphObject*)(m_ObjectArray.GetAt(m_FocusNum)))->ObRect;
   CRect RealRect;
    RealRect.left=ORect.left-m_WindowRect.left;
    RealRect.right=ORect.right-m_WindowRect.left;
     RealRect.top=ORect.top-m_WindowRect.top;
      RealRect.bottom=ORect.bottom-m_WindowRect.top;
        CPen myPen;
        CPen* OldPen;
         myPen.CreatePen(PS_SOLID,2,RGB(0,0,255));//Ставим синее перо
         OldPen=DrawDC->SelectObject(&myPen);//Подключаем к нашему CDC
           DrawDC->Rectangle(&RealRect);//прорисовка контура
             DrawDC->SelectObject(OldPen);//Восстанавливаем старое перо
             myPen.DeleteObject();//Удаляем перо


В итоге при сворачивании или разворачивании или изменении размера окна прямоугольник исчезает Что я делаю неправильно? Please help!!!!
Записан
Джон
просто
Администратор

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

« Ответ #1 : 02-08-2004 08:37 » 

Я не понял, что значит ChildView? Это нормальный CView, MDI приложения?
Тогда делай обработку OnPaint в CView, а ещё лучше в виртуальной ф-ии OnDraw.
Если же ты имеешь ввиду клиентскую область MDI, то расскажи поподробнее, что ты хочешь? ЧТо такое m_WindowRect и ObjectRect?  Может у тебя не правильный пересчёт ScreenToClient или наоборот? В общем не хватает информации, чтоб помочь.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Ламер.
Гость
« Ответ #2 : 02-08-2004 10:19 » 

ChildView это CWnd от SDI приложения
Когда делаю обработку в CView то все работает ок а на PreTranslateMessage не хочет а хотелось бы все таки на нем... Мне интересно почему не работает в PreTranslateMessage?
Записан
Джон
просто
Администратор

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

« Ответ #3 : 02-08-2004 13:24 » 

Цитата: Ламер.
ChildView это CWnd от SDI приложения


А ты не можешь показать как он инициаллизируется? Я что-то про такое в первый раз слышу. У тебя какого типа приложение? SDI? Тогда стандартный набор классов - App MainFrame Doc и View. Который из них ChildView?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Ламер.
Гость
« Ответ #4 : 03-08-2004 02:43 » 

class CChildView : public CWnd
............
class CMainFrame : public CFrameWnd
{
............
   CChildView  m_wndView;
..................

if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
      CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
   {
      TRACE0("Failed to create view window\n");
      return -1;
   }
Записан
Ламер.
Гость
« Ответ #5 : 03-08-2004 02:47 » 

Цитата: Джон
Цитата: Ламер.
ChildView это CWnd от SDI приложения


А ты не можешь показать как он инициаллизируется? Я что-то про такое в первый раз слышу. У тебя какого типа приложение? SDI? Тогда стандартный набор классов - App MainFrame Doc и View. Который из них ChildView?


Я не использую представление Document/View
Записан
Джон
просто
Администратор

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

« Ответ #6 : 03-08-2004 07:23 » 

Ламер.,  Если проект небольшой - кинь мне на мыло. А то так сложно угадывать.
Записан

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

ru
Offline Offline
78


« Ответ #7 : 03-08-2004 08:17 » 

Ламер.,
я рисую у себя так -
void CView::DoPaint(CDCHandle dc)
{
    int nOrigDC = dc.SaveDC();
    CBitmap bmp;
    HRESULT hr;
    CBrush br;
    COLORREF colorBg = RGB(0xff,0xff,0xff);
    CRect cr;
    GetClientRect(&cr);
    if( !m_dcMem.m_hDC)        
        m_dcMem.CreateCompatibleDC(dc);
   
   if( !bmp.CreateCompatibleBitmap(dc, cr.Width(), cr.Height()))
    {
        return;
    }
    HBITMAP hBmpOld = m_dcMem.SelectBitmap(bmp);
    br.CreateSolidBrush(m_colorBg);
    HBRUSH old_br = m_dcMem.SelectBrush(br);
    m_dcMem.PatBlt(0, 0, cr.Width(), cr.Height(), PATCOPY);

    Draw(m_dcMem);     //рисуем что угодно в m_dcMem

    dc.BitBlt(0, 0, cr.Width(), cr.Height(), m_dcMem, 0, 0, SRCCOPY);
    m_dcMem.SelectBitmap(hBmpOld);
    m_dcMem.SelectBrush(old_br);
    bmp.DeleteObject();
    dc.RestoreDC(nOrigDC);
    return;
}
усе перерисовывается
DoPaint вызывается из OnPaint базового класса WTL
вот ее код , если интересно
LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
   {
      T* pT = static_cast<T*>(this);
      ATLASSERT(::IsWindow(pT->m_hWnd));
      if(wParam != NULL)
      {
         CDCHandle dc = (HDC)wParam;
         dc.SetMapMode(m_nMapMode);
         if(m_nMapMode == MM_TEXT)
            dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
         else
            dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy);
         dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.bottom);
         pT->DoPaint(dc);
      }
      else
      {
         CPaintDC dc(pT->m_hWnd);
         dc.SetMapMode(m_nMapMode);
         if(m_nMapMode == MM_TEXT)
            dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
         else
            dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy);
         dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.bottom);
         pT->DoPaint(dc.m_hDC);
      }
      return 0;
   }
};
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Ламер.
Гость
« Ответ #8 : 03-08-2004 08:42 » 

Что такое WTL? Предпочитаю MFC и WinAPI
Записан
Ламер.
Гость
« Ответ #9 : 03-08-2004 08:43 » 

Цитата: Джон
Ламер.,  Если проект небольшой - кинь мне на мыло. А то так сложно угадывать.


Ценю твою заинтересованность но проект бооольшой )))
Записан
Джон
просто
Администратор

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

« Ответ #10 : 03-08-2004 09:22 » 

WTL - windows template library - шаблонная библитека-враппер для ATL. Ну типа как MFC для API функций.

Ламер.,  Да заинтересованности то большой и нет. Просто нет много времени расспрашивать. А при нестандартном подходе - ну откуда я знаю что ты там сделал? А в коде проще разбираться - хотя бы дебаггером по нему пройтись.
Ну, а вообще, смотри сам. Если очень нужно, то милости просим.  А так, думаю вряд ли кто поможет ошибку найти - очень мало инфы. Жаль  Посмотри, всё это время мы выясняли только, что ты сделал? И не слова по существу. Ведь ты не написал сначала, что у тебя MFC, без Doc/View и тд. Теперь я тебя буду спрашивать - а PreTranslateMessage вообще вызывается?  И тд и тп А так можно только гадать - неправильные Rect? или связи parent-child?

Посмотри, может сможешь, если у тебя всё в MainFrame, просто этот кусок, без всех премудростей вырезать? Всё, что надо это App + CMainFrame + CChildView + 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."
Pu
Большой босс

ru
Offline Offline
78


« Ответ #11 : 03-08-2004 09:47 » 

Джон, извини не соглашусь, WTL - это библиотека оберток не для АТL а как раз для АПИ. Просто построена она на основе АТЛ, в базе всех оконных классов лежит АТL::CWindow. И все функции работы с окнами перенаправляются на АПИ.
к примеру
    DWORD GetStyle() const throw()
    {
        ATLASSERT(::IsWindow(m_hWnd));
        return (DWORD)::GetWindowLong(m_hWnd, GWL_STYLE);
    }
и все в том же духе, мне кажется что втл всеж ближе к истокам АПИ, имхо.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Джон
просто
Администратор

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

« Ответ #12 : 03-08-2004 10:20 » 

Pu,  Эт вообще-то не я придумал:

Цитата: Дядя Бил энд компания

Windows Template Library (WTL) is a library for developing Windows® applications and UI components. It extends ATL (Active Template Library) and provides a set of classes for controls, dialogs, frame windows, GDI objects, and more.


То, что ты привёл конечно правильно, но это только пример враппера ф-ции. А в основе сборки проги на WTL лежит ATL. Как не крути.

Ну а про API - а разве есть какой нить другой способ под виндой программить, кроме как API?  Ага
Записан

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

ru
Offline Offline
78


« Ответ #13 : 03-08-2004 11:53 » new

Джон,  c этим не поспоришь, просто я писал в свое время с mfc , и как бы из опыта - к апи, как оно есть, стал гораздо ближе перейдя на wtl. Во всяком случае стал понимать суть происходящего.
а из твоей сносочки я понял всеж что мое представление о втл более правильное   8)  - из сказанного гласит что втл - это расширение атл(заметь , а не обертка). А из моих скромных познаний в mfc и wtl могу заключить что и то и другое одно и тоже ( во всяком случае что касается разработки гуи), реализуют обертки АПИ. Часто изза отсутствия доки по wtl пользуюсь доками mfc.  Улыбаюсь А может я не правильно понимаю суть слово "враппер".
извини но мне прошел по ушам твой фраз -  "шаблонная библитека-враппер для ATL".
я б сказал так - шаблонная библитека-враппер для АПИ основанная на ATL.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines