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();