⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textctrlce.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        // for compatibility, don't move the cursor when doing SetValue()        SetInsertionPoint(0);    }    else // same text    {        // still send an event for consistency        if ( flags & SetValue_SendEvent )            SendUpdateEvent();    }    // we should reset the modified flag even if the value didn't really change    // mark the control as being not dirty - we changed its text, not the    // user    DiscardEdits();}void wxTextCtrl::WriteText(const wxString& value){    DoWriteText(value);}void wxTextCtrl::DoWriteText(const wxString& value, int flags){    bool selectionOnly = (flags & SetValue_SelectionOnly) != 0;    wxString valueDos;    if ( m_windowStyle & wxTE_MULTILINE )        valueDos = wxTextFile::Translate(value, wxTextFileType_Dos);    else        valueDos = value;    // in some cases we get 2 EN_CHANGE notifications after the SendMessage    // call below which is confusing for the client code and so should be    // avoided    //    if ( selectionOnly && HasSelection() )    {        m_suppressNextUpdate = true;    }    ::SendMessage(GetBuddyHwnd(), selectionOnly ? EM_REPLACESEL : WM_SETTEXT,                  0, (LPARAM)valueDos.c_str());    if ( !selectionOnly && !( flags & SetValue_SendEvent ) )    {        // Windows already sends an update event for single-line        // controls.        if ( m_windowStyle & wxTE_MULTILINE )            SendUpdateEvent();    }    AdjustSpaceLimit();}void wxTextCtrl::AppendText(const wxString& text){    SetInsertionPointEnd();    WriteText(text);}void wxTextCtrl::Clear(){    ::SetWindowText(GetBuddyHwnd(), wxEmptyString);    // Windows already sends an update event for single-line    // controls.    if ( m_windowStyle & wxTE_MULTILINE )        SendUpdateEvent();}// ----------------------------------------------------------------------------// Clipboard operations// ----------------------------------------------------------------------------void wxTextCtrl::Copy(){    if (CanCopy())    {        ::SendMessage(GetBuddyHwnd(), WM_COPY, 0, 0L);    }}void wxTextCtrl::Cut(){    if (CanCut())    {        ::SendMessage(GetBuddyHwnd(), WM_CUT, 0, 0L);    }}void wxTextCtrl::Paste(){    if (CanPaste())    {        ::SendMessage(GetBuddyHwnd(), WM_PASTE, 0, 0L);    }}bool wxTextCtrl::HasSelection() const{    long from, to;    GetSelection(&from, &to);    return from != to;}bool wxTextCtrl::CanCopy() const{    // Can copy if there's a selection    return HasSelection();}bool wxTextCtrl::CanCut() const{    return CanCopy() && IsEditable();}bool wxTextCtrl::CanPaste() const{    if ( !IsEditable() )        return false;    // Standard edit control: check for straight text on clipboard    if ( !::OpenClipboard(GetHwndOf(wxTheApp->GetTopWindow())) )        return false;    bool isTextAvailable = ::IsClipboardFormatAvailable(CF_TEXT) != 0;    ::CloseClipboard();    return isTextAvailable;}// ----------------------------------------------------------------------------// Accessors// ----------------------------------------------------------------------------void wxTextCtrl::SetEditable(bool editable){    ::SendMessage(GetBuddyHwnd(), EM_SETREADONLY, (WPARAM)!editable, (LPARAM)0L);}void wxTextCtrl::SetInsertionPoint(long pos){    DoSetSelection(pos, pos);}void wxTextCtrl::SetInsertionPointEnd(){    if ( GetInsertionPoint() != GetLastPosition() )        SetInsertionPoint(GetLastPosition());}long wxTextCtrl::GetInsertionPoint() const{    DWORD Pos = (DWORD)::SendMessage(GetBuddyHwnd(), EM_GETSEL, 0, 0L);    return Pos & 0xFFFF;}wxTextPos wxTextCtrl::GetLastPosition() const{    int numLines = GetNumberOfLines();    long posStartLastLine = XYToPosition(0, numLines - 1);    long lenLastLine = GetLengthOfLineContainingPos(posStartLastLine);    return posStartLastLine + lenLastLine;}void wxTextCtrl::GetSelection(long* from, long* to) const{    DWORD dwStart, dwEnd;    ::SendMessage(GetBuddyHwnd(), EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd);    *from = dwStart;    *to = dwEnd;}bool wxTextCtrl::IsEditable() const{    if ( !GetBuddyHwnd() )        return true;    long style = ::GetWindowLong(GetBuddyHwnd(), GWL_STYLE);    return (style & ES_READONLY) == 0;}// ----------------------------------------------------------------------------// selection// ----------------------------------------------------------------------------void wxTextCtrl::SetSelection(long from, long to){    // if from and to are both -1, it means (in wxWidgets) that all text should    // be selected - translate into Windows convention    if ( (from == -1) && (to == -1) )    {        from = 0;        to = -1;    }    DoSetSelection(from, to);}void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret){    ::SendMessage(GetBuddyHwnd(), EM_SETSEL, (WPARAM)from, (LPARAM)to);    if ( scrollCaret )    {        ::SendMessage(GetBuddyHwnd(), EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);    }}// ----------------------------------------------------------------------------// Working with files// ----------------------------------------------------------------------------bool wxTextCtrl::LoadFile(const wxString& file){    if ( wxTextCtrlBase::LoadFile(file) )    {        // update the size limit if needed        AdjustSpaceLimit();        return true;    }    return false;}// ----------------------------------------------------------------------------// Editing// ----------------------------------------------------------------------------void wxTextCtrl::Replace(long from, long to, const wxString& value){    // Set selection and remove it    DoSetSelection(from, to, false);    DoWriteText(value, SetValue_SelectionOnly);}void wxTextCtrl::Remove(long from, long to){    Replace(from, to, wxEmptyString);}bool wxTextCtrl::IsModified() const{    return ::SendMessage(GetBuddyHwnd(), EM_GETMODIFY, 0, 0) != 0;}void wxTextCtrl::MarkDirty(){    ::SendMessage(GetBuddyHwnd(), EM_SETMODIFY, TRUE, 0L);}void wxTextCtrl::DiscardEdits(){    ::SendMessage(GetBuddyHwnd(), EM_SETMODIFY, FALSE, 0L);}int wxTextCtrl::GetNumberOfLines() const{    return (int)::SendMessage(GetBuddyHwnd(), EM_GETLINECOUNT, 0, 0L);}// ----------------------------------------------------------------------------// Positions <-> coords// ----------------------------------------------------------------------------long wxTextCtrl::XYToPosition(long x, long y) const{    // This gets the char index for the _beginning_ of this line    long charIndex = ::SendMessage(GetBuddyHwnd(), EM_LINEINDEX, (WPARAM)y, (LPARAM)0);    return charIndex + x;}bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const{    // This gets the line number containing the character    long lineNo = ::SendMessage(GetBuddyHwnd(), EM_LINEFROMCHAR, (WPARAM)pos, 0);    if ( lineNo == -1 )    {        // no such line        return false;    }    // This gets the char index for the _beginning_ of this line    long charIndex = ::SendMessage(GetBuddyHwnd(), EM_LINEINDEX, (WPARAM)lineNo, (LPARAM)0);    if ( charIndex == -1 )    {        return false;    }    // The X position must therefore be the different between pos and charIndex    if ( x )        *x = pos - charIndex;    if ( y )        *y = lineNo;    return true;}wxTextCtrlHitTestResultwxTextCtrl::HitTest(const wxPoint& pt, long *posOut) const{    // first get the position from Windows    // for the plain ones, we are limited to 16 bit positions which are    // combined in a single 32 bit value    LPARAM lParam = MAKELPARAM(pt.x, pt.y);    LRESULT pos = ::SendMessage(GetBuddyHwnd(), EM_CHARFROMPOS, 0, lParam);    if ( pos == -1 )    {        // this seems to indicate an error...        return wxTE_HT_UNKNOWN;    }    // for plain EDIT controls the higher word contains something else    pos = LOWORD(pos);    // next determine where it is relatively to our point: EM_CHARFROMPOS    // always returns the closest character but we need to be more precise, so    // double check that we really are where it pretends    POINTL ptReal;    LRESULT lRc = ::SendMessage(GetBuddyHwnd(), EM_POSFROMCHAR, pos, 0);    if ( lRc == -1 )    {        // this is apparently returned when pos corresponds to the last        // position        ptReal.x =        ptReal.y = 0;    }    else    {        ptReal.x = LOWORD(lRc);        ptReal.y = HIWORD(lRc);    }    wxTextCtrlHitTestResult rc;    if ( pt.y > ptReal.y + GetCharHeight() )        rc = wxTE_HT_BELOW;    else if ( pt.x > ptReal.x + GetCharWidth() )        rc = wxTE_HT_BEYOND;    else        rc = wxTE_HT_ON_TEXT;    if ( posOut )        *posOut = pos;    return rc;}void wxTextCtrl::ShowPosition(long pos){    int currentLineLineNo = (int)::SendMessage(GetBuddyHwnd(), EM_GETFIRSTVISIBLELINE, 0, 0L);    int specifiedLineLineNo = (int)::SendMessage(GetBuddyHwnd(), EM_LINEFROMCHAR, (WPARAM)pos, 0L);    int linesToScroll = specifiedLineLineNo - currentLineLineNo;    if (linesToScroll != 0)        (void)::SendMessage(GetBuddyHwnd(), EM_LINESCROLL, 0, (LPARAM)linesToScroll);}long wxTextCtrl::GetLengthOfLineContainingPos(long pos) const{    return ::SendMessage(GetBuddyHwnd(), EM_LINELENGTH, (WPARAM)pos, 0L);}int wxTextCtrl::GetLineLength(long lineNo) const{    long pos = XYToPosition(0, lineNo);    return GetLengthOfLineContainingPos(pos);}wxString wxTextCtrl::GetLineText(long lineNo) const{    size_t len = (size_t)GetLineLength(lineNo) + 1;    // there must be at least enough place for the length WORD in the    // buffer    len += sizeof(WORD);    wxString str;    {        wxStringBufferLength tmp(str, len);        wxChar *buf = tmp;        *(WORD *)buf = (WORD)len;        len = (size_t)::SendMessage(GetBuddyHwnd(), EM_GETLINE, lineNo, (LPARAM)buf);        // remove the '\n' at the end, if any (this is how this function is        // supposed to work according to the docs)        if ( buf[len - 1] == _T('\n') )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -