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

📄 textctrlce.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
///////////////////////////////////////////////////////////////////////////////// Name:        src/msw/wince/textctrlce.cpp// Purpose:     wxTextCtrl implementation for smart phones driven by WinCE// Author:      Wlodzimierz ABX Skiba// Modified by:// Created:     30.08.2004// RCS-ID:      $Id: textctrlce.cpp,v 1.11 2006/10/31 08:49:38 RD Exp $// Copyright:   (c) Wlodzimierz Skiba// License:     wxWindows licence///////////////////////////////////////////////////////////////////////////////// ============================================================================// declarations// ============================================================================// ----------------------------------------------------------------------------// headers// ----------------------------------------------------------------------------// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__    #pragma hdrstop#endif#if wxUSE_TEXTCTRL && defined(__SMARTPHONE__) && defined(__WXWINCE__)#include "wx/textctrl.h"#ifndef WX_PRECOMP    #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"#endif#include "wx/spinbutt.h"#include "wx/textfile.h"#define GetBuddyHwnd()      (HWND)(m_hwndBuddy)#define IsVertical(wxStyle) (true)// ----------------------------------------------------------------------------// event tables and other macros// ----------------------------------------------------------------------------#if wxUSE_EXTENDED_RTTI// TODO#elseIMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)#endifBEGIN_EVENT_TABLE(wxTextCtrl, wxControl)    EVT_CHAR(wxTextCtrl::OnChar)    EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)    EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)    EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)    EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)    EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)    EVT_MENU(wxID_CLEAR, wxTextCtrl::OnDelete)    EVT_MENU(wxID_SELECTALL, wxTextCtrl::OnSelectAll)    EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)    EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)    EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)    EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)    EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)    EVT_UPDATE_UI(wxID_CLEAR, wxTextCtrl::OnUpdateDelete)    EVT_UPDATE_UI(wxID_SELECTALL, wxTextCtrl::OnUpdateSelectAll)    EVT_SET_FOCUS(wxTextCtrl::OnSetFocus)END_EVENT_TABLE()// ----------------------------------------------------------------------------// constants// ----------------------------------------------------------------------------// the margin between the up-down control and its buddy (can be arbitrary,// choose what you like - or may be decide during run-time depending on the// font size?)static const int MARGIN_BETWEEN = 0;// ============================================================================// implementation// ============================================================================wxArrayTextSpins wxTextCtrl::ms_allTextSpins;// ----------------------------------------------------------------------------// wnd proc for the buddy text ctrl// ----------------------------------------------------------------------------LRESULT APIENTRY _EXPORT wxBuddyTextCtrlWndProc(HWND hwnd,                                                UINT message,                                                WPARAM wParam,                                                LPARAM lParam){    wxTextCtrl *spin = (wxTextCtrl *)wxGetWindowUserData(hwnd);    // forward some messages (the key and focus ones only so far) to    // the spin ctrl    switch ( message )    {        case WM_SETFOCUS:            // if the focus comes from the spin control itself, don't set it            // back to it -- we don't want to go into an infinite loop            if ( (WXHWND)wParam == spin->GetHWND() )                break;            //else: fall through        case WM_KILLFOCUS:        case WM_CHAR:        case WM_DEADCHAR:        case WM_KEYUP:        case WM_KEYDOWN:            spin->MSWWindowProc(message, wParam, lParam);            // The control may have been deleted at this point, so check.            if ( !::IsWindow(hwnd) || wxGetWindowUserData(hwnd) != spin )                return 0;            break;        case WM_GETDLGCODE:            // we want to get WXK_RETURN in order to generate the event for it            return DLGC_WANTCHARS;    }    return ::CallWindowProc(CASTWNDPROC spin->GetBuddyWndProc(),                            hwnd, message, wParam, lParam);}// ----------------------------------------------------------------------------// creation// ----------------------------------------------------------------------------void wxTextCtrl::Init(){    m_suppressNextUpdate = false;    m_isNativeCaretShown = true;}wxTextCtrl::~wxTextCtrl(){}bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,                        const wxString& value,                        const wxPoint& pos,                        const wxSize& size,                        long style,                        const wxValidator& validator,                        const wxString& name){    if ( (style & wxBORDER_MASK) == wxBORDER_DEFAULT )        style |= wxBORDER_SIMPLE;    SetWindowStyle(style);    WXDWORD exStyle = 0;    WXDWORD msStyle = MSWGetStyle(GetWindowStyle(), & exStyle) ;    wxSize sizeText(size), sizeBtn(size);    sizeBtn.x = GetBestSpinnerSize(IsVertical(style)).x / 2;    if ( sizeText.x == wxDefaultCoord )    {        // DEFAULT_ITEM_WIDTH is the default width for the text control        sizeText.x = DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN + sizeBtn.x;    }    sizeText.x -= sizeBtn.x + MARGIN_BETWEEN;    if ( sizeText.x <= 0 )    {        wxLogDebug(_T("not enough space for wxSpinCtrl!"));    }    wxPoint posBtn(pos);    posBtn.x += sizeText.x + MARGIN_BETWEEN;    // we need to turn '\n's into "\r\n"s for the multiline controls    wxString valueWin;    if ( m_windowStyle & wxTE_MULTILINE )    {        valueWin = wxTextFile::Translate(value, wxTextFileType_Dos);    }    else // single line    {        valueWin = value;    }    // we must create the list control before the spin button for the purpose    // of the dialog navigation: if there is a static text just before the spin    // control, activating it by Alt-letter should give focus to the text    // control, not the spin and the dialog navigation code will give focus to    // the next control (at Windows level), not the one after it    // create the text window    m_hwndBuddy = (WXHWND)::CreateWindowEx                    (                     exStyle,                // sunken border                     _T("EDIT"),             // window class                     valueWin,               // no window title                     msStyle,                // style (will be shown later)                     pos.x, pos.y,           // position                     0, 0,                   // size (will be set later)                     GetHwndOf(parent),      // parent                     (HMENU)-1,              // control id                     wxGetInstance(),        // app instance                     NULL                    // unused client data                    );    if ( !m_hwndBuddy )    {        wxLogLastError(wxT("CreateWindow(buddy text window)"));        return false;    }    // initialize wxControl    if ( !CreateControl(parent, id, posBtn, sizeBtn, style, validator, name) )        return false;    // now create the real HWND    WXDWORD spiner_style = WS_VISIBLE |                           UDS_ALIGNRIGHT |                           UDS_EXPANDABLE |                           UDS_NOSCROLL;    if ( !IsVertical(style) )        spiner_style |= UDS_HORZ;    if ( style & wxSP_WRAP )        spiner_style |= UDS_WRAP;    if ( !MSWCreateControl(UPDOWN_CLASS, spiner_style, posBtn, sizeBtn, _T(""), 0) )        return false;    // subclass the text ctrl to be able to intercept some events    wxSetWindowUserData(GetBuddyHwnd(), this);    m_wndProcBuddy = (WXFARPROC)wxSetWindowProc(GetBuddyHwnd(),                                                wxBuddyTextCtrlWndProc);    // set up fonts and colours  (This is nomally done in MSWCreateControl)    InheritAttributes();    if (!m_hasFont)        SetFont(GetDefaultAttributes().font);    // set the size of the text window - can do it only now, because we    // couldn't call DoGetBestSize() before as font wasn't set    if ( sizeText.y <= 0 )    {        int cx, cy;        wxGetCharSize(GetHWND(), &cx, &cy, GetFont());        sizeText.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy);    }    SetInitialSize(size);    (void)::ShowWindow(GetBuddyHwnd(), SW_SHOW);    // associate the list window with the spin button    (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)GetBuddyHwnd(), 0);    // do it after finishing with m_hwndBuddy creation to avoid generating    // initial wxEVT_COMMAND_TEXT_UPDATED message    ms_allTextSpins.Add(this);    return true;}// Make sure the window style (etc.) reflects the HWND style (roughly)void wxTextCtrl::AdoptAttributesFromHWND(){    wxWindow::AdoptAttributesFromHWND();    long style = ::GetWindowLong(GetBuddyHwnd(), GWL_STYLE);    if (style & ES_MULTILINE)        m_windowStyle |= wxTE_MULTILINE;    if (style & ES_PASSWORD)        m_windowStyle |= wxTE_PASSWORD;    if (style & ES_READONLY)        m_windowStyle |= wxTE_READONLY;    if (style & ES_WANTRETURN)        m_windowStyle |= wxTE_PROCESS_ENTER;    if (style & ES_CENTER)        m_windowStyle |= wxTE_CENTRE;    if (style & ES_RIGHT)        m_windowStyle |= wxTE_RIGHT;}WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const{    // we never have an external border    WXDWORD msStyle = wxControl::MSWGetStyle                      (                        (style & ~wxBORDER_MASK) | wxBORDER_NONE, exstyle                      );    msStyle |= WS_VISIBLE;    // styles which we alaways add by default    if ( style & wxTE_MULTILINE )    {        wxASSERT_MSG( !(style & wxTE_PROCESS_ENTER),                      wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") );        msStyle |= ES_MULTILINE | ES_WANTRETURN;        if ( !(style & wxTE_NO_VSCROLL) )        {            // always adjust the vertical scrollbar automatically if we have it            msStyle |= WS_VSCROLL | ES_AUTOVSCROLL;        }        style |= wxTE_PROCESS_ENTER;    }    else // !multiline    {        // there is really no reason to not have this style for single line        // text controls        msStyle |= ES_AUTOHSCROLL;    }    // note that wxTE_DONTWRAP is the same as wxHSCROLL so if we have a horz    // scrollbar, there is no wrapping -- which makes sense    if ( style & wxTE_DONTWRAP )    {        // automatically scroll the control horizontally as necessary        //        // NB: ES_AUTOHSCROLL is needed for richedit controls or they don't        //     show horz scrollbar at all, even in spite of WS_HSCROLL, and as        //     it doesn't seem to do any harm for plain edit controls, add it        //     always        msStyle |= WS_HSCROLL | ES_AUTOHSCROLL;    }    if ( style & wxTE_READONLY )        msStyle |= ES_READONLY;    if ( style & wxTE_PASSWORD )        msStyle |= ES_PASSWORD;    if ( style & wxTE_NOHIDESEL )        msStyle |= ES_NOHIDESEL;    // note that we can't do do "& wxTE_LEFT" as wxTE_LEFT == 0    if ( style & wxTE_CENTRE )        msStyle |= ES_CENTER;    else if ( style & wxTE_RIGHT )        msStyle |= ES_RIGHT;    else        msStyle |= ES_LEFT; // ES_LEFT is 0 as well but for consistency...    return msStyle;}// ----------------------------------------------------------------------------// set/get the controls text// ----------------------------------------------------------------------------wxString wxTextCtrl::GetValue() const{    // range 0..-1 is special for GetRange() and means to retrieve all text    return GetRange(0, -1);}wxString wxTextCtrl::GetRange(long from, long to) const{    wxString str;    if ( from >= to && to != -1 )    {        // nothing to retrieve        return str;    }    // retrieve all text    str = wxGetWindowText(GetBuddyHwnd());    // need only a range?    if ( from < to )    {        str = str.Mid(from, to - from);    }    // WM_GETTEXT uses standard DOS CR+LF (\r\n) convention - convert to the    // canonical one (same one as above) for consistency with the other kinds    // of controls and, more importantly, with the other ports    str = wxTextFile::Translate(str, wxTextFileType_Unix);    return str;}void wxTextCtrl::DoSetValue(const wxString& value, int flags){    // if the text is long enough, it's faster to just set it instead of first    // comparing it with the old one (chances are that it will be different    // anyhow, this comparison is there to avoid flicker for small single-line    // edit controls mostly)    if ( (value.length() > 0x400) || (value != GetValue()) )    {        DoWriteText(value, flags);

⌨️ 快捷键说明

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