Cursor is not changing to HOURGLASS
vempati@wiproge.med.ge.com
Monday, January 29, 1996
HI All,
I am using VC++ 1.0, MFC 2.0 and Windows 3.1.
My project is Client-Server based application. I am using WINSOCK.DLL for the
functions like send and recv. I am writing Client application.
As soon as I send some request to server I wanted to change my cursor shape
to hourglass till I get the response from server.
I tried in the following two ways:
1. hCursorSave = SetCursor((LoadCursor(NULL, IDC_WAIT));
send(.....) // send request to server
...... // wait till you get data from server(while loop)
// Here I want's to change the cursor position to hour glass
recv(....)
SetCursor(hCursorSave);
2. BegineWaitCursor();
send(...)
...... // wait till you get data from server(while loop)
// Here I want's to change the cursor position to hour glass
recv(....)
EndWaitCursor().
In both ways I am not getting the hourglass shape.
The cursor shape is changing into hourglass shape and disappearing Immediately.
As soon as the program flow reaches to send the hourglass shape is getting
disappearing.(means coming to normal shape).
Will the send cuase any problem to cursor shape? Where I am doing wrong?
Any other methods are there to change my cursor position to hourglass?
Please help me in coming out of this problem?
Thanks in advance.
Regards,
Venkateswarlu
----------------------------------------------------------------------------
Venkateswarlu Vempati Tel : (91)-80-5263121
Senior Design Engineer extn:265, 266.
Wipro GE Medical Systems
A-1, Golden Enclave
Airport road
Bangalore - 560 017 INDIA
e-mail : vempati@wiproge.med.ge.com
---------------------------------------------------------------------------
Roger Lamb RAS+ 95 -- rasplus@lambsoftware.com
Monday, January 29, 1996
[Mini-digest: 8 responses]
I had this problem also... the first call to CWinApp::OnIdle() will blow
away your effort to draw a hourglass..
I setup a member variable in my FrameWindow m_bCursorOn which would get set
to TRUE when you want to show an hourglass...
Then override CWnd::OnSetCursor
BOOL CMyFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(!m_bCursorOn)
{
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
return 1;
}
return CMDIChildWnd::OnSetCursor(pWnd, nHitTest, message);
}
Seemed to work ok then with no flash.
Sincerely,
Roger C. Lamb Jr.
Lamb Software Inc.
Email: rasplus@lambsoftware.com
Upates: http://www.lambsoftware.com
-----From: Dicky Singh
Add a handler for WM_SETCURSOR and modify the code as follows,
set/reset m_bShowingStandardCursor elsewhere as required.
BOOL CWorkspaceView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT iMsg)
{
if (m_bShowingStandardCursor)
return CView::OnSetCursor(pWnd, nHitTest, iMsg);
CApp *pApp=(CApp *)AfxGetApp();
ASSERT(pApp);
::SetCursor(pApp->LoadStandardCursor(IDC_WAIT));
return TRUE; // remember to return TRUE
}
-Dicky
PS Should work with MFC 2.0. Can't say for sure.
------------------------------
// Dicky
// Dicky@Landmark.com
-----From: Mike Lainhart
Are you setting a breakpoint in that area? I've done the same thing and
thought it wasn't working, but it was the debugger that had changed the
cursor back.
> Will the send cuase any problem to cursor shape? Where I am doing wrong?
> Any other methods are there to change my cursor position to hourglass?
I'm sure a lot of people have better answers about your cursor problem, but
I wanted to mention another issue that arose for me when doing winsock
programming and using the debugger. Don't do it! The network just keeps on
going while you've stopped in the debugger; I believe that buffers get full
and the communication hangs up totally and does not GO when you say so in
the debugger. If someone knows a way around this I would sure like to hear
about it.
Mike__
-----From: Ron Birk
Hi there,
> My project is Client-Server based application. I am using WINSOCK.DLL
for
> the functions like send and recv. I am writing Client application.
>
> As soon as I send some request to server I wanted to change my cursor
shape
> to hourglass till I get the response from server.
> ...
The problem is that strange things happens when using winsock routines send
and recv. As win31 have coopretaive multitasking, the winsock routines will
switch process while waiting for results. This will cause another "thread"
running in the background. This "thread" will notice, hey whats going on,
the cursor of this window should be a regular arrow, lets change it back.
What I did is to set a flag when the hourglass should be on, and in
OnSetCursor() do a RestoreWaitCursor() when the flag is on. You will also
have to take care of reentrancy in your code, because of this new "thread".
Ron
--
/\/\ Ron Birk Email: rbirk@ctp.com
/ /_ \ Horizontal Solutions Tel: +46 8 744 6119
\ / / Cambridge Technology Partners Fax: +46 8 744 9933
\/\/ Stockholm, Sweden Voicemail: +1 617 374 2081
-----From: CShafer
Venkateswarlu,
Try CWinApp::DoWaitCursor or the wait cursor class CWaitCursor.
Not sure if these exist in MFC 2.0 but this should put you on
the right trail.
-----From: kitk@mudshark.sunquest.com (Kit Kauffmann)
Yes: WinSock apparently uses SendMessage or other calls which give Windows a
chance to get in there and change the cursor. The best you can do is give
your window a temporary cursor change with ON_WM_SETCURSOR and code like:
BOOL YourMainWindow::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if( YouWantAnHourglass )
{
::SetCursor( ::LoadCursor( NULL, IDC_WAIT ) );
return TRUE;
}
else
return CFrameWnd::OnSetCursor( pWnd, nHitTest, message );
}
HTH!
-----From: Ludek Slegr
Hi,
We had the problem too. The cause is "too clever" implementation of the
windows sockets under 16-bit Windows. The blocking operations can
theoretically last quite long - at least from the user's point of view.
Therefore it is not desired to leave all Windows disabled, which would with
16-bit Windows definetely happen. So, while you are waiting for a blocking
sockets call, window messages are still processed and the functionality of
the wait cursor is voided. Our solution was to implement a hook as described
in the description of windows sockets (for example MSDL CD).
Hope it helps.
Regards,
Ludek
-----From: Seth Goldstein
I had a similar problem with the hourglass when using DDE.
The problem had to do with DDE starting up its own message
loop (and hidden window?, memory fails...) which would take
over the cursor.
The workaround for us was to wrap the send and receive calls
with SetCapture and ReleaseCapture.
Side note: the safest way to do this is to make a class whose
constructor does the Set and destructor does the Release, then
allocate one of those suckers on the stack.
Hope this helps,
Seth
--
+------------------------------------------------------+
| Seth Goldstein email: seth@mathworks.com |
| The Mathworks, Inc. http://www.mathworks.com |
| info: info@mathworks.com |
|------------------------------------------------------|
| PGP Public Key on server |
| http://www-swiss.ai.mit.edu/~bal/pks-toplev.html |
+------------------------------------------------------+
Timothy Purves -- tpurves@noc.hfh.edu
Friday, February 02, 1996
We had this problem in one of our apps, and I solved it with the following code.
In the app class.
class CTheApp : public CWinApp
{
...
public:
// the following uses an undocumented member of CWinApp (works for MFC
2.x-MFC 4.0)
int GetWaitCursorCount() { return m_nWaitCursorCount; }
};
#define TheApp ((CTheApp*)AfxGetApp())
In the Frame class.
BOOL CTheAppFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// if in a wait condition, restore the wait cursor
if(TheApp->GetWaitCursorCount() > 0)
{
AfxGetApp()->RestoreWaitCursor();
return TRUE;
}
return CMDIFrameWnd::OnSetCursor(pWnd, nHitTest, message);
}
A helper class.
#ifndef WIN32
class CWaitCursor
{
public:
CWaitCursor()
{ AfxGetApp()->BeginWaitCursor(); }
~CWaitCursor()
{ AfxGetApp()->EndWaitCursor(); }
void Restore()
{ AfxGetApp()->RestoreWaitCursor(); }
};
#endif
And to use....
CWaitCursor wait;
-tim
---------------------------------------------------
Timothy Purves tpurves@noc.hfh.edu
Lead Programmer Analyst
Henry Ford Health System
Rochester Hills, MI
USA
| Вернуться в корень Архива
|