[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1278
  • Last Modified:

How Blinking Text IN MFC on CDC

I am using the CDC Class from the MFC class library and the
 associated Textout() function to display text on the screen.
 Is there any way of making the text blink?

0
yogesh28577
Asked:
yogesh28577
  • 6
  • 4
1 Solution
 
bastibartelCommented:

Add a message handler for the WM_TIMER message (class wizard)
Launch the timer in OnInitDialog

#define ID_MY_BLINKER (WM_USER+1)

BOOL CMyClass::OnInitiDialog()
{
   /* ...*/
   SetTimer(ID_MY_BLINKER, 1000, NULL);  // blink every 1000 ms
}

void CMyClass::OnTimer(UINT nIDEvent)
{
             if (nIDEvent == ID_MY_BLINKER)
             {
                  static bool IsOn = true;
                  IsOn ^= true;              // toggle true/false;

                  DCD *dc = GetDC();

                  if (IsOn´)
                      dc->TextOut("hello", ...
                   else
                      dc->TextOut("world", ...
                 
                    ReleaseDC(dc);
               }
               else
                   CDialog::OnTimer(nIDEvent)
}

Excuse any syntax errors - cannot compile on this machine
Cheers Sebastian
0
 
yogesh28577Author Commented:
i got solution on my problem
first define two timer
#define IDT_WINDOW_TIMER_1 100
#define IDT_WINDOW_TIMER_2 101

in paint events add following lines
void CChildView::OnPaint()
{
CPaintDC dc(this);

SetTimer(IDT_WINDOW_TIMER_1, 50, NULL);      
}
add following code to ontimer

void CChildView::OnTimer(UINT nIDEvent)
 {
CClientDC dc(this);

 switch(nIDEvent)
 {

 case  IDT_WINDOW_TIMER_1:

      
      str="Yogesh Shrikhande ";
      
            dc.TextOut ( 200, 100, str) ;
            
KillTimer(IDT_WINDOW_TIMER_1);
       SetTimer(IDT_WINDOW_TIMER_2, 50, NULL);      



break;
case      IDT_WINDOW_TIMER_2:

int l;
l=str.GetLength();       
s.Format("%d",l) ;
str.Empty();
for (int i=0;i<=l*2;i++)
str=str+" ";
dc.TextOut ( 200, 100,str) ;
KillTimer(IDT_WINDOW_TIMER_2);
SetTimer(IDT_WINDOW_TIMER_1, 100, NULL);

 }
CWnd::OnTimer(nIDEvent);
 }

in this text are blinking on disp device
0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
bastibartelCommented:
That's my code .. only a bit longer ;-)
You should call ReleaseDC() after using the dc.
Maybe it's better to set the timer in CWnd::OnCreate() - as it is, it will restart on every WM_PAINT notification

Cheers,
Sebastian
0
 
bastibartelCommented:
Hi yogesh28577

Do you have any more questions on the code ?
and did you think of the ReleaseDC() ?

If you have no more comments you should finalize the question.

Cheers,
Sebastian
0
 
yogesh28577Author Commented:
hi bastibartel
plz tell me how to use ReleaseDc()
in my program

i have also another method with out using timer but after some time it gives error


// ChildView.cpp : implementation of the CChildView class
//

#include "stdafx.h"
#include "Rotating.h"
#include "ChildView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CString str;

/////////////////////////////////////////////////////////////////////////////
// CChildView

CChildView::CChildView()
{
}

CChildView::~CChildView()
{
}


BEGIN_MESSAGE_MAP(CChildView,CWnd )
      //{{AFX_MSG_MAP(CChildView)
      ON_WM_PAINT()      
      ON_WM_CREATE()
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CChildView message handlers



void CChildView::OnPaint()
{
CPaintDC dc(this);

disp();

}

void CChildView::disp()
 {

CClientDC dc(this);

str="Yogesh Shrikhande";
dc.TextOut ( 200, 100, str) ;
time1(.1);

disp1();

}
void CChildView::disp1()
{
CString s;
CClientDC dc(this);
int l;
l=str.GetLength();       
s.Format("%d",l) ;
str.Empty();
for (int i=0;i<=l*2;i++)
str=str+" ";
dc.TextOut ( 200, 100,str) ;
time1(.1);
disp();

 }
int CChildView::time1(int t)
{


  long initial,final;
  long ltime;

  initial=time(&ltime);
  final=initial+t;

  while (time(&ltime) < final);
  return 1;

}



0
 
bastibartelCommented:
Hi there,

Because you are now using CClientDC dc(this), there is no need for ReleaseDC() (my mistake!).
ReleaseDC() will be called when 'dc' is destroyed.

Otherwise it would be
DCD *dc = GetDC();
dc.SetText(...)
ReleaseDC(dc);   // free this DC so others can use it

But there are some other things:

1.
the call time1(.1) passes 0.1 to the time1 function, which converts to integer t=0.
So in time1(int t) the while-loop is never executed.

Instead use the Sleep function
Sleep(1000); waits 1000 milliseconds.

2.
In CChildView::OnPaint()

I guess disp() does the painting.
You should pass the dc to disp(), because it will need it to paint into. It's unneccessary to get yet another handle to the dc in disp().

Cheers,
Sebastian



 



 
0
 
bastibartelCommented:
Hello yogesh28577 ,

Do have any more questions ?.

Cheers,
Sebastia
0
 
yogesh28577Author Commented:
plz give me yahoo messager id i want to chat with u
0
 
bastibartelCommented:
Sorry I don't have an account there ...
Go ahead, ask me here at EE :-)

Cheers,
Sebastian
0
 
yogesh28577Author Commented:
ok
0

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

  • 6
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now