Максимизация формы

Тема в разделе "MS Visual C++", создана пользователем -, 11 апр 2008.

Статус темы:
Закрыта.
  1. Гость

    Суть проблемы такова: необходимо цивильно оформить максимизацию формы (т.е разворот ее на весь экран). Это значит, что, например, кнопочки должны разъезжаться по своим углам, а остальные объекты изменять размер. Напрмер, в Delphi все просто и понятно: создаем событие OnResize (или что-то типа того), и в нем высчитываем все размеры и координаты. А тут - битый час пытаюсь что-то найти, "а в ответ - тишина". Помогите, а?
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
  3. Гость

    А можно попобробнее? Мои эксперименты встали на следующем:
    Объявил в SlovDlg.h (проект называется Slov) функцию OnSize:
    [codebox] // Generated message map functions
    //{{AFX_MSG(CSlovDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnExitButton();
    afx_msg void OnMixButton();
    afx_msg void OnSize(UINT nType, int cx, int cy); //Вот это объявление
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()[/codebox]

    Затем в SlovDlg.cpp добавил код:
    [codebox]void CSlovDlg::OnSize(UINT nType, int cx, int cy)
    {
    m_Edit="asfasgdf"; //m_Edit - переменная, связанная с Edit Control, который есть на форме.
    }[/codebox]
    Edit не изменяет значений при изменении размеров формы, но ошибок тоже нет.
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    После установки значения Edit-у нужно вызывать
    Код (Text):
     UpdateData( FALSE );
     
  5. Гость

    Конечно, про UpdateData( FALSE ) я эабыл напрасно, но, тем не менее, ситуация не изменилась.
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Значит что-то не правильно делаете. В карту сообщение добавили?
    Код (Text):
    BEGIN_MESSAGE_MAP(...)
    ...
    ON_WM_SIZE()
    ...
    END_MESSAGE_MAP()
     
  7. Гость

    Нет, раньше я ничего в BEGIN_MESSAGE_MAP не добавлял. Теперь, если я правильно сделал, то это должно выглядеть так:
    [codebox]BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
    ON_WM_SIZE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()[/codebox]
    Но, увы, опять не пашет.
    Хочу предупредить: это моя первая (и на данный момент последняя) работа по Visual C++, поэтому пока могу самостоятельно действовать только методом научного тыка. Прошу описать сам алгоритм, как правильно добавить это событие.
     
  8. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Добавляете сообщение в карту, добавляете прототип и реализацию обработчика. Всё! Вы, уже всё это сделали. Единственная проблема в том, что обработчик Вы написали для класса CSlovDlg, а карту объявили для CAboutDlg. Вы уж определитесь для какого диалога переопределяете событие. Думаю нужно:
    Код (Text):
    BEGIN_MESSAGE_MAP(CSlovDlg, CDialog)
     
  9. gamecreator

    gamecreator Гость

    легче воспользоваться MFC ClassWizard
     
  10. Гость

    Про Визард - это, конечно, хорошо, но раз уж так начали, то продолжим...
    Теперь уже лучше: хотя бы ошибка появляется. Переместил запись в нужное место:
    [codebox]BEGIN_MESSAGE_MAP(CSlovDlg, CDialog)
    //{{AFX_MSG_MAP(CSlovDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_SIZE() //Вот оно
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_EXIT_BUTTON, OnExitButton)
    ON_BN_CLICKED(IDC_MIX_BUTTON, OnMixButton)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()[/codebox]
    Но тоеперь наблюдаю ошибку (см. приложенную картинку).
    А вот тот самый кусок кода, на который ругается:
    [codebox]HWND CDataExchange::prepareCtrl(int nIDC)
    {
    ASSERT(nIDC != 0);
    ASSERT(nIDC != -1); // not allowed
    HWND hWndCtrl;
    COleControlSite* pSite = NULL;
    m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
    if (hWndCtrl == NULL)
    {
    // Could be a windowless OCX
    pSite = m_pDlgWnd->GetOleControlSite(nIDC);
    if (pSite == NULL)
    {
    TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC);
    ASSERT(FALSE); //Здесь
    AfxThrowNotSupportedException();
    }
    }
    m_idLastControl = nIDC;
    m_bEditLastControl = FALSE; // not an edit item by default

    return hWndCtrl;
    }[/codebox]
     

    Вложения:

    • err.JPG
      err.JPG
      Размер файла:
      21,3 КБ
      Просмотров:
      9
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей