void ServiceHandler::InvalidHandle() { if ( m_LockCheck.SetInvalid() == false ) return; ::closesocket((SOCKET)m_hClientSocket.ToPointer()); m_hClientSocket = (System::IntPtr)(HANDLE)INVALID_SOCKET; // 回调函数处理全部数据的断开 System::EventHandler<GlobalDisconnectAtServerEventArgs^>^ tempEvent = this->Owner->m_EventGlobalDisconnect; if ( tempEvent != nullptr ) { GlobalDisconnectAtServerEventArgs^ disconnectEventArgs = gcnew GlobalDisconnectAtServerEventArgs( this, this->Owner->ServiceHandleManager ); tempEvent( this, disconnectEventArgs ); } // 回调函数处理当前数据的断开 System::EventHandler<DisconnectAtServerEventArgs^>^ tempEvent2 = this->m_EventDisconnect; if ( tempEvent2 != nullptr ) { DisconnectAtServerEventArgs^ disconnectEventArgs = gcnew DisconnectAtServerEventArgs( this, this->Owner->ServiceHandleManager ); tempEvent2( this, disconnectEventArgs ); } }
// Layout algorithm for any window. mainWindow gets what's left over. bool wxLayoutAlgorithm::LayoutWindow(wxWindow* parent, wxWindow* mainWindow) { // Test if the parent is a sash window, and if so, // reduce the available space to allow space for any active edges. int leftMargin = 0, rightMargin = 0, topMargin = 0, bottomMargin = 0; #if wxUSE_SASH if (wxDynamicCast(parent, wxSashWindow)) { wxSashWindow* sashWindow = (wxSashWindow*) parent; leftMargin = sashWindow->GetExtraBorderSize(); rightMargin = sashWindow->GetExtraBorderSize(); topMargin = sashWindow->GetExtraBorderSize(); bottomMargin = sashWindow->GetExtraBorderSize(); if (sashWindow->GetSashVisible(wxSASH_LEFT)) leftMargin += sashWindow->GetDefaultBorderSize(); if (sashWindow->GetSashVisible(wxSASH_RIGHT)) rightMargin += sashWindow->GetDefaultBorderSize(); if (sashWindow->GetSashVisible(wxSASH_TOP)) topMargin += sashWindow->GetDefaultBorderSize(); if (sashWindow->GetSashVisible(wxSASH_BOTTOM)) bottomMargin += sashWindow->GetDefaultBorderSize(); } #endif // wxUSE_SASH int cw, ch; parent->GetClientSize(& cw, & ch); wxRect rect(leftMargin, topMargin, cw - leftMargin - rightMargin, ch - topMargin - bottomMargin); wxCalculateLayoutEvent event; event.SetRect(rect); // Find the last layout-aware window, so we can make it fill all remaining // space. wxWindow *lastAwareWindow = NULL; wxWindowList::compatibility_iterator node = parent->GetChildren().GetFirst(); while (node) { wxWindow* win = node->GetData(); if (win->IsShown()) { wxCalculateLayoutEvent tempEvent(win->GetId()); tempEvent.SetEventObject(win); tempEvent.SetFlags(wxLAYOUT_QUERY); tempEvent.SetRect(event.GetRect()); if (win->GetEventHandler()->ProcessEvent(tempEvent)) lastAwareWindow = win; } node = node->GetNext(); } // Now do a dummy run to see if we have any space left for the final window (fail if not) node = parent->GetChildren().GetFirst(); while (node) { wxWindow* win = node->GetData(); // If mainWindow is NULL and we're at the last window, // skip this, because we'll simply make it fit the remaining space. if (win->IsShown() && (win != mainWindow) && (mainWindow != NULL || win != lastAwareWindow)) { event.SetId(win->GetId()); event.SetEventObject(win); event.SetFlags(wxLAYOUT_QUERY); win->GetEventHandler()->ProcessEvent(event); } node = node->GetNext(); } if (event.GetRect().GetWidth() < 0 || event.GetRect().GetHeight() < 0) return false; event.SetRect(rect); node = parent->GetChildren().GetFirst(); while (node) { wxWindow* win = node->GetData(); // If mainWindow is NULL and we're at the last window, // skip this, because we'll simply make it fit the remaining space. if (win->IsShown() && (win != mainWindow) && (mainWindow != NULL || win != lastAwareWindow)) { event.SetId(win->GetId()); event.SetEventObject(win); event.SetFlags(0); // ?? win->GetEventHandler()->ProcessEvent(event); } node = node->GetNext(); } rect = event.GetRect(); if (mainWindow) mainWindow->SetSize(rect.x, rect.y, wxMax(0, rect.width), wxMax(0, rect.height)); else if (lastAwareWindow) { // Fit the remaining space lastAwareWindow->SetSize(rect.x, rect.y, wxMax(0, rect.width), wxMax(0, rect.height)); } return true; }