Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание контролов на окне

1.9K
22 ноября 2004 года
Volly
57 / / 18.10.2003
Необходимо сделать приложение на основе MFC, в главном окне которого будет находиться 2 поля ввода, ListView и 3 кнопки. Насколько я знаю, при создании проекта мастер предлагает создать необходимые классы. Если там задавать класс контрола ListView, то он распахивается на все окно приложения. То есть не остается места для всяких кнопок и полей. Как не дать ListView занимать весь экран? И каким образом создавать кнопки? Надо создавать отдельный класс для каждой кнопки или как-то по-другому? Или вообще лучше делать эти вещи с помощью диалогов?
2.0K
23 ноября 2004 года
A.D.I.D.A.S
52 / / 23.11.2004
Если тебе не нужно что-то навешивать на свои кнопки, то можно обойтись стандартным классом CButton. Делается это примерно так:

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

что-то вроди такого.
1.6K
23 ноября 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by Volly
Необходимо сделать приложение на основе MFC, в главном окне которого будет находиться 2 поля ввода, ListView и 3 кнопки. Насколько я знаю, при создании проекта мастер предлагает создать необходимые классы. Если там задавать класс контрола ListView, то он распахивается на все окно приложения. То есть не остается места для всяких кнопок и полей. Как не дать ListView занимать весь экран? И каким образом создавать кнопки? Надо создавать отдельный класс для каждой кнопки или как-то по-другому? Или вообще лучше делать эти вещи с помощью диалогов?


Сделай с помощью Wizard-а окно на основе диалога, да и все дела - проектировать легко, обрабатывать - тож не сложно. Создавать собственные кнопки не нужно, можно будет из окна перехватывать сообщения рабочих элементов, для этого открой Class Wizard, там есть два списочка, в левом выбираешь идентификатор элемента управления, а в правом - соответствующее сообщение от этого элемента, создается обработчик, и в нем делай, что должна делать твоя кнопка.

1.9K
24 ноября 2004 года
Volly
57 / / 18.10.2003
2A.D.I.D.A.S: я пробовал делать так, но не с CButton, а с CListCtrl. При создании окна контрола выдается ошибка (возвращается 0).
2GDragon: в смысле на основе обычных диалогов, компоненты на которые навешиваются из панели с компонентами?
1.9K
24 ноября 2004 года
Volly
57 / / 18.10.2003
Есть проблема. При создании контрола таким путем, как указал A.D.I.D.A.S., невозможно обычным способом указать обработчик нажатия кнопки (т.е. процедур обработки окна кнопки). Как это можно сделать?
9.1K
24 ноября 2004 года
alek.sys
4 / / 23.11.2004
Цитата:
Originally posted by Volly
Необходимо сделать приложение на основе MFC, в главном окне которого будет находиться 2 поля ввода, ListView и 3 кнопки. Насколько я знаю, при создании проекта мастер предлагает создать необходимые классы. Если там задавать класс контрола ListView, то он распахивается на все окно приложения. То есть не остается места для всяких кнопок и полей. Как не дать ListView занимать весь экран? И каким образом создавать кнопки? Надо создавать отдельный класс для каждой кнопки или как-то по-другому? Или вообще лучше делать эти вещи с помощью диалогов?



Как я понимаю, тебе надо в окне SDI (или MDI) приложения разместить свои контролы, а диалогбокс не устраивает? Все просто: если при создании, SDI указать класс окна FormView то в клиентской области можно рассовать любые контролы из палитры, т.е. как на диалоге.

9.1K
24 ноября 2004 года
alek.sys
4 / / 23.11.2004
Цитата:
Originally posted by Volly
Есть проблема. При создании контрола таким путем, как указал 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.

1.6K
25 ноября 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by Volly
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!"));
}

Компилируй, жми на кнопу.
Удачи!

1.9K
25 ноября 2004 года
Volly
57 / / 18.10.2003
Однако, насколько я знаю, в диалоговых приложениях нельзя добавить меню. А это уже серьезное ограничение.
1.6K
25 ноября 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by Volly
Однако, насколько я знаю, в диалоговых приложениях нельзя добавить меню. А это уже серьезное ограничение.


