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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

Guest

А можно попобробнее? Мои эксперименты встали на следующем:
Объявил в 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 не изменяет значений при изменении размеров формы, но ошибок тоже нет.
 
G

Guest

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

Guest

Нет, раньше я ничего в 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++, поэтому пока могу самостоятельно действовать только методом научного тыка. Прошу описать сам алгоритм, как правильно добавить это событие.
 
E

European

Прошу описать сам алгоритм, как правильно добавить это событие.
Добавляете сообщение в карту, добавляете прототип и реализацию обработчика. Всё! Вы, уже всё это сделали. Единственная проблема в том, что обработчик Вы написали для класса CSlovDlg, а карту объявили для CAboutDlg. Вы уж определитесь для какого диалога переопределяете событие. Думаю нужно:
Код:
BEGIN_MESSAGE_MAP(CSlovDlg, CDialog)
 
G

gamecreator

легче воспользоваться MFC ClassWizard
 
G

Guest

Про Визард - это, конечно, хорошо, но раз уж так начали, то продолжим...
Теперь уже лучше: хотя бы ошибка появляется. Переместил запись в нужное место:
[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
    18,6 КБ · Просмотры: 377
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!