Как карты сообщений взаимодействуют с методом SendMessage ()? - PullRequest
1 голос
/ 15 апреля 2019

Несмотря на то, что я читаю много статей MSDN, я не могу разобраться с картами сообщений MFC и функцией SendMessage(). Прямо сейчас у меня есть элемент управления IP под названием IDC_IPADDRESS_MYADDRESS, для которого я хочу установить значение. Я знаю, что IPM_SETADDRESS - это правильный тип сообщения, но я не знаю, как успешно отправить сообщение и обновить значение элемента управления ip.

Что мне нужно добавить к моей карте сообщений,

BEGIN_MESSAGE_MAP(myDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &myDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

А как правильно использовать эту запись карты для обновления значения элемента управления IP-адресом? Ниже моя попытка обновить его с помощью вызова SendMessage () в методе init диалога.

// myDlgmessage handlers

BOOL myDlg::OnInitDialog()
{
    myDlg::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here

    //set default IP address    
    DWORD IP = MAKEIPADDRESS(192, 168, 0, 254);
    SendMessage(IPM_SETADDRESS, 0, IP); 

    return TRUE;  // return TRUE  unless you set the focus to a control
}

1 Ответ

3 голосов
/ 16 апреля 2019
SendMessage(IPM_SETADDRESS, 0, IP);

IPM_SETADDRESS - правильное сообщение, но оно отправляется в главное диалоговое окно.Диалог не ищет это сообщение и игнорирует его.

Вместо этого вы хотите отправить сообщение в элемент управления IP.Это означает, что вам нужен дескриптор окна для управления IP-адресом:

CWnd *ptr_ip_address = GetDlgItem(IDC_IPADDRESS_MYADDRESS);
if (ptr_ip_address)
    ptr_ip_address->SendMessage(IPM_SETADDRESS, 0, IP);

В MFC вы можете использовать класс CIPAddressCtrl.Вы должны объявить m_ip_address и сделать его подклассом DoDataExchange.Этот класс также имеет метод SetAddress.

class CMyDialog : public CDialogEx
{
    ...
    CIPAddressCtrl m_ip_address;
    void DoDataExchange(CDataExchange* pDX);
};

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_IPADDRESS_MYADDRESS , m_ip_address);
}

BOOL myDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    m_ip_address.SetAddress(192, 168, 0, 254);
    ...
}

Карта сообщений MFC не имеет прямого отношения к вашему вопросу.Карта сообщений используется для ответа на сообщения Windows.Например, вы хотите ответить на ON_BN_CLICKED.Но здесь вы отправляете сообщение элементу управления, а не получаете сообщение.

Подробнее об этом вы можете прочитать в книгах по программированию WinAPI.В простом программировании Windows есть «цикл сообщений» и «процедура Windows», где вы можете отвечать на сообщения.MFC использует карту сообщений для упрощения этой процедуры.

BOOL myDlg::OnInitDialog()
{
    myDlg::OnInitDialog(); <- recursive
    ...
}

Кстати, установка myDlg::OnInitDialog в myDlg::OnInitDialog вызывает переполнение стека.Вместо этого позвоните в базовый класс: CDialogEx::OnInitDialog();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...