Может кто-нибудь сказать мне, почему дочернее окно не может быть создано?
Я использую руководство по подделке win32api, но не могу понять, в чем проблема.
Когда программа запускается, у меня есть все элементы управления, но когда я нажимаю на «новый» пункт меню, я получаю сообщение об ошибке. Это сразу после winmain.
Другие вещи, такие как элементы меню, инструмент и строки состояния, открытие или сохранение файлов работает.
**HWND CreateNewMDIChild(HWND hMDIClient)
{
MDICREATESTRUCT mcs;
HWND hChild;
mcs.szTitle = "[Untitled]";
mcs.szClass = g_szChildClassName;
mcs.hOwner = GetModuleHandle(NULL);
mcs.x = mcs.cx = CW_USEDEFAULT;
mcs.y = mcs.cy = CW_USEDEFAULT;
mcs.style = MDIS_ALLCHILDSTYLES;
hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);
if(!hChild)
{
MessageBox(hMDIClient, "MDI Child creation failed.", "Oh Oh...",
MB_ICONEXCLAMATION | MB_OK);
}
return hChild;
}**
Это неудачная ошибка в образец кода, это препятствует тому, чтобы это работало на 64-разрядной Windows. Конечный параметр для Отправить сообщение имеет тип LPARAM
(псевдоним для LONG_PTR
). Приведение к LONG
усекает его до 4 байтов, что недостаточно для 64-битного указателя (см. Диапазоны типов данных).
Измените следующую строку
hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);
в
hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs);
и код должен работать как положено.