这是可行的
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的here )
hChild = CreateWindow(childClassName, L"", WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 400, 250, hMDIClient, NULL, GetModuleHandle(NULL), this);但是这样做会导致windo错误,没有zlose,没有最小化,没有最大化,我不能调整它的大小,如果我创建另一个MDI子窗口,前一个窗口将变得不可选。
有没有可能使用SendMessage或CreateWindow,传递一个this指针,然后仍然创建一个工作的MDI子窗口?
发布于 2014-12-06 01:18:48
我通过这样做解决了这个问题
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时,WndProc中的lparam将是指向CREATESTRUCT的指针,其lpCreateParams将是MIDICREATESTRUCT,其lParam将是指向对象的指针。
呼。
发布于 2014-12-15 06:08:16
将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);https://stackoverflow.com/questions/27318806
复制相似问题