attempts to implement non blinking caret - failed so far
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8396 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -51,23 +51,6 @@ public:
|
|||||||
virtual bool OnInit();
|
virtual bool OnInit();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Define a new frame type: this is going to be our main frame
|
|
||||||
class MyFrame : public wxFrame
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// ctor(s)
|
|
||||||
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
|
||||||
|
|
||||||
// event handlers (these functions should _not_ be virtual)
|
|
||||||
void OnQuit(wxCommandEvent& event);
|
|
||||||
void OnAbout(wxCommandEvent& event);
|
|
||||||
void OnSetBlinkTime(wxCommandEvent& event);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// any class wishing to process wxWindows events must use this macro
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
};
|
|
||||||
|
|
||||||
// MyCanvas is a canvas on which you can type
|
// MyCanvas is a canvas on which you can type
|
||||||
class MyCanvas: public wxScrolledWindow
|
class MyCanvas: public wxScrolledWindow
|
||||||
{
|
{
|
||||||
@@ -78,6 +61,10 @@ public:
|
|||||||
|
|
||||||
wxChar& CharAt(int x, int y) { return *(m_text + x + m_xChars * y); }
|
wxChar& CharAt(int x, int y) { return *(m_text + x + m_xChars * y); }
|
||||||
|
|
||||||
|
// operations
|
||||||
|
void CreateCaret();
|
||||||
|
void MoveCaret(int x, int y);
|
||||||
|
|
||||||
// caret movement
|
// caret movement
|
||||||
void Home() { m_xCaret = 0; }
|
void Home() { m_xCaret = 0; }
|
||||||
void End() { m_xCaret = m_xChars - 1; }
|
void End() { m_xCaret = m_xChars - 1; }
|
||||||
@@ -94,6 +81,9 @@ public:
|
|||||||
void OnChar( wxKeyEvent &event );
|
void OnChar( wxKeyEvent &event );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// move the caret to m_xCaret, m_yCaret
|
||||||
|
void DoMoveCaret();
|
||||||
|
|
||||||
wxFont m_font;
|
wxFont m_font;
|
||||||
|
|
||||||
// the margin around the text (looks nicer)
|
// the margin around the text (looks nicer)
|
||||||
@@ -115,6 +105,27 @@ private:
|
|||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Define a new frame type: this is going to be our main frame
|
||||||
|
class MyFrame : public wxFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// ctor(s)
|
||||||
|
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||||
|
|
||||||
|
// event handlers (these functions should _not_ be virtual)
|
||||||
|
void OnQuit(wxCommandEvent& event);
|
||||||
|
void OnAbout(wxCommandEvent& event);
|
||||||
|
void OnSetBlinkTime(wxCommandEvent& event);
|
||||||
|
void OnCaretMove(wxCommandEvent& event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
MyCanvas *m_canvas;
|
||||||
|
|
||||||
|
// any class wishing to process wxWindows events must use this macro
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// constants
|
// constants
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -126,6 +137,7 @@ enum
|
|||||||
Caret_Quit = 1,
|
Caret_Quit = 1,
|
||||||
Caret_About,
|
Caret_About,
|
||||||
Caret_SetBlinkTime,
|
Caret_SetBlinkTime,
|
||||||
|
Caret_Move,
|
||||||
|
|
||||||
// controls start here (the numbers are, of course, arbitrary)
|
// controls start here (the numbers are, of course, arbitrary)
|
||||||
Caret_Text = 1000
|
Caret_Text = 1000
|
||||||
@@ -142,6 +154,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
|||||||
EVT_MENU(Caret_Quit, MyFrame::OnQuit)
|
EVT_MENU(Caret_Quit, MyFrame::OnQuit)
|
||||||
EVT_MENU(Caret_About, MyFrame::OnAbout)
|
EVT_MENU(Caret_About, MyFrame::OnAbout)
|
||||||
EVT_MENU(Caret_SetBlinkTime, MyFrame::OnSetBlinkTime)
|
EVT_MENU(Caret_SetBlinkTime, MyFrame::OnSetBlinkTime)
|
||||||
|
EVT_MENU(Caret_Move, MyFrame::OnCaretMove)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
// Create a new application object: this macro will allow wxWindows to create
|
// Create a new application object: this macro will allow wxWindows to create
|
||||||
@@ -162,14 +175,11 @@ IMPLEMENT_APP(MyApp)
|
|||||||
// `Main program' equivalent: the program execution "starts" here
|
// `Main program' equivalent: the program execution "starts" here
|
||||||
bool MyApp::OnInit()
|
bool MyApp::OnInit()
|
||||||
{
|
{
|
||||||
// Create the main application window
|
// create and show the main application window
|
||||||
MyFrame *frame = new MyFrame("Caret wxWindows sample",
|
MyFrame *frame = new MyFrame("Caret wxWindows sample",
|
||||||
wxPoint(50, 50), wxSize(450, 340));
|
wxPoint(50, 50), wxSize(450, 340));
|
||||||
|
|
||||||
// Show it and tell the application that it's our main window
|
|
||||||
// @@@ what does it do exactly, in fact? is it necessary here?
|
|
||||||
frame->Show(TRUE);
|
frame->Show(TRUE);
|
||||||
SetTopWindow(frame);
|
|
||||||
|
|
||||||
// success: wxApp::OnRun() will be called which will enter the main message
|
// success: wxApp::OnRun() will be called which will enter the main message
|
||||||
// loop and the application will run. If we returned FALSE here, the
|
// loop and the application will run. If we returned FALSE here, the
|
||||||
@@ -192,6 +202,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
|||||||
wxMenu *menuFile = new wxMenu;
|
wxMenu *menuFile = new wxMenu;
|
||||||
|
|
||||||
menuFile->Append(Caret_SetBlinkTime, "&Blink time...\tCtrl-B");
|
menuFile->Append(Caret_SetBlinkTime, "&Blink time...\tCtrl-B");
|
||||||
|
menuFile->Append(Caret_Move, "&Move caret\tCtrl-C");
|
||||||
menuFile->AppendSeparator();
|
menuFile->AppendSeparator();
|
||||||
menuFile->Append(Caret_About, "&About...\tCtrl-A", "Show about dialog");
|
menuFile->Append(Caret_About, "&About...\tCtrl-A", "Show about dialog");
|
||||||
menuFile->AppendSeparator();
|
menuFile->AppendSeparator();
|
||||||
@@ -204,7 +215,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
|||||||
// ... and attach this menu bar to the frame
|
// ... and attach this menu bar to the frame
|
||||||
SetMenuBar(menuBar);
|
SetMenuBar(menuBar);
|
||||||
|
|
||||||
(void) new MyCanvas( this );
|
m_canvas = new MyCanvas(this);
|
||||||
|
|
||||||
// create a status bar just for fun (by default with 1 pane only)
|
// create a status bar just for fun (by default with 1 pane only)
|
||||||
CreateStatusBar(2);
|
CreateStatusBar(2);
|
||||||
@@ -226,6 +237,11 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
|||||||
_T("About Caret"), wxOK | wxICON_INFORMATION, this);
|
_T("About Caret"), wxOK | wxICON_INFORMATION, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyFrame::OnCaretMove(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
m_canvas->MoveCaret(10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
void MyFrame::OnSetBlinkTime(wxCommandEvent& WXUNUSED(event))
|
void MyFrame::OnSetBlinkTime(wxCommandEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
long blinkTime = wxGetNumberFromUser
|
long blinkTime = wxGetNumberFromUser
|
||||||
@@ -239,6 +255,7 @@ void MyFrame::OnSetBlinkTime(wxCommandEvent& WXUNUSED(event))
|
|||||||
if ( blinkTime != -1 )
|
if ( blinkTime != -1 )
|
||||||
{
|
{
|
||||||
wxCaret::SetBlinkTime((int)blinkTime);
|
wxCaret::SetBlinkTime((int)blinkTime);
|
||||||
|
m_canvas->CreateCaret();
|
||||||
wxLogStatus(this, _T("Blink time set to %ld milliseconds."), blinkTime);
|
wxLogStatus(this, _T("Blink time set to %ld milliseconds."), blinkTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -262,29 +279,52 @@ MyCanvas::MyCanvas( wxWindow *parent )
|
|||||||
{
|
{
|
||||||
m_text = (wxChar *)NULL;
|
m_text = (wxChar *)NULL;
|
||||||
|
|
||||||
SetBackgroundColour(* wxWHITE);
|
SetBackgroundColour(*wxWHITE);
|
||||||
|
|
||||||
m_font = *wxNORMAL_FONT;
|
m_font = wxFont(12, wxFONTFAMILY_TELETYPE,
|
||||||
|
wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
|
||||||
|
|
||||||
|
m_xCaret = m_yCaret =
|
||||||
|
m_xChars = m_yChars = 0;
|
||||||
|
|
||||||
|
m_xMargin = m_yMargin = 5;
|
||||||
|
|
||||||
|
CreateCaret();
|
||||||
|
}
|
||||||
|
|
||||||
|
MyCanvas::~MyCanvas()
|
||||||
|
{
|
||||||
|
free(m_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MyCanvas::CreateCaret()
|
||||||
|
{
|
||||||
wxClientDC dc(this);
|
wxClientDC dc(this);
|
||||||
dc.SetFont( m_font );
|
dc.SetFont(m_font);
|
||||||
m_heightChar = dc.GetCharHeight();
|
m_heightChar = dc.GetCharHeight();
|
||||||
m_widthChar = dc.GetCharWidth();
|
m_widthChar = dc.GetCharWidth();
|
||||||
|
|
||||||
wxCaret *caret = new wxCaret(this, m_widthChar, m_heightChar);
|
wxCaret *caret = new wxCaret(this, m_widthChar, m_heightChar);
|
||||||
SetCaret(caret);
|
SetCaret(caret);
|
||||||
|
|
||||||
m_xCaret = m_yCaret =
|
|
||||||
m_xChars = m_yChars = 0;
|
|
||||||
|
|
||||||
m_xMargin = m_yMargin = 5;
|
|
||||||
caret->Move(m_xMargin, m_yMargin);
|
caret->Move(m_xMargin, m_yMargin);
|
||||||
caret->Show();
|
caret->Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
MyCanvas::~MyCanvas()
|
void MyCanvas::MoveCaret(int x, int y)
|
||||||
{
|
{
|
||||||
free(m_text);
|
m_xCaret = x;
|
||||||
|
m_yCaret = y;
|
||||||
|
|
||||||
|
DoMoveCaret();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MyCanvas::DoMoveCaret()
|
||||||
|
{
|
||||||
|
wxLogStatus(_T("Caret is at (%d, %d)"), m_xCaret, m_yCaret);
|
||||||
|
|
||||||
|
GetCaret()->Move(m_xMargin + m_xCaret * m_widthChar,
|
||||||
|
m_yMargin + m_yCaret * m_heightChar);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyCanvas::OnSize( wxSizeEvent &event )
|
void MyCanvas::OnSize( wxSizeEvent &event )
|
||||||
@@ -342,6 +382,8 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
|||||||
|
|
||||||
void MyCanvas::OnChar( wxKeyEvent &event )
|
void MyCanvas::OnChar( wxKeyEvent &event )
|
||||||
{
|
{
|
||||||
|
bool refresh = FALSE;
|
||||||
|
|
||||||
switch ( event.KeyCode() )
|
switch ( event.KeyCode() )
|
||||||
{
|
{
|
||||||
case WXK_LEFT:
|
case WXK_LEFT:
|
||||||
@@ -378,21 +420,18 @@ void MyCanvas::OnChar( wxKeyEvent &event )
|
|||||||
{
|
{
|
||||||
CharAt(m_xCaret, m_yCaret) = (wxChar)event.KeyCode();
|
CharAt(m_xCaret, m_yCaret) = (wxChar)event.KeyCode();
|
||||||
NextChar();
|
NextChar();
|
||||||
|
|
||||||
|
refresh = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
event.Skip();
|
event.Skip();
|
||||||
|
|
||||||
// don't refresh
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxLogStatus(_T("Caret is at (%d, %d)"), m_xCaret, m_yCaret);
|
DoMoveCaret();
|
||||||
|
|
||||||
GetCaret()->Move(m_xMargin + m_xCaret * m_widthChar,
|
|
||||||
m_yMargin + m_yCaret * m_heightChar);
|
|
||||||
|
|
||||||
|
if ( refresh )
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -28,6 +28,8 @@
|
|||||||
#pragma hdrstop
|
#pragma hdrstop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_CARET
|
||||||
|
|
||||||
#ifndef WX_PRECOMP
|
#ifndef WX_PRECOMP
|
||||||
#include "wx/window.h"
|
#include "wx/window.h"
|
||||||
#include "wx/dcclient.h"
|
#include "wx/dcclient.h"
|
||||||
@@ -96,6 +98,7 @@ wxCaret::~wxCaret()
|
|||||||
if ( IsVisible() )
|
if ( IsVisible() )
|
||||||
{
|
{
|
||||||
// stop blinking
|
// stop blinking
|
||||||
|
if ( m_timer.IsRunning() )
|
||||||
m_timer.Stop();
|
m_timer.Stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,7 +109,9 @@ wxCaret::~wxCaret()
|
|||||||
|
|
||||||
void wxCaret::DoShow()
|
void wxCaret::DoShow()
|
||||||
{
|
{
|
||||||
m_timer.Start(GetBlinkTime());
|
int blinkTime = GetBlinkTime();
|
||||||
|
if ( blinkTime )
|
||||||
|
m_timer.Start(blinkTime);
|
||||||
|
|
||||||
m_blinkedOut = TRUE;
|
m_blinkedOut = TRUE;
|
||||||
Blink();
|
Blink();
|
||||||
@@ -124,11 +129,20 @@ void wxCaret::DoHide()
|
|||||||
|
|
||||||
void wxCaret::DoMove()
|
void wxCaret::DoMove()
|
||||||
{
|
{
|
||||||
if ( IsVisible() && !m_blinkedOut )
|
if ( IsVisible() )
|
||||||
{
|
{
|
||||||
|
if ( !m_blinkedOut )
|
||||||
|
{
|
||||||
|
// hide it right now and it will be shown the next time it blinks
|
||||||
|
// unless it should be shown all the time in which case just show
|
||||||
|
// it at the new position
|
||||||
|
if ( m_timer.IsRunning() )
|
||||||
Blink();
|
Blink();
|
||||||
|
else
|
||||||
|
Refresh();
|
||||||
}
|
}
|
||||||
//else: will be shown at the correct location next time it blinks
|
}
|
||||||
|
//else: will be shown at the correct location when it is shown
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -205,3 +219,5 @@ void wxCaret::DoDraw(wxDC *dc)
|
|||||||
dc->DrawRectangle( m_x, m_y, m_width, m_height );
|
dc->DrawRectangle( m_x, m_y, m_width, m_height );
|
||||||
#endif // 0/1
|
#endif // 0/1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // wxUSE_CARET
|
||||||
|
Reference in New Issue
Block a user