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

Ваш аккаунт

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

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

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

Как организовать передачу сообщений родительскому окну?

1.2K
07 декабря 2004 года
Kalitkin
108 / / 05.03.2004
Допустим у меня есть класс:

Class CMyWndClass : public CWnd
{

}

который создается на обычном диалоге следующим образом

CMyWndClass mwc;

void CMyDialog::OnInitDialog()
{
mwc.Create(0, WS_VISIBLE | WS_CHILD, somerect, this, SOMEID);
mwc.ShowWindow(SW_SHOW);
mwc.UpdateWindow();
}

также на этом диалоге есть обычный список (CListBox), допустим с тремя строками.

В моем CMyWndClass есть кнопка, которую я создаю динамически.

Вопрос следующий:

Как сделать, чтобы при нажатии на кнопку которая расположена на моем CMyWndClass выбирался бы 3й элемент списка, который расположен на диалоге?
(на самом деле – как вызвать обработчик сообщений от этой кнопки на диалоге?)

Заранее всем спасибо.
1.2K
10 декабря 2004 года
Kalitkin
108 / / 05.03.2004
Что, никто?
Я так понимаю что это надо делать через сообщения, или я ошибаюсь?
319
10 декабря 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by Kalitkin
Что, никто?
Я так понимаю что это надо делать через сообщения, или я ошибаюсь?


например:

Код:
void CMyDialog::CreateButtons()
{
    int i;
    int y1 = 10;
    int y2 = 30;
    CWnd* hwndOwner;
    CString StrLabel;
     
    hwndOwner = this;
    CButton MyButtons[10];

    for(i=1; i<=4; i++)
    {
        StrLabel = i + ") Button #" + i;
        MessageBox(StrLabel);
        MyButtons.Create(StrLabel.GetBuffer(StrLabel.GetLength()), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
            CRect(10, y1, 100, y2), hwndOwner, i);
        y1 = y1 + 20;
        y2 = y2 + 20;
    }
}

где-то создал массив кнопок, тогда
Код:
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if(message == WM_COMMAND)
    {
        if(LOWORD(wParam) == 4)
        {
            if(HIWORD(wParam) == BN_CLICKED)
            AfxMessageBox("CLICKED");
        }
    }

    return CDialog::DefWindowProc(message, wParam, lParam);
}

отлавливаешь нажатие 4 кнопки.
1.2K
10 декабря 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by xelos

например:
Код:
void CMyDialog::CreateButtons()
{
    int i;
    int y1 = 10;
    int y2 = 30;
    CWnd* hwndOwner;
    CString StrLabel;
     
    hwndOwner = this;
    CButton MyButtons[10];

    for(i=1; i<=4; i++)
    {
        StrLabel = i + ") Button #" + i;
        MessageBox(StrLabel);
        MyButtons.Create(StrLabel.GetBuffer(StrLabel.GetLength()), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
            CRect(10, y1, 100, y2), hwndOwner, i);
        y1 = y1 + 20;
        y2 = y2 + 20;
    }
}

где-то создал массив кнопок, тогда
Код:
LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if(message == WM_COMMAND)
    {
        if(LOWORD(wParam) == 4)
        {
            if(HIWORD(wParam) == BN_CLICKED)
            AfxMessageBox("CLICKED");
        }
    }

    return CDialog::DefWindowProc(message, wParam, lParam);
}

отлавливаешь нажатие 4 кнопки.



привет!
ты наверное немного не понял вопрос, мне надо обрабатывать (в диалоге) сообщение от кнопки которая находится на окне, которое я создаю на диалоге.

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

привет!
ты наверное немного не понял вопрос, мне надо обрабатывать (в диалоге) сообщение от кнопки которая находится на окне, которое я создаю на диалоге.


поймал сообщение в окне, отправь потом из окна сообщение пользовательское диалогу через PostMessage, например.

279
11 декабря 2004 года
bave
456 / / 07.03.2004
Могу ошибаться конечно, но
разве нельзя в классе потомке CWnd -
написать DECLARE_MESSAGE_MAP()

А потом в осномном коде:
BEGIN_MESSAGE_MAP(CMyWndClass, CWnd)
ON_WM_RBUTTONDOWN(IDC_BUTTON, OnRButtonDown)
END_MESSAGE_MAP()
А потом в функции отклике OnRButtonDown и
делай чё тебе надо.
1.2K
11 декабря 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by bave
Могу ошибаться конечно, но
разве нельзя в классе потомке CWnd -
написать DECLARE_MESSAGE_MAP()

А потом в осномном коде:
BEGIN_MESSAGE_MAP(CMyWndClass, CWnd)
ON_WM_RBUTTONDOWN(IDC_BUTTON, OnRButtonDown)
END_MESSAGE_MAP()
А потом в функции отклике OnRButtonDown и
делай чё тебе надо.



ну конечно, так все и делают, только мне надо обрабатывать сообщение не в потомке CWnd а в диалоге на котором этот потомок находится.

1.2K
11 декабря 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by xelos

поймал сообщение в окне, отправь потом из окна сообщение пользовательское диалогу через PostMessage, например.



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

плиз, напиши пару строк

offtopic (Copyright (C) pavor :D )

слушай, а ты случайно не знаешь где можно достать красивый listbox?

368
11 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Kalitkin
Как сделать, чтобы при нажатии на кнопку которая расположена на моем CMyWndClass выбирался бы 3й элемент списка, который расположен на диалоге?

Проще всего в OnButton записать:

CWnd *pWnd = GetParent();
CListBox *pLb = (CListBox *)pWnd->GetDlgItem(IDC_LIST1);
pLb->SetCurSel(2);

Предполагается, что ListBox ID = IDC_LIST1

1.2K
12 декабря 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by rostyslav
Проще всего в OnButton записать:

CWnd *pWnd = GetParent();
CListBox *pLb = (CListBox *)pWnd->GetDlgItem(IDC_LIST1);
pLb->SetCurSel(2);

Предполагается, что ListBox ID = IDC_LIST1



тоже не плохо, а как быть, если CListBox это мой собственный класс (и таких классов на диалоге куча)? я конечно понимаю, что для того, чтобы организовать преобразование типов его надо проинклудить. Но если я его использую в разных диалогах, и на них куча таких же классов, в которых необходимо менять отображение некоторых элементов при нажатии той же кнопки?

я думаю здесь не обойтись без PostMessage или что то вроде того.
но как это сделать (правильно) я не знаю.

368
12 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Kalitkin
тоже не плохо, а как быть, если CListBox это мой собственный класс (и таких классов на диалоге куча)? я конечно понимаю, что для того, чтобы организовать преобразование типов его надо проинклудить. Но если я его использую в разных диалогах, и на них куча таких же классов, в которых необходимо менять отображение некоторых элементов при нажатии той же кнопки?

я думаю здесь не обойтись без PostMessage или что то вроде того.
но как это сделать (правильно) я не знаю.

Это не преобразование типов, а макрос типа
#define IDC_LIST1 1002
в файле resource.h. Можно определить переменную во втором окне и перед выводом окна присвоить переменной это значение.

В самом общем случае конечно нужен PostMessage.

Во втором диалоговом окне
CWnd *pWnd = GetParent();
pWnd->PostMessage(WM_COMMAND, 1000, 0)

А в первом или переопределить OnCommand окна, типа

 
Код:
BOOL CDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
  if(wParam==1000)
  {
    ...
    return TRUE;
  }
  return CDialog::OnCommand(wParam, lParam);
}
Или в .h файле окна перед DECLARE_MESSAGE_MAP () написать напр.
afx_msg void OnUser1()

В .cpp файле внутри BEGIN_MESSAGE_MAP/END_MESSAGE_MAP написать
ON_COMMAND(1000, OnUser1)

И конечно написать саму ф-ию
void CDlg::OnUser1()
{
. . .
}
1.2K
13 декабря 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by rostyslav
Это не преобразование типов, а макрос типа
#define IDC_LIST1 1002
}



вообще-то под преобразованием типов я имел в виду следующее:
CListBox *pLb = (CListBox *)pWnd…

Потому что если бы я юзал свой ListBox то мне бы пришлось написать

#include “mylistbox.h”
CListBox *pLb = (CMyListBox*)pWnd… вместо CListBox *pLb = (CListBox *)pWnd… (я имею в виду использование не только виртуальных функций)


Если бы вместо CMyListBox был бы CMyComboBox то

#include “mycombobox.h”
CComboBox *pCb = (CMyComboBox*)pWnd

И так далее

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

368
13 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Kalitkin
вообще-то под преобразованием типов я имел в виду следующее:
CListBox *pLb = (CListBox *)pWnd…

Потому что если бы я юзал свой ListBox то мне бы пришлось написать

#include “mylistbox.h”
CListBox *pLb = (CMyListBox*)pWnd… вместо CListBox *pLb = (CListBox *)pWnd… (я имею в виду использование не только виртуальных функций)


Если CMyListBox порожден от СListBox, то не нужно подключить “mylistbox.h”, код

CWnd *pWnd = GetParent();
CListBox *pLb = (CListBox *)pWnd->GetDlgItem(IDC_LIST1);
pLb->SetCurSel(2);

и без этого будет работать.

1.2K
14 декабря 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by rostyslav

Если CMyListBox порожден от СListBox, то не нужно подключить “mylistbox.h”, код

CWnd *pWnd = GetParent();
CListBox *pLb = (CListBox *)pWnd->GetDlgItem(IDC_LIST1);
pLb->SetCurSel(2);

и без этого будет работать.



ну да, будет конечно, но я же сказал - "я имею в виду использование не только виртуальных функций"

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог