используя CreateWindow для создания дочернего окна MDI

это работает

mcs.szTitle = L"untitled";
mcs.szClass = childClassName;
mcs.hOwner  = GetModuleHandle(NULL);
mcs.x = mcs.cx = CW_USEDEFAULT;
mcs.y = mcs.cy = CW_USEDEFAULT;
mcs.style = WS_HSCROLL;
hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);

но я не могу отправить ему указатель на объект, который имеет WndProc, который я хотел бы использовать (см. Вот для обёртывания WndProc в классах) вот так

hChild = CreateWindow(childClassName, L"", WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 400, 250, hMDIClient, NULL, GetModuleHandle(NULL), this);

Однако, если это сделать так, это вызовет ошибку с windo, не будет zlose, no minize, no maximize, я не смогу изменить его размер, и если я создам другое дочернее окно mdi, предыдущее окно станет недоступным для выбора.

Можно ли использовать SendMessage или CreateWindow, передать указатель this и все еще создать рабочее дочернее окно MDI?

0

Решение

Я решил это, сделав это

hChild = CreateMDIWindow(childClassName, L"", WS_EX_WINDOWEDGE, 49, 50, 51, 52, hMDIClient, GetModuleHandle(NULL), (LPARAM)this);

а потом в статическом WndProc

LRESULT CALLBACK CWindowHandler::MsgRouter(HWND hwnd, UINT message,
WPARAM wparam, LPARAM lparam)
{
CREATESTRUCT* wnd = 0;
MDICREATESTRUCT* mdiStruct = 0;
CMDIChildWindowBase* wndBase;

if(message == WM_NCCREATE)
{
wnd = (CREATESTRUCT*)(lparam);
mdiStruct = (MDICREATESTRUCT*)wnd->lpCreateParams;
wndBase = (CMDIChildWindowBase*)mdiStruct->lParam;
SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(wndBase));

// save window handle
wndBase->SetHWND(hwnd);
}
else
wndBase = reinterpret_cast<CMDIChildWindowBase *>(::GetWindowLong(hwnd, GWL_USERDATA));

// call the windows message handler
if(wndBase)
return wndBase->WndProcs(message, wparam, lparam);
return DefWindowProc(hwnd, message, wparam, lparam);
}

поэтому при создании MDIChild lparam в WndProc будет указателем на CREATESTRUCT, у которого lpCreateParams будет MIDICREATESTRUCT, а lParam будет указателем на ваш объект.

уф.

0

Другие решения

Когда вы передаете MDICREATESTRUCT в WM_MDICREATEВы можете предоставить указатель на объект в MDICREATESTRUCT.lParam поле:

mcs.szTitle = L"untitled";
mcs.szClass = childClassName;
mcs.hOwner  = GetModuleHandle(NULL);
mcs.x = mcs.cx = CW_USEDEFAULT;
mcs.y = mcs.cy = CW_USEDEFAULT;
mcs.style = WS_HSCROLL;
mcs.lParam = (LPARAM) this; // <-- here

hChild = (HWND) SendMessage(hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs);
0

По вопросам рекламы [email protected]