Да кто тебе сказал? В редакторе ресурсов щелкай правой кнопкой по своему окну, выбирай Properties, там на первой же вкладке список Menu, ставь, какое хочешь. Ну, разумеется, сами меню должны быть до этого уже созданы.

2.0K
26 ноября 2004 года
A.D.I.D.A.S
52 / / 23.11.2004
Цитата:
Originally posted by GDragon
Однако, насколько я знаю, в диалоговых приложениях нельзя добавить меню. А это уже серьезное ограничение.



Это гон, точно говорю=)

1.9K
26 ноября 2004 года
Volly
57 / / 18.10.2003
2GDragon: в любом случае диалоги меня мало устраивают, т.к. даже сами Microsoft рассматривают диалоги как элементарный тип приложений, не способный на многое.
Есть еще проблема. Я нормально создал ListCtrl (динамически, без использования диалогов), добавил в него несколько строк. Когда запустил программу, строки не желали выделяться, а ширина колонок ListView не регулировалась. Что делать?
1.9K
28 ноября 2004 года
Volly
57 / / 18.10.2003
А как получить хэндл, допустим, кнопки (CButton), помещенной именно на диалоге? А можно ли как-то изменить шрифт надписи (Static) на диалоге, чтобы другие надписи остались с прежними шрифтами?
1.6K
29 ноября 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by Volly
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.

1.6K
29 ноября 2004 года
GDragon
67 / / 11.10.2002
Цитата:
Originally posted by Volly
А как получить хэндл, допустим, кнопки (CButton), помещенной именно на диалоге? А можно ли как-то изменить шрифт надписи (Static) на диалоге, чтобы другие надписи остались с прежними шрифтами?


Когда проассоциировал кнопку через DDE с классом CButton, то из этого класса бери m_hWnd, это и должен быть хендл, если только я ничего не путаю.
Про смену шрифта не знаю.

5.7K
29 ноября 2004 года
Andrdandr
29 / / 17.09.2004
Для изменения шрифта юзается метод SetFont(???),вроде от класса CWnd, но сначала этот фонт надо создать(только не пугайся огромной структуры) и ЗАМЕНИТЬ на старый.
Ищи в МСДН по ключу SetFont.
1.9K
30 ноября 2004 года
Volly
57 / / 18.10.2003
Столкнулся с такой проблемой. У меня стоит Windows 2000 и Windows XP. Проги я пишу в XP. Когда я попытался запустить MFC'шную прогу в Windows 2000, где VS.NET не установлена, программа сказала, что не может найти файл mfc71***.dll. Пробовал сделать поддержку mfc из библиотеки, так exe файл раздулся до 2 мег вместо 200 Кб. Можно ли сохранить небольшой размер файла и при этом чтобы программа не требовала библиотек, которые могут быть не установлены на компе конечного пользователя?
319
30 ноября 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Volly
Столкнулся с такой проблемой. У меня стоит Windows 2000 и Windows XP. Проги я пишу в XP. Когда я попытался запустить MFC'шную прогу в Windows 2000, где VS.NET не установлена, программа сказала, что не может найти файл mfc71***.dll. Пробовал сделать поддержку mfc из библиотеки, так exe файл раздулся до 2 мег вместо 200 Кб. Можно ли сохранить небольшой размер файла и при этом чтобы программа не требовала библиотек, которые могут быть не установлены на компе конечного пользователя?


если Visual Studio .NET, то в свойствах проекта - в основных, где использование MFC, указываешь использовать стнадартные библиотеки Виндоуз.

1.9K
30 ноября 2004 года
Volly
57 / / 18.10.2003
Большое спасибо! А то я уже подумал, что придется делать многомегабайтные exe'шники.
5.7K
01 декабря 2004 года
Andrdandr
29 / / 17.09.2004
Цитата:
Originally posted by xelos

если Visual Studio .NET, то в свойствах проекта - в основных, где использование MFC, указываешь использовать стнадартные библиотеки Виндоуз.



... И пишешь программу на Win32, без юзания MFC

319
01 декабря 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Andrdandr


... И пишешь программу на Win32, без юзания MFC


