LRESULT CNodeWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if(m_bCreateExternal) { switch(message) { case WM_COMMAND: { WNDPROC* lplpfn = GetSuperWndProcAddr(); LRESULT res = CallWindowProc(*lplpfn, m_hWnd, message, wParam, lParam); HWND hWnd = (HWND)lParam; if (::IsWindow(hWnd)&&m_pWndNode) { ::GetClassName(hWnd, theApp.m_szBuffer, MAX_PATH); m_pWndNode->Fire_ControlNotify(m_pWndNode, HIWORD(wParam), LOWORD(wParam), lParam, CComBSTR(theApp.m_szBuffer)); } return res; } case WM_ACTIVATE: case WM_ERASEBKGND: case WM_SETFOCUS: case WM_CONTEXTMENU: case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_LBUTTONDBLCLK: { WNDPROC* lplpfn = GetSuperWndProcAddr(); return CallWindowProc(*lplpfn,m_hWnd,message, wParam, lParam); } case WM_MOUSEACTIVATE: { break; } case WM_SHOWWINDOW: { if (wParam&&m_pWndNode->m_strURL!=_T("")) { CComQIPtr<IWebBrowser2> pWebCtrl(m_pWndNode->m_pDisp); if(pWebCtrl) { if (m_pWndNode->m_bWebInit == false) { pWebCtrl->Navigate2(&CComVariant(m_pWndNode->m_strURL), &CComVariant(navNoReadFromCache | navNoWriteToCache), NULL, NULL, NULL); m_pWndNode->m_bWebInit = true; } } } break; } } } return CWnd::WindowProc(message, wParam, lParam); }
BOOL CWnd::SubclassWindow(HWND hWnd) { if (!Attach(hWnd)) return FALSE; // allow any other subclassing to occur PreSubclassWindow(); // now hook into the AFX WndProc WNDPROC* lplpfn = GetSuperWndProcAddr(); WNDPROC oldWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)AfxGetAfxWndProc()); ASSERT(oldWndProc != (WNDPROC)AfxGetAfxWndProc); if (*lplpfn == NULL) *lplpfn = oldWndProc; // the first control of that type created #ifdef _DEBUG else if (*lplpfn != oldWndProc) { TRACE0("Error: Trying to use SubclassWindow with incorrect CWnd\n"); TRACE0("\tderived class.\n"); TRACE3("\thWnd = $%04X (nIDC=$%04X) is not a %hs.\n", (UINT)hWnd, _AfxGetDlgCtrlID(hWnd), GetRuntimeClass()->m_lpszClassName); ASSERT(FALSE); // undo the subclassing if continuing after assert ::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)oldWndProc); } #endif return TRUE; }
HWND CWnd::UnsubclassWindow() { ASSERT(::IsWindow(m_hWnd)); // set WNDPROC back to original value WNDPROC* lplpfn = GetSuperWndProcAddr(); SetWindowLong(m_hWnd, GWL_WNDPROC, (LONG)*lplpfn); *lplpfn = NULL; // and Detach the HWND from the CWnd object return Detach(); }
void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == VK_TAB || nChar == VK_RETURN) { m_nLastChar = nChar; GetParent()->SetFocus(); // This will destroy this window return; } if (nChar == VK_ESCAPE) { #if _MSC_VER >= 1300 ::CallWindowProcW(*GetSuperWndProcAddr(), m_hWnd, WM_SETTEXT, 0, (LPARAM)(LPCWSTR)m_sInitText); #else SetWindowText(m_sInitText); // restore previous text #endif m_nLastChar = nChar; GetParent()->SetFocus(); return; } CEdit::OnChar(nChar, nRepCnt, nFlags); // Resize edit control if needed // Get text extent CString str; GetWindowText( str ); // add some extra buffer str += _T(" "); CWindowDC dc(this); CFont *pFontDC = dc.SelectObject(GetFont()); CSize size = dc.GetTextExtent( str ); dc.SelectObject( pFontDC ); // Get client rect CRect ParentRect; GetParent()->GetClientRect( &ParentRect ); // Check whether control needs to be resized // and whether there is space to grow if (size.cx > m_Rect.Width()) { if( size.cx + m_Rect.left < ParentRect.right ) m_Rect.right = m_Rect.left + size.cx; else m_Rect.right = ParentRect.right; MoveWindow( &m_Rect ); } }
void CInPlaceEdit::EndEdit() { // EFW - BUG FIX - Clicking on a grid scroll bar in a derived class // that validates input can cause this to get called multiple times // causing assertions because the edit control goes away the first time. static BOOL bAlreadyEnding = FALSE; if(bAlreadyEnding) return; bAlreadyEnding = TRUE; // Send Notification to parent GV_DISPINFO dispinfo; dispinfo.hdr.hwndFrom = GetSafeHwnd(); dispinfo.hdr.idFrom = GetDlgCtrlID(); dispinfo.hdr.code = GVN_ENDLABELEDIT; dispinfo.item.mask = LVIF_TEXT|LVIF_PARAM; dispinfo.item.row = m_nRow; dispinfo.item.col = m_nColumn; #if _MSC_VER >= 1300 wchar_t buf[2048]; ::CallWindowProcW(*GetSuperWndProcAddr(), m_hWnd, WM_GETTEXT, 2048, (LPARAM)buf); dispinfo.item.strText = CStringW(buf); #else GetWindowText(dispinfo.item.strText); #endif dispinfo.item.lParam = (LPARAM) m_nLastChar; CWnd* pOwner = GetOwner(); if (pOwner) pOwner->SendMessage(WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&dispinfo ); // Close this window (PostNcDestroy will delete this) if (IsWindow(GetSafeHwnd())) SendMessage(WM_CLOSE, 0, 0); bAlreadyEnding = FALSE; }
BOOL CPadView::SetWordWrap(BOOL bWordWrap) { bWordWrap = !!bWordWrap; // make sure ==TRUE || ==FALSE if (IsWordWrap() == bWordWrap) return FALSE; // preserve original control's state. CFont* pFont = GetFont(); int nLen = GetBufferLength(); TCHAR* pSaveText = new TCHAR[GetBufferLength()+1]; GetWindowText(pSaveText, nLen+1); // create new edit control with appropriate style and size. DWORD dwStyle = dwStyleDefault & ~(ES_AUTOHSCROLL|WS_HSCROLL|WS_VISIBLE); if (!bWordWrap) dwStyle |= ES_AUTOHSCROLL|WS_HSCROLL; CWnd* pParent = GetParent(); CRect rect; GetWindowRect(rect); pParent->ScreenToClient(rect); CWnd* pFocus = GetFocus(); UINT_PTR nID = GetDlgCtrlID(); HWND hWnd = ::CreateWindowEx(WS_EX_CLIENTEDGE, _T("edit"), NULL, dwStyle, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, pParent->m_hWnd, (HMENU)nID, AfxGetInstanceHandle(), NULL); if (hWnd == NULL) { delete[] pSaveText; return FALSE; } // set the window text to nothing to make sure following set doesn't fail SetWindowText(NULL); // restore visual state ::SetWindowText(hWnd, pSaveText); delete[] pSaveText; if (pFont != NULL) { ASSERT(pFont->m_hObject != NULL); ::SendMessage(hWnd, WM_SETFONT, (WPARAM)pFont->m_hObject, 0); } // detach old window, attach new SetDlgCtrlID((UINT)nID+1); HWND hWndOld = Detach(); ::SetWindowLongPtr(hWndOld, GWLP_WNDPROC, (LONG_PTR)*GetSuperWndProcAddr()); ASSERT(m_hWnd == NULL); SubclassWindow(hWnd); ASSERT(m_hWnd == hWnd); GetParentFrame()->SendMessage(WM_RECALCPARENT); UINT nTabStops = m_nTabStops; GetEditCtrl().SetTabStops(nTabStops); GetClientRect(&rect); SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER|SWP_SHOWWINDOW); SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER|SWP_DRAWFRAME); SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); UpdateWindow(); // destroy old ::SetWindowPos(hWndOld, NULL, 0, 0, 0, 0, SWP_HIDEWINDOW|SWP_NOREDRAW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE| SWP_NOZORDER); ::DestroyWindow(hWndOld); // restore rest of state... GetEditCtrl().LimitText(nMaxSize); if (pFocus == this) SetFocus(); // notify container that doc changed GetDocument()->UpdateAllItems(NULL); ASSERT_VALID(this); return TRUE; }
CInPlaceEdit::CInPlaceEdit(CWnd* pParent, CRect& rect, DWORD dwStyle, UINT nID, #if _MSC_VER >= 1300 int nRow, int nColumn, CStringW sInitText, #else int nRow, int nColumn, CString sInitText, #endif UINT nFirstChar) { m_sInitText = sInitText; m_nRow = nRow; m_nColumn = nColumn; m_nLastChar = 0; m_bExitOnArrows = (nFirstChar != VK_LBUTTON); // If mouse click brought us here, // then no exit on arrows m_Rect = rect; // For bizarre CE bug. DWORD dwEditStyle = WS_BORDER|WS_CHILD|WS_VISIBLE| ES_AUTOHSCROLL //|ES_MULTILINE | dwStyle; if (!Create(dwEditStyle, rect, pParent, nID)) return; //#if _MSC_VER >= 1300 // // This effectively does the same as CEdit::Create but uses CreateWindowExW not CreateWindowEx. // HWND hw = ::CreateWindowExW(0, L"EDIT", NULL, dwEditStyle, // rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, // pParent->GetSafeHwnd(), (HMENU)(UINT_PTR)nID, AfxGetInstanceHandle(), NULL); // if (hw == (HWND)0 || !SubclassWindow(hw)) // return; // //#endif SetFont(pParent->GetFont()); #if _MSC_VER >= 1300 ::CallWindowProcW(*GetSuperWndProcAddr(), m_hWnd, WM_SETTEXT, 0, (LPARAM)(LPCWSTR)sInitText); #else SetWindowText(sInitText); #endif int len = sInitText.GetLength(); SetFocus(); switch (nFirstChar){ case VK_LBUTTON: case VK_RETURN: SetSel(len, -1); return; case VK_BACK: SetSel(len, -1); break; case VK_TAB: case VK_DOWN: case VK_UP: case VK_RIGHT: case VK_LEFT: case VK_NEXT: case VK_PRIOR: case VK_HOME: case VK_SPACE: case VK_END: SetSel(0,-1); return; default: SetSel(0,-1); } // Added by KiteFly. When entering DBCS chars into cells the first char was being lost // SenMessage changed to PostMessage (John Lagerquist) if( nFirstChar < 0x80) PostMessage(WM_CHAR, nFirstChar); else PostMessage(WM_IME_CHAR, nFirstChar); }