Создание контролов на окне
class CMainWnd: public CFrameWnd {
CButton *but; //типо указатель
public:
CMainWnd();
};
CMainWnd::CMainWnd() {
but = new CButton;
but->Create("Кнопка", WS_CHILD|BS_PUSHBUTTON|WS_BORDER, CRect(300, 100, 450, 130), this, IDC_BUTTON);
but->ShowWindow(SW_SHOW);
}
только перед этим делом нужно объявить идентефикатор кнопки:
#define IDC_BUTTON 102
что-то вроди такого.
Необходимо сделать приложение на основе MFC, в главном окне которого будет находиться 2 поля ввода, ListView и 3 кнопки. Насколько я знаю, при создании проекта мастер предлагает создать необходимые классы. Если там задавать класс контрола ListView, то он распахивается на все окно приложения. То есть не остается места для всяких кнопок и полей. Как не дать ListView занимать весь экран? И каким образом создавать кнопки? Надо создавать отдельный класс для каждой кнопки или как-то по-другому? Или вообще лучше делать эти вещи с помощью диалогов?
Сделай с помощью Wizard-а окно на основе диалога, да и все дела - проектировать легко, обрабатывать - тож не сложно. Создавать собственные кнопки не нужно, можно будет из окна перехватывать сообщения рабочих элементов, для этого открой Class Wizard, там есть два списочка, в левом выбираешь идентификатор элемента управления, а в правом - соответствующее сообщение от этого элемента, создается обработчик, и в нем делай, что должна делать твоя кнопка.
2GDragon: в смысле на основе обычных диалогов, компоненты на которые навешиваются из панели с компонентами?
Необходимо сделать приложение на основе MFC, в главном окне которого будет находиться 2 поля ввода, ListView и 3 кнопки. Насколько я знаю, при создании проекта мастер предлагает создать необходимые классы. Если там задавать класс контрола ListView, то он распахивается на все окно приложения. То есть не остается места для всяких кнопок и полей. Как не дать ListView занимать весь экран? И каким образом создавать кнопки? Надо создавать отдельный класс для каждой кнопки или как-то по-другому? Или вообще лучше делать эти вещи с помощью диалогов?
Как я понимаю, тебе надо в окне SDI (или MDI) приложения разместить свои контролы, а диалогбокс не устраивает? Все просто: если при создании, SDI указать класс окна FormView то в клиентской области можно рассовать любые контролы из палитры, т.е. как на диалоге.
Есть проблема. При создании контрола таким путем, как указал A.D.I.D.A.S., невозможно обычным способом указать обработчик нажатия кнопки (т.е. процедур обработки окна кнопки). Как это можно сделать?
Есть такая вещь - MessageMap, где указано что и как будет реагировать на сообщения. Например, если при щелчке по кнопке должен вызыватся метод OnButton3(), то в начале файла с классом CXXXView между BEGIN_MESSAGE_MAP и END_MESSAGE_MAP() пишешь следующее:
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
где IDC_BUTTON3 - идентификатор батона. Ну, и соответсвенно, пишешь реализацию метода OnButton3 для класса CXXXView.
2A.D.I.D.A.S: я пробовал делать так, но не с CButton, а с CListCtrl. При создании окна контрола выдается ошибка (возвращается 0).
2GDragon: в смысле на основе обычных диалогов, компоненты на которые навешиваются из панели с компонентами?
Да. В MFC-wizard-е первая страница выбираешь Dialog Based, создается приложение на базе диалога. Потом, к примеру, добавляешь кнопу и Edit, пусть по нажатии кнопы в Edit пришется "Hello World". Открывай правой кнопкой на элементе его свойства. Для кнопы по умолчанию идентификатор будет IDC_BUTTON1, для строки - IDC_EDIT1 (можешь переименовать, если есть желание). Edit теперь нужно проассоциировать со строкой или с элементом управления. В нашем случае нужно с элементом управления, т. к. текст будет меняться в процессе выполнения программы. Заходи в Class Wizard на вкладочку Member Variables (в списке Class Name должен быть выбран класс твоего диалога). В окошке выбирай идентификатор IDC_EDIT1, жми Add Variable... Обзови его как-нибудь (у меня в примере m_Edit), выбери Category Control (Variable Type автоматом станет CEdit). Готово. Теперь задействуем кнопу. Открывай Class Wizard, на первой вкладке в Object IDs выбирай IDC_BUTTON1, справа отобразятся все мессаги, которые приходят от этого элемента главному окну. Делай даблклик на BN_CLICKED, введи имя обработчика (или оставь OnButton1). Создался обработчик, заходи туда, пиши, что душе угодно. В нашем случае это будет выглядеть так:
void CMyDlg::OnButton1()
{
m_Edit.SetWindowText(_T("Hello world!"));
}
Компилируй, жми на кнопу.
Удачи!
Однако, насколько я знаю, в диалоговых приложениях нельзя добавить меню. А это уже серьезное ограничение.
Да кто тебе сказал? В редакторе ресурсов щелкай правой кнопкой по своему окну, выбирай Properties, там на первой же вкладке список Menu, ставь, какое хочешь. Ну, разумеется, сами меню должны быть до этого уже созданы.
Однако, насколько я знаю, в диалоговых приложениях нельзя добавить меню. А это уже серьезное ограничение.
Это гон, точно говорю=)
Есть еще проблема. Я нормально создал ListCtrl (динамически, без использования диалогов), добавил в него несколько строк. Когда запустил программу, строки не желали выделяться, а ширина колонок ListView не регулировалась. Что делать?
2GDragon: в любом случае диалоги меня мало устраивают, т.к. даже сами Microsoft рассматривают диалоги как элементарный тип приложений, не способный на многое.
Есть еще проблема. Я нормально создал ListCtrl (динамически, без использования диалогов), добавил в него несколько строк. Когда запустил программу, строки не желали выделяться, а ширина колонок ListView не регулировалась. Что делать?
Ну смотри сам, что тебе нужно от приложения. Насколько я помню, изначально требовалось обработать пару строк и пару кнопок, для этого супервозможности не нужны. Что до колонок, то я не понял, в чем твоя проблема делай так:
m_List.Create(WS_CHILD | WS_VISIBLE | LVS_ALIGNLEFT | WS_BORDER | LVS_REPORT, CRect(10, 10, 200, 300), this, 123);
m_List.InsertColumn(0, "Header1", LVCFMT_LEFT, 50);
m_List.InsertColumn(1, "Header2", LVCFMT_LEFT, 50);
m_List.InsertColumn(2, "Header3", LVCFMT_LEFT, 50);
Судя по всему, тебе просто следовало для полного счастья задать стиль LVS_REPORT.
А как получить хэндл, допустим, кнопки (CButton), помещенной именно на диалоге? А можно ли как-то изменить шрифт надписи (Static) на диалоге, чтобы другие надписи остались с прежними шрифтами?
Когда проассоциировал кнопку через DDE с классом CButton, то из этого класса бери m_hWnd, это и должен быть хендл, если только я ничего не путаю.
Про смену шрифта не знаю.
Ищи в МСДН по ключу SetFont.
Столкнулся с такой проблемой. У меня стоит Windows 2000 и Windows XP. Проги я пишу в XP. Когда я попытался запустить MFC'шную прогу в Windows 2000, где VS.NET не установлена, программа сказала, что не может найти файл mfc71***.dll. Пробовал сделать поддержку mfc из библиотеки, так exe файл раздулся до 2 мег вместо 200 Кб. Можно ли сохранить небольшой размер файла и при этом чтобы программа не требовала библиотек, которые могут быть не установлены на компе конечного пользователя?
если Visual Studio .NET, то в свойствах проекта - в основных, где использование MFC, указываешь использовать стнадартные библиотеки Виндоуз.
если Visual Studio .NET, то в свойствах проекта - в основных, где использование MFC, указываешь использовать стнадартные библиотеки Виндоуз.
... И пишешь программу на Win32, без юзания MFC
... И пишешь программу на Win32, без юзания MFC
нет, можно создать проект MFC - т.е. можно использовать классы MFC, но указать, что при компиляции использовать стандартные библиотеки Винды. Приложение получается намного меньше, чем при включении библиотек MFC и не привязывается к специфическим библиотекам.
нет, можно создать проект MFC - т.е. можно использовать классы MFC, но указать, что при компиляции использовать стандартные библиотеки Винды. Приложение получается намного меньше, чем при включении библиотек MFC и не привязывается к специфическим библиотекам.
Не-е-е... Чего-то я не догнал. Я поменял эту настройку, так мне при компоновке (Link) столько ошибок накидало! Чем лечить?
При использовании стандартных библиотек можно ли будет нормально работать с диалогами (т.е. так, как и со специальными библиотеками MFC)?
Не-е-е... Чего-то я не догнал. Я поменял эту настройку, так мне при компоновке (Link) столько ошибок накидало! Чем лечить?
При использовании стандартных библиотек можно ли будет нормально работать с диалогами (т.е. так, как и со специальными библиотеками MFC)?
может у тебя настройки линкера левые?
или может в пиратской версии такая штука не прокатывает...
я в приложениях, где использую классы MFC, указываю всегда использование стандартных библиотек...
приложение небольшое получается, под 2к и 98 чистыми запускается без проблем.
может у тебя настройки линкера левые?
или может в пиратской версии такая штука не прокатывает...
я в приложениях, где использую классы MFC, указываю всегда использование стандартных библиотек...
приложение небольшое получается, под 2к и 98 чистыми запускается без проблем.
OK. Сейчас напишу, какие ошибки выдает.
2xelos: не мог бы ты отослать на e-mail обычный mfc проект, который использует стандартные библиотеки? Может, я что-то не так делаю? Мой адрес: [email]Vladislav_1988@mail.ru[/email]
Я приаттачил файл с логом компиляции (zip архив)
2xelos: не мог бы ты отослать на e-mail обычный mfc проект, который использует стандартные библиотеки? Может, я что-то не так делаю? Мой адрес: [email]Vladislav_1988@mail.ru[/email]
вот проект. exe не влез, без оптимизации он 120к весит
Thanx.
В общем-то, проект запустился. Возможно, что мне следовало сразу после создания проекта сменить библиотеки. Я же сначала компилировал в режиме "Shared libraries", а потом уже менял и пытался по-новой скомпилировать.
Thanx.
по идее без разницы када свойства менять... ты попробовал его на других компах запускать? где VS нету?
по идее без разницы када свойства менять... ты попробовал его на других компах запускать? где VS нету?
Нет, не пробовал. Но у меня в Windows 2000 VS.NET'ом и не пахнет, а все запускается хорошо.