Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические элементы формы, форма 
V
    Опции темы
nikitao
Дата 14.9.2005, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Здраст,Проблема есть:нужно в приложении(MFC) разместить неизвестно сколько кнопок,флажковразлических статических функций,соответственно с разными параметрами,координатами(в зависемости от загружаемого файла).С помощью CreateWindow() создавать не хочу(Совсем не знаю WinAPI);.Чем пользоваться не знаю.Если кто даст список нужных функций или ссылку туда где их я могу найти(только не MSDN!) smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Coocky
Дата 15.9.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Любой элемент формы имеет метод Create()
Пример для кнопки
Код

CButton myButton1, myButton2, myButton3, myButton4;

// Create a push button.
myButton1.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
   CRect(10,10,100,30), pParentWnd, 1);

// Create a radio button.
myButton2.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 
   CRect(10,40,100,70), pParentWnd, 2);

// Create an auto 3-state button.
myButton3.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_AUTO3STATE, 
   CRect(10,70,100,100), pParentWnd, 3);

// Create an auto check box.
myButton4.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 
   CRect(10,100,100,130), pParentWnd, 4);





--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
nikitao
Дата 15.9.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Спасибо,но сам Create не работает(pParentWnd не известен,обьявляю переменную,инициализирую,но не работает:Выдает ошибку при компонвке в одном из ASSERTов),а работает CreateWindow(ИЗ WinApi).Пока я не занелся собственно динамической частью программы ,но смагу ли я с этими кнопками работать.Скажем как мне задать ее индефикатор в GetDlgItem(),или обьявить переменную связанную с этим элементом формы?

ЗЫ Coocky ,Если надо выделить в отдельную тему на форуме скажи,но вроде по теме(ИМХО)


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Coocky
Дата 16.9.2005, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата(nikitao @ 15.9.2005, 21:59)
Спасибо,но сам Create не работает

Чушь, всю жизнь создавал!
Дай код создания!
Я так подозреваю, что ты обьявляешь переменную в OnInitDialog(), а надо в классе( в заголовке), иначе обьект разрушается, выходя из функции.
Либо задаешь неправильные координаты..!

Цитата(nikitao @ 15.9.2005, 21:59)
но смагу ли я с этими кнопками работать.Скажем как мне задать ее индефикатор в GetDlgItem(),или обьявить переменную связанную с этим элементом формы?

smile
Ты вообще ленися!
Вот пример для кнопки( для других элементов тоже самое, только различие в прараметре DWORD dwStyle,)
Цитата

BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT & rect, CWnd* pParentWnd, UINT nID );
  Создаёт кнопку и присоединяет её к обьекту класса CButton.
  Возвращаемое значение не равно нулю, если все прошло нормально
  и ноль, если наоборот.
  lpszCaption - текст на кнопке.
  dwStyle - определяет стиль кнопки. Может быть комбинацией
  следующих стилей:
    BS_CHECKBOX - создаёт CHECKBOX ( маленький квадрат  с текстом,
    расположенным справа от него до тех пор пока не прописан стиль
    BS_LEFTTEXT ).

    BS_AUTOCHECKBOX -  тоже самое, что и BS_CHECKBOX, различие в
    том, что когда пользователь выбирает checkbox в нем появляется
    галочка, в следующий раз, когда пользователь делает это,
    галочка исчезает.

    BS_RADIOBUTTON - создаёт радио-кнопку ( маленький круг с
    текстом, расположенным справа от него до тех пор, пока не
    прописан стиль BS_LEFTTEXT ). Кнопки такого стиля обычно
    комбинируются в группы взаимоисключаемых возможностей.

    BS_AUTORADIOBUTTON - тоже самое, что и BS_RADIOBUTTON,
    различие в том, что когда пользователь выбирает такую
    кнопку она автоматически становится активной и убирает
    подсветку с других радио-кнопок в этой же группе.

    BS_3STATE - тоже самое, что и BS_CHECKBOX, различие в
    том, что кнопка может быть затемнена так как будто она
    выбрана. Это состояние обычно используется для того,
    чтобы показать, что кнопка недоступна.

    BS_AUTO3STATE - тоже самое, что и BS_3STATE, за
    исключением того, что кнопка меняет своё состояние,
    когда пользователь выбирает её.

    BS_DEFPUSHBUTTON - создаёт кнопку по умолчанию
    ( вокруг неё будет тонкая темная рамка ). Если
    пользователь нажмет ENTER, то запустится обработчик
    нажатия на эту кнопку.Этот стиль можно установить в
    свойствах кнопки на вкладке Styles.

                 
    BS_GROUPBOX - создает рамку с помощью которой можно
    обьединять кнопки.

   
    BS_LEFTTEXT - применяется с BS_CHECKBOX и BS_RADIOBUTTON
    ( а также с их модификациями ) .
    Указывает на необходимость вывести текст слева от кнопки.

    BS_OWNERDRAW - при указывании данного стиля, кнопку прийдется
    рисовать своими руками ( с помощью вызова функций ).
    Этот стиль можно установить в свойствах кнопки на
    вкладке Styles.

    BS_PUSHBUTTON - создает обычную кнопку, которая посылает
    сообщение WM_COMMAND окну-владельцу, когда пользователь
    выбирает её.     
 
  rect - определяет размер и позицию кнопки.
  pParentWnd - Указатель на окну, которому принадлежит кнопка,
  обычно конечно же CDialog.Этот параметр не может быть равным
  NULL.
  nID - идентификатор кнопки.






--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
nikitao
Дата 17.9.2005, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Coocky
Цитата
Чушь, всю жизнь создавал!

Естественно чушь,а ты как думал? smile Я же новичек в этом деле.
Цитата
Я так подозреваю, что ты обьявляешь переменную в OnInitDialog(), а надо в классе( в заголовке), иначе обьект разрушается, выходя из функции.


Подтверждаю твои подозрения именно там я пыталя "делать" кнопку.Но все равно че то я торможу и не получается.

Цитата
Ты вообще ленися!

Есть немного ,но скорее у меня опыта и чутья в C не хватает. smile

Вообще мне новое учебное пособие нужно,а то в моем нихрена нет,а только поверхностное предстовление о языке smile

Но прогу я эту должен дописать(уж больно работы в ней много сделал),а без динамики в ней никак.По этому если не слжно Плз опиши все до милочей.Вообще нужно ли обьявлять pParenWnd ли нет?Зарание спасибо
smile smile smile smile smile smile



--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Dreamer_0x01
Дата 17.9.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



nikitao

Цитата
Вообще нужно ли обьявлять pParenWnd ли нет?Зарание спасибо

ты дочитал до конца то, что тебе писал Coocky ? а там написана следующая строчка:
Цитата
pParentWnd - Указатель на окну, которому принадлежит кнопка

Отсюда вытекает ответ: Если ты хочешь кнопку налепить бог знает куда (Например, на другую кнопку или вообще в другое окно - то тогда указываешь *CWnd того элемента). В нашем случае я так понимаю ты хочешь поместить ее в то окно, в коде которого ты и пишешь этот ког. Тогда надо в качестве pParent указать "this". В этом случае твое окно как раз и будет являться родителем для твоей кнопки.

хотя Coocky и так подробно все расписал... Но видимо придется рассказать тебе еще раз то же самое. Вот тебе алгоритм с кодом, который создает кнопку, ее обработчик, все реализовывается за пару минут...

Итак, в нашем случае приложение базируется на диалоге, будем создавать в нем простую кнопку.
Классы нашего приложения будут называться

СButtonSampleDlg и
СButtonSampleApp.
работать будем с CButtonSampleDlg.

Итак, последовательность твоих дейсвий (код см.ниже):
1. В классе CButtonSampleDlg объявляем переменную CButton * MyButton;(для общего случая я создал именно указатель на кнопку, а не ее экземпляр.)
2. В cpp-файле в Функции OnInitDialog() сначала вызываешь конструктор кнопки оператором new, а потом вызываешь метод Create(....). Примечание - в качестве идентификатора кнопки взят define, который я указал в h-файле.
3. В cpp-файле переопределяешь функцию DestroyWindow(), в которой сначала вызываешь метод DestroyWindow()для кнопки, а потом с помощью оператора delete вызываешь деструктор кнопки. Привыкая с самого начала делать эту операцию, так как изначально создаешь вполне грамотный код.

В общем, если ты на этом этапе откомпилируешь и запустишь программу, ты уже увидишь свою кнопку.
Но надо еще добавить обработчик события. Сделаем это так:

4. В h-файл добавляешь функцию afx_msg void OnMyButtonClk(). Ее же добавляем и в cpp-файл, в которой указываем действия, выполняемые по нажатию кнопки. В нашем случае это будет текстовое сообщение.

5. В cpp-файле ищем карту сообщений. (Начинается она строкой BEGIN_MESSAGE_MAP(CButtonSampleDlg, CDialog))

В этой карте добавляем такую строку:ON_BN_CLICKED(твой_ID,OnMyButtonClk)

Все!!! У тебя полноценная динамически созданная рабочяя кнопка.

А вот тебе тот код, который нужно вписать, как я и обещал:

Код

/*
файл ButtonSampleDlg.h
*/
#pragma once
#define MY_nID 2000 //это твой идентификатор для кнопки
class CButtonSampleDlg : public CDialog
{
public:
    CButtonSampleDlg(CWnd* pParent = NULL);    // standard constructor
    enum { IDD = IDD_BUTTONSAMPLE_DIALOG };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
protected:
    HICON m_hIcon;
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
    afx_msg void OnMyButtonClk(); //это обработчик твоей кнопки
private:
    CButton *MyButton; //это твоя кнопка
public:
    virtual BOOL DestroyWindow();//это переопределение функции, в ней убъешь кнопку
};



Код

/*
файл ButtonSampleDlg.cpp
*/

BEGIN_MESSAGE_MAP(CButtonSampleDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(MY_nID,OnMyButtonClk)//эту строку добавляешь для обработки нажатия
END_MESSAGE_MAP()

/*
несколько функций, созданных визардом, их не трогай
*/

BOOL CButtonSampleDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    if(GetDlgItem(MY_nID))
        /*
            проверка уникальности nID. В общем необязательно, но лучше 
            сделать на время отладки,потом в релизе убрать
        */
    {
        AfxMessageBox("этот nID уже занят, смени его на другой");
        OnCancel();
    }
    else
    {
        MyButton = new CButton();//вызвали конструктор для кнопки
        MyButton->Create("Надпись",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,CRect(10,10,100,40),this,MY_nID);
        /*собственно, кнопка создана*/
    }
    return TRUE;  // return TRUE  unless you set the focus to a control
}

BOOL CButtonSampleDlg::DestroyWindow()
{
    MyButton->DestroyWindow();
    delete MyButton;//не забвай разрушать созданныев памяти объекты!!!
    return CDialog::DestroyWindow();
}

void CButtonSampleDlg::OnMyButtonClk()
{
    AfxMessageBox("Сработал обработчик нажатия твоей кнопки");
}


Если уж это тебе не поможет и не заработает - тогда уж не знаю, как еще разжевать smile

Это сообщение отредактировал(а) Dreamer_0x01 - 17.9.2005, 14:34


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
nikitao
Дата 20.9.2005, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Dreamer_0x01 ,Coocky ,большое спасибо ваши старания(воистену героические) не пропадут зря:я на пишу эту прогу.Большое спасибо.С меня причетается,но сейчас отплатить не могу(постов мало). smile smile smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
FullNoob
Дата 26.4.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



У меня такой вопрос, а можно ли в данном примере делать кнопки заранее незная сколлько их будет? И еще, а как сделать таким же макаром Эдиты и привязать к ним переменные? 
PM MAIL   Вверх
threef
Дата 26.4.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 1
Всего: 10



Код

struct node{
CEdit * self;
node * next;
};

...
{
  ...
//  можно зная head получить доступ к любому элементу
  node *head,*next=NULL;
  for(int i=0;i<сколько_захочу;i++)
  {
    head=new node;
    head->self=new CEdit;
    head->self->Create(параметры - ID = WM_USER+2006+i - для связи по номеру);
    head->next=next;
    next=head;
  }
  ...    
}

...
// для доступа к конкретному редактору
CEdit *e =(CEdit*)GetDlgItem(WM_USER+2006+номер нужного редактора)


Автоматически переменные добавляться в класс и DoDataExchange не будут, но в DoDataExchange тоже можно сделать обработку списка(или массива) ручками. Для обработки сообщений от кнопок можно использовать групповое сообщение ON_COMMAND_RANGE, по номеру параметра получаешь в обработчике идентификатор кнопки и обрабатываешь дальше сам. 
PM MAIL   Вверх
nikitao
Дата 26.4.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Это ж надо откапать,создал еще когда на форум попал  smile  


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
FullNoob
Дата 26.4.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



Цитата(nikitao @ 26.4.2006,  15:41)
Это ж надо откапать,создал еще когда на форум попал  smile

дык поиск рулит, мог бы и новую создать   smile  

Это сообщение отредактировал(а) FullNoob - 26.4.2006, 16:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0832 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.