нет, можно создать проект MFC - т.е. можно использовать классы MFC, но указать, что при компиляции использовать стандартные библиотеки Винды. Приложение получается намного меньше, чем при включении библиотек MFC и не привязывается к специфическим библиотекам.

1.9K
01 декабря 2004 года
Volly
57 / / 18.10.2003
Цитата:
Originally posted by xelos

нет, можно создать проект MFC - т.е. можно использовать классы MFC, но указать, что при компиляции использовать стандартные библиотеки Винды. Приложение получается намного меньше, чем при включении библиотек MFC и не привязывается к специфическим библиотекам.


Не-е-е... Чего-то я не догнал. Я поменял эту настройку, так мне при компоновке (Link) столько ошибок накидало! Чем лечить?
При использовании стандартных библиотек можно ли будет нормально работать с диалогами (т.е. так, как и со специальными библиотеками MFC)?

319
01 декабря 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Volly

Не-е-е... Чего-то я не догнал. Я поменял эту настройку, так мне при компоновке (Link) столько ошибок накидало! Чем лечить?
При использовании стандартных библиотек можно ли будет нормально работать с диалогами (т.е. так, как и со специальными библиотеками MFC)?


может у тебя настройки линкера левые?
или может в пиратской версии такая штука не прокатывает...
я в приложениях, где использую классы MFC, указываю всегда использование стандартных библиотек...
приложение небольшое получается, под 2к и 98 чистыми запускается без проблем.

1.9K
01 декабря 2004 года
Volly
57 / / 18.10.2003
Цитата:
Originally posted by xelos

может у тебя настройки линкера левые?
или может в пиратской версии такая штука не прокатывает...
я в приложениях, где использую классы MFC, указываю всегда использование стандартных библиотек...
приложение небольшое получается, под 2к и 98 чистыми запускается без проблем.


OK. Сейчас напишу, какие ошибки выдает.

1.9K
01 декабря 2004 года
Volly
57 / / 18.10.2003
Я приаттачил файл с логом компиляции (zip архив)
2xelos: не мог бы ты отослать на e-mail обычный mfc проект, который использует стандартные библиотеки? Может, я что-то не так делаю? Мой адрес: [email]Vladislav_1988@mail.ru[/email]
319
02 декабря 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Volly
Я приаттачил файл с логом компиляции (zip архив)
2xelos: не мог бы ты отослать на e-mail обычный mfc проект, который использует стандартные библиотеки? Может, я что-то не так делаю? Мой адрес: [email]Vladislav_1988@mail.ru[/email]



вот проект. exe не влез, без оптимизации он 120к весит

1.9K
02 декабря 2004 года
Volly
57 / / 18.10.2003
В общем-то, проект запустился. Возможно, что мне следовало сразу после создания проекта сменить библиотеки. Я же сначала компилировал в режиме "Shared libraries", а потом уже менял и пытался по-новой скомпилировать.
Thanx.
319
02 декабря 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Volly
В общем-то, проект запустился. Возможно, что мне следовало сразу после создания проекта сменить библиотеки. Я же сначала компилировал в режиме "Shared libraries", а потом уже менял и пытался по-новой скомпилировать.
Thanx.


по идее без разницы када свойства менять... ты попробовал его на других компах запускать? где VS нету?

1.9K
02 декабря 2004 года
Volly
57 / / 18.10.2003
Цитата:
Originally posted by xelos

по идее без разницы када свойства менять... ты попробовал его на других компах запускать? где VS нету?


Нет, не пробовал. Но у меня в Windows 2000 VS.NET'ом и не пахнет, а все запускается хорошо.

1.9K
04 декабря 2004 года
Volly
57 / / 18.10.2003
Нашел я баг. Нужно было в параметрах в дереве "C++" поменять параметр типа DLL на просто "Multi-threading" (параметр, кажется, MI).
1.9K
08 декабря 2004 года
Volly
57 / / 18.10.2003
Возникла еще одна проблема. Когда я пытался добавить элемент в контрол типа CListCtrl, я как полагается заполнил структуру LVITEM. При этом в стиль элемента включил как отображение надписи, так и рисунка. При этом указал в соответствующем месте идентификатор иконки в ресурсах. Иконка не отображалась. Что делать? Может, нужно каким-то другим способом определить изображение?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог