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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Самые основы MFC...  (Прочитано 14905 раз)
0 Пользователей и 10 Гостей смотрят эту тему.
Daniloff
Помогающий

ru
Offline Offline

« : 18-07-2007 12:54 » 

Здравствуйте!
Я давно работаю с VC++, но никогда не использовал MFC. Теперь попробовал...
Вся документация, что мне попадается - слишком невнятная, перечислены свойства и методы объектов, а рабочих примеров программ не вижу.

На данный момент самый животрепещущий вопрос таков: как обратиться к контролу диалога?..
Есть CDialog, есть объект CListBox, но как моя программа поймет, что объект связан именно с контролом, имеющим ID "IDC_LIST1" ??
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 18-07-2007 13:12 » 

Daniloff, во первых, можно обойтись и без объекта CListBox, связанного с контролом.
1) всегда можно получить указатель на контрол из диалога:
Код:
//где то в диалоге или во View
CListBox* p=0;
p=(CListBox*)GetDlgItem(IDC_LIST1);
if(p)
{
   //работаем с указателем p
}

(причём, этот метод я предпочитаю, навозившись когда то с методом №2. Но это - на твой вкус)

метод 2)

находимся в редакторе формы. На форме лежит контрол с идентификатором IDC_X. Зажимаем Ctrl  и дважды щёлкаем по контролу - затем выбираем класс будущей переменной и , собственно, добавляем связанную член-переменную. Советую давать имя переменной в виде "m_"+IDC_X. (это удобно, когда захочешь переименовать и идентификатор и имя переменной - просто поиском найдёшь все вхождения идентификатора.  Да и просто не надо париться - выдумывать имя переменной Отлично )

то есть в твоём случае будет m_IDC_LIST1. Визард добавит макросы, которые будут синхронизировать состояние переменной и контрола.
метод диалога UpdateData() выполняет синхронизацию. Хотя, для CListBox этот метод не понадобится, вроде, но он нужен для CEdit, CButton
« Последнее редактирование: 18-07-2007 13:22 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 18-07-2007 13:25 » 

а ещё, я думаю, будет полезна вот эта ссылка , раз ты взялся за MFC Улыбаюсь
https://forum.shelek.ru/index.php/board,106.0.html
Записан

Daniloff
Помогающий

ru
Offline Offline

« Ответ #3 : 18-07-2007 17:16 » 

Второй вариант похож на дело...
А первый - как это?..
p= это указатель на класс или на хэндл окна?..
И разве у GetDlgItem() не 2 параметра?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 18-07-2007 17:24 » new

Daniloff,


1)то есть как это как ? )  Так, как я написал...
когда надо получить доступ к объекту, делаешь p= ... GetDlgItem... - и работаешь с объектом через указатель. Чем мне нравится этот вариант ? Он гибче, чем визардовский, он быстрее. Хотя иногда громоздко выглядит, согласен. Но это только по первому времени так кажется Улыбаюсь  Главное правило - не забыть проверить, что GetDlgItem вернула не нулевой указатель, а также не забывать про приведение указателя от Cwnd* на нужный

2)CListBox* p - это указатель на объект класса CListBox

3) у метода CWnd::GetDlgItem(int nID) , возвращающего CWnd* - один параметр
Код:
CWnd* GetDlgItem(int nID) const;

 - аналогичен апишному, но хендл окна уже не нужен.
« Последнее редактирование: 18-07-2007 17:31 от Алексей1153++ » Записан

Daniloff
Помогающий

ru
Offline Offline

« Ответ #5 : 18-07-2007 17:35 » 

ну надо же, как все запутано! Улыбаюсь
функция та же, да не та... А как тогда обратиться к апишной непеределанной ф-и?..
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 18-07-2007 17:43 » 

Daniloff,

ничего не запутано )

всегда можно обратиться к апишным  функциям при помощи оператора ::
Код:
::GetDlgItem(.....)

а когда просто пишешь GetDlgItem(), находясь внутри класса XXX , то имеется вызовется метод класса XXX , если он определён


« Последнее редактирование: 18-07-2007 17:45 от Алексей1153++ » Записан

Джон
просто
Администратор

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

« Ответ #7 : 19-07-2007 10:09 » 

p= это указатель на класс или на хэндл окна?..

Лучше начать с поиска
https://forum.shelek.ru/index.php/topic,6471.0.html

Может станет понятней. Поищи ещё - тема много раз поднималась.
Записан

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

ru
Offline Offline

« Ответ #8 : 19-07-2007 11:48 » 

Алексей1153++, кажется, получается.
Первый вариант мне даже больше нравится - никаких лишних объектов не надо создавать.  Класс!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 19-07-2007 12:08 » 

Daniloff, вот и мне тоже поэтому )
Записан

Джон
просто
Администратор

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

« Ответ #10 : 19-07-2007 14:40 » 

никаких лишних объектов не надо создавать

Ошибка, "лишний" объект всё-равно будет создан и указатель на него возвращается ф-ей GetDlgItem. Автоматически. MFC. Так что... Другое дело, что этот объект тебе временно нужен, например для SetWindowText, когда же ты постоянно работаешь с объектом, то лучше иметь его постоянно. Ну и на последок, GetDlgItem возвращает указатель типа CWnd поэтому всегда необходимо делать приведение типов CButton, CComboBox и тд Со всеми вытекающими отсюда последствиями.
Записан

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

ru
Offline Offline

« Ответ #11 : 19-07-2007 17:07 » 

Камень преткновения #2:

rs.Open(CRecordset::forwardOnly,"SELECT * FROM KEYS",CRecordset::readOnly);  // базаоткрылась

m_flex.SetDataSource(rs);  // ошибка компиляции 'SetDataSource' : cannot convert parameter 1 from 'class CRecordset *' to 'struct IDispatch *'

вот так вот. Пытаюсь из CRecordset вытянуть IDispatch *

m_flex.SetDataSource((struct IDispatch *)rs.GetRuntimeClass()); // ответ неверный Жаль
« Последнее редактирование: 19-07-2007 17:33 от Daniloff » Записан
Daniloff
Помогающий

ru
Offline Offline

« Ответ #12 : 22-07-2007 10:11 » 

Кажется, я понял - ActiveX контрол MSFlexGrid требует, чтобы в качестве источника данных использовался ActiveX контрол MSADO.Recordset, а не объект CRecordset...
Записан
salex
Гость
« Ответ #13 : 11-12-2007 22:51 » 

Daniloff, во первых, можно обойтись и без объекта CListBox, связанного с контролом.
1) всегда можно получить указатель на контрол из диалога:
Код:
//где то в диалоге или во View
CListBox* p=0;
p=(CListBox*)GetDlgItem(IDC_LIST1);
if(p)
{
   //работаем с указателем p
}

(причём, этот метод я предпочитаю, навозившись когда то с методом №2. Но это - на твой вкус)

метод 2)

находимся в редакторе формы. На форме лежит контрол с идентификатором IDC_X. Зажимаем Ctrl  и дважды щёлкаем по контролу - затем выбираем класс будущей переменной и , собственно, добавляем связанную член-переменную. Советую давать имя переменной в виде "m_"+IDC_X. (это удобно, когда захочешь переименовать и идентификатор и имя переменной - просто поиском найдёшь все вхождения идентификатора.  Да и просто не надо париться - выдумывать имя переменной Отлично )

то есть в твоём случае будет m_IDC_LIST1. Визард добавит макросы, которые будут синхронизировать состояние переменной и контрола.
метод диалога UpdateData() выполняет синхронизацию. Хотя, для CListBox этот метод не понадобится, вроде, но он нужен для CEdit, CButton
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 12-12-2007 04:26 » 

salex, ты комментарии забыл написать ))
Записан

Джон
просто
Администратор

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

« Ответ #15 : 12-12-2007 09:22 » 

Я думаю он просто сообщения набирает. Ничего путного из последних (и первых) я у него не видел.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines