Как организовать передачу сообщений родительскому окну?
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й элемент списка, который расположен на диалоге?
(на самом деле – как вызвать обработчик сообщений от этой кнопки на диалоге?)
Заранее всем спасибо.
Я так понимаю что это надо делать через сообщения, или я ошибаюсь?
Что, никто?
Я так понимаю что это надо делать через сообщения, или я ошибаюсь?
например:
{
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;
}
}
где-то создал массив кнопок, тогда
{
if(message == WM_COMMAND)
{
if(LOWORD(wParam) == 4)
{
if(HIWORD(wParam) == BN_CLICKED)
AfxMessageBox("CLICKED");
}
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
отлавливаешь нажатие 4 кнопки.
например:
{
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;
}
}
где-то создал массив кнопок, тогда
{
if(message == WM_COMMAND)
{
if(LOWORD(wParam) == 4)
{
if(HIWORD(wParam) == BN_CLICKED)
AfxMessageBox("CLICKED");
}
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
отлавливаешь нажатие 4 кнопки.
привет!
ты наверное немного не понял вопрос, мне надо обрабатывать (в диалоге) сообщение от кнопки которая находится на окне, которое я создаю на диалоге.
привет!
ты наверное немного не понял вопрос, мне надо обрабатывать (в диалоге) сообщение от кнопки которая находится на окне, которое я создаю на диалоге.
поймал сообщение в окне, отправь потом из окна сообщение пользовательское диалогу через PostMessage, например.
разве нельзя в классе потомке CWnd -
написать DECLARE_MESSAGE_MAP()
А потом в осномном коде:
BEGIN_MESSAGE_MAP(CMyWndClass, CWnd)
ON_WM_RBUTTONDOWN(IDC_BUTTON, OnRButtonDown)
END_MESSAGE_MAP()
А потом в функции отклике OnRButtonDown и
делай чё тебе надо.
Могу ошибаться конечно, но
разве нельзя в классе потомке CWnd -
написать DECLARE_MESSAGE_MAP()
А потом в осномном коде:
BEGIN_MESSAGE_MAP(CMyWndClass, CWnd)
ON_WM_RBUTTONDOWN(IDC_BUTTON, OnRButtonDown)
END_MESSAGE_MAP()
А потом в функции отклике OnRButtonDown и
делай чё тебе надо.
ну конечно, так все и делают, только мне надо обрабатывать сообщение не в потомке CWnd а в диалоге на котором этот потомок находится.
поймал сообщение в окне, отправь потом из окна сообщение пользовательское диалогу через PostMessage, например.
ага, я понял, надо сначала при создании моего кна на диалоге передать через конструктор указатель на родительское окно(т.е. диалог), а потом в обработке нажатия на кнопку через этот указатель посылать сообщения, да? или я ошибаюсь?
плиз, напиши пару строк
offtopic (Copyright (C) pavor :D )
слушай, а ты случайно не знаешь где можно достать красивый listbox?
Как сделать, чтобы при нажатии на кнопку которая расположена на моем CMyWndClass выбирался бы 3й элемент списка, который расположен на диалоге?
Проще всего в OnButton записать:
CWnd *pWnd = GetParent();
CListBox *pLb = (CListBox *)pWnd->GetDlgItem(IDC_LIST1);
pLb->SetCurSel(2);
Предполагается, что ListBox ID = IDC_LIST1
Проще всего в OnButton записать:
CWnd *pWnd = GetParent();
CListBox *pLb = (CListBox *)pWnd->GetDlgItem(IDC_LIST1);
pLb->SetCurSel(2);
Предполагается, что ListBox ID = IDC_LIST1
тоже не плохо, а как быть, если CListBox это мой собственный класс (и таких классов на диалоге куча)? я конечно понимаю, что для того, чтобы организовать преобразование типов его надо проинклудить. Но если я его использую в разных диалогах, и на них куча таких же классов, в которых необходимо менять отображение некоторых элементов при нажатии той же кнопки?
я думаю здесь не обойтись без PostMessage или что то вроде того.
но как это сделать (правильно) я не знаю.
тоже не плохо, а как быть, если CListBox это мой собственный класс (и таких классов на диалоге куча)? я конечно понимаю, что для того, чтобы организовать преобразование типов его надо проинклудить. Но если я его использую в разных диалогах, и на них куча таких же классов, в которых необходимо менять отображение некоторых элементов при нажатии той же кнопки?
я думаю здесь не обойтись без PostMessage или что то вроде того.
но как это сделать (правильно) я не знаю.
Это не преобразование типов, а макрос типа
#define IDC_LIST1 1002
в файле resource.h. Можно определить переменную во втором окне и перед выводом окна присвоить переменной это значение.
В самом общем случае конечно нужен PostMessage.
Во втором диалоговом окне
CWnd *pWnd = GetParent();
pWnd->PostMessage(WM_COMMAND, 1000, 0)
А в первом или переопределить OnCommand окна, типа
{
if(wParam==1000)
{
...
return TRUE;
}
return CDialog::OnCommand(wParam, lParam);
}
afx_msg void OnUser1()
В .cpp файле внутри BEGIN_MESSAGE_MAP/END_MESSAGE_MAP написать
ON_COMMAND(1000, OnUser1)
И конечно написать саму ф-ию
void CDlg::OnUser1()
{
. . .
}
Это не преобразование типов, а макрос типа
#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
И так далее
А за пример спасибо!
Вообще-то я так и предполагал, но не был уверен, я думал может существует какой ни будь другой механизм.
вообще-то под преобразованием типов я имел в виду следующее:
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);
и без этого будет работать.
Если CMyListBox порожден от СListBox, то не нужно подключить “mylistbox.h”, код
CWnd *pWnd = GetParent();
CListBox *pLb = (CListBox *)pWnd->GetDlgItem(IDC_LIST1);
pLb->SetCurSel(2);
и без этого будет работать.
ну да, будет конечно, но я же сказал - "я имею в виду использование не только виртуальных функций"