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();
|
||||
};
|
||||
|
||||
// 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
|
||||
class MyCanvas: public wxScrolledWindow
|
||||
{
|
||||
@@ -78,6 +61,10 @@ public:
|
||||
|
||||
wxChar& CharAt(int x, int y) { return *(m_text + x + m_xChars * y); }
|
||||
|
||||
// operations
|
||||
void CreateCaret();
|
||||
void MoveCaret(int x, int y);
|
||||
|
||||
// caret movement
|
||||
void Home() { m_xCaret = 0; }
|
||||
void End() { m_xCaret = m_xChars - 1; }
|
||||
@@ -94,6 +81,9 @@ public:
|
||||
void OnChar( wxKeyEvent &event );
|
||||
|
||||
private:
|
||||
// move the caret to m_xCaret, m_yCaret
|
||||
void DoMoveCaret();
|
||||
|
||||
wxFont m_font;
|
||||
|
||||
// the margin around the text (looks nicer)
|
||||
@@ -115,6 +105,27 @@ private:
|
||||
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
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -126,6 +137,7 @@ enum
|
||||
Caret_Quit = 1,
|
||||
Caret_About,
|
||||
Caret_SetBlinkTime,
|
||||
Caret_Move,
|
||||
|
||||
// controls start here (the numbers are, of course, arbitrary)
|
||||
Caret_Text = 1000
|
||||
@@ -142,6 +154,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(Caret_Quit, MyFrame::OnQuit)
|
||||
EVT_MENU(Caret_About, MyFrame::OnAbout)
|
||||
EVT_MENU(Caret_SetBlinkTime, MyFrame::OnSetBlinkTime)
|
||||
EVT_MENU(Caret_Move, MyFrame::OnCaretMove)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// 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
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
// Create the main application window
|
||||
// create and show the main application window
|
||||
MyFrame *frame = new MyFrame("Caret wxWindows sample",
|
||||
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);
|
||||
SetTopWindow(frame);
|
||||
|
||||
// success: wxApp::OnRun() will be called which will enter the main message
|
||||
// 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;
|
||||
|
||||
menuFile->Append(Caret_SetBlinkTime, "&Blink time...\tCtrl-B");
|
||||
menuFile->Append(Caret_Move, "&Move caret\tCtrl-C");
|
||||
menuFile->AppendSeparator();
|
||||
menuFile->Append(Caret_About, "&About...\tCtrl-A", "Show about dialog");
|
||||
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
|
||||
SetMenuBar(menuBar);
|
||||
|
||||
(void) new MyCanvas( this );
|
||||
m_canvas = new MyCanvas(this);
|
||||
|
||||
// create a status bar just for fun (by default with 1 pane only)
|
||||
CreateStatusBar(2);
|
||||
@@ -226,6 +237,11 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
_T("About Caret"), wxOK | wxICON_INFORMATION, this);
|
||||
}
|
||||
|
||||
void MyFrame::OnCaretMove(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
m_canvas->MoveCaret(10, 10);
|
||||
}
|
||||
|
||||
void MyFrame::OnSetBlinkTime(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
long blinkTime = wxGetNumberFromUser
|
||||
@@ -239,6 +255,7 @@ void MyFrame::OnSetBlinkTime(wxCommandEvent& WXUNUSED(event))
|
||||
if ( blinkTime != -1 )
|
||||
{
|
||||
wxCaret::SetBlinkTime((int)blinkTime);
|
||||
m_canvas->CreateCaret();
|
||||
wxLogStatus(this, _T("Blink time set to %ld milliseconds."), blinkTime);
|
||||
}
|
||||
}
|
||||
@@ -262,29 +279,52 @@ MyCanvas::MyCanvas( wxWindow *parent )
|
||||
{
|
||||
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);
|
||||
dc.SetFont( m_font );
|
||||
dc.SetFont(m_font);
|
||||
m_heightChar = dc.GetCharHeight();
|
||||
m_widthChar = dc.GetCharWidth();
|
||||
|
||||
wxCaret *caret = new wxCaret(this, m_widthChar, m_heightChar);
|
||||
SetCaret(caret);
|
||||
|
||||
m_xCaret = m_yCaret =
|
||||
m_xChars = m_yChars = 0;
|
||||
|
||||
m_xMargin = m_yMargin = 5;
|
||||
caret->Move(m_xMargin, m_yMargin);
|
||||
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 )
|
||||
@@ -342,6 +382,8 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
||||
|
||||
void MyCanvas::OnChar( wxKeyEvent &event )
|
||||
{
|
||||
bool refresh = FALSE;
|
||||
|
||||
switch ( event.KeyCode() )
|
||||
{
|
||||
case WXK_LEFT:
|
||||
@@ -378,21 +420,18 @@ void MyCanvas::OnChar( wxKeyEvent &event )
|
||||
{
|
||||
CharAt(m_xCaret, m_yCaret) = (wxChar)event.KeyCode();
|
||||
NextChar();
|
||||
|
||||
refresh = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
|
||||
Refresh();
|
||||
if ( refresh )
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
@@ -28,6 +28,8 @@
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#if wxUSE_CARET
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/window.h"
|
||||
#include "wx/dcclient.h"
|
||||
@@ -96,7 +98,8 @@ wxCaret::~wxCaret()
|
||||
if ( IsVisible() )
|
||||
{
|
||||
// stop blinking
|
||||
m_timer.Stop();
|
||||
if ( m_timer.IsRunning() )
|
||||
m_timer.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,7 +109,9 @@ wxCaret::~wxCaret()
|
||||
|
||||
void wxCaret::DoShow()
|
||||
{
|
||||
m_timer.Start(GetBlinkTime());
|
||||
int blinkTime = GetBlinkTime();
|
||||
if ( blinkTime )
|
||||
m_timer.Start(blinkTime);
|
||||
|
||||
m_blinkedOut = TRUE;
|
||||
Blink();
|
||||
@@ -124,11 +129,20 @@ void wxCaret::DoHide()
|
||||
|
||||
void wxCaret::DoMove()
|
||||
{
|
||||
if ( IsVisible() && !m_blinkedOut )
|
||||
if ( IsVisible() )
|
||||
{
|
||||
Blink();
|
||||
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();
|
||||
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 );
|
||||
#endif // 0/1
|
||||
}
|
||||
|
||||
#endif // wxUSE_CARET
|
||||
|
Reference in New Issue
Block a user