|
I did this with an application wide keyboard and mouse hook. Let me see if I can dig up the code.
class CActivity
{
public:
CActivity();
virtual ~CActivity();
public:
static DWORD GetLastActivity();
static void SetLastActivity(DWORD dwActivity);
public:
static DWORD m_dwLastActivity;
static HANDLE m_hMutex;
};
extern CActivity g_Activity;
template<BYTE nID>
class CInactivityHook
{
public:
CInactivityHook();
virtual ~CInactivityHook();
public:
BOOL Start(DWORD dwThreadID);
BOOL Stop();
protected:
static LRESULT CALLBACK MyKeyHookFunc(int code, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK MyMouHookFunc(int code, WPARAM wParam, LPARAM lParam);
protected:
static HHOOK m_hMyKeyHook;
static HHOOK m_hMyMouseHook;
};
template<BYTE nID>
HHOOK CInactivityHook<nID>::m_hMyKeyHook=NULL;
template<BYTE nID>
HHOOK CInactivityHook<nID>::m_hMyMouseHook=NULL;
template<BYTE nID>
CInactivityHook<nID>::CInactivityHook()
{
g_Activity.SetLastActivity(::GetCurrentTime());
m_hMyKeyHook=0;
m_hMyMouseHook=0;
}
template<BYTE nID>
CInactivityHook<nID>::~CInactivityHook()
{
Stop();
}
template<BYTE nID>
CInactivityHook<nID>::Stop()
{
if ( m_hMyKeyHook) {
UnhookWindowsHookEx( m_hMyKeyHook );
m_hMyKeyHook = NULL;
}
if ( m_hMyMouseHook) {
UnhookWindowsHookEx( m_hMyMouseHook );
m_hMyMouseHook = NULL;
}
return TRUE;
}
template<BYTE nID>
CInactivityHook<nID>::Start(DWORD dwThreadID)
{
if ( !m_hMyKeyHook) {
m_hMyKeyHook= SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)MyKeyHookFunc, AfxGetInstanceHandle(),
(DWORD)dwThreadID);
}
if ( !m_hMyMouseHook) {
m_hMyMouseHook= SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MyMouHookFunc, AfxGetInstanceHandle(),
(DWORD)dwThreadID);
}
return TRUE;
}
template<BYTE nID>
LRESULT CALLBACK CInactivityHook<nID>::MyKeyHookFunc(int code, WPARAM wParam, LPARAM lParam)
{
CActivity::SetLastActivity(::GetCurrentTime());
return CallNextHookEx( m_hMyKeyHook, code, wParam, lParam);
}
template<BYTE nID>
LRESULT CALLBACK CInactivityHook<nID>::MyMouHookFunc(int code, WPARAM wParam, LPARAM lParam)
{
CActivity::SetLastActivity(::GetCurrentTime());
return CallNextHookEx( m_hMyMouseHook, code, wParam, lParam);
}
///////
// now in my cview
CInactivityHook<0> CommonViewInactivity;
void CCommonView::EnableInactivityHook( BOOL fEnable )
{
CommonViewInactivity.Start(::GetCurrentThreadId());
SetTimer(DONE_DIGITIZING_TIMER,1000,NULL);
CActivity::SetLastActivity(::GetCurrentTime());
}
void CCommonView::OnTimer(UINT nIDEvent)
{
if ( nIDEvent == DONE_DIGITIZING_TIMER) {
// calculate difference between current time and time stored in CActivity::GetLastActivity();
}
}
John
|
|
|
|
|
Think about writing an article for it
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Thanks. I have very little free time at the moment...
John
|
|
|
|
|
(maybe not the right wording )
(porting from C to C++)
I have a few enum lying around in the global namespace, I was wondering how can I qualify them ?
for example I have a line style enum that I want to "qualify" for example instead of just writing
myline->style = dashed;
I would like something like
myline->style = LineStyle::dashed;
What's the best way ?
Thanks.
Maximilien Lincourt
"Never underestimate the bandwidth of a station wagon filled with backup tapes." ("Computer Networks" by Andrew S Tannenbaum )
|
|
|
|
|
How is dashed defined?
Like this?
enum { dashed = 0, solid = 1};
Cause I believe you can do something like:
enum LineStyle { dashed = 0, solid = 1};
myline->style = LineStyle::dashed;
-Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|
|
Nathan Blomquist wrote:
enum LineStyle { dashed = 0, solid = 1};
myline->style = LineStyle::dashed;
Unfortunately that doesn't work.
This does though:
struct LineStyle
{
enum {
dashed = 0,
solid
};
};
|
|
|
|
|
Or you could put it in a namespace as below:
namespace LineStyle
{
enum {dashed = 0,solid};
};
I prefer to qualify it because most times the name is not unique enough that I will worry about a clash.
John
|
|
|
|
|
Yes, namespacewould be more appropriate for this task than using struct. I've never been in the habit of using the namespace keyword; its existence slipped my mind. I may have to start using it...
|
|
|
|
|
Nathan Blomquist wrote:
enum LineStyle { dashed = 0, solid = 1};
Yes, but I get compilation errors
enum LineStyleType
{
NoStyle = -1,
Center = 0,
Dot,
Dash,
MaxLineStyle
};
curve->style = LineStyleType::Dot;
D:\mmb\ver300\build_IT\mbConstructLine.cpp(613) : error C2039: 'Dot' : is not a member of 'LineStyleType'<br />
../lib\include/coreconst.h(266) : see declaration of 'LineStyleType'
Thanks.
Maximilien Lincourt
"Never underestimate the bandwidth of a station wagon filled with backup tapes." ("Computer Networks" by Andrew S Tannenbaum )
|
|
|
|
|
That's because the scope resolution operator - :: - is not used to dereference into an instance type. You can either use a namespace or (more appropriately) define the enum as static.
Cheers,
Tom Archer
Inside C#, Extending MFC Applications with the .NET Framework
It's better to listen to others than to speak, because I already know what I'm going to say anyway. - friend of Jörgen Sigvardsson
|
|
|
|
|
Cool thanks... Always good to be corrected and informed.
Thanks,
Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|
|
|
make the enum static
static enum LineStyle { ... }
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
hello ppl
ok this question is going to be a pretty long one what i want to do this time is display a BMP image which is in 24 bit format the normal operation like creating a compatible device content and using BitBlt is not the solution so what do i have to do also i want to display a GIF image which is actually in 89a format that supports animation so how do i display an animated GIF any code or anything would be appreciated
regards
Ahmed Ajmal
|
|
|
|
|
|
|
I'm using VC6, and created an MFC app through the app wizard selecting the Internet Explorer ReBars option. This puts a CDialogBar in the CMainFrame class.
Using the resource editor I added an Edit control and a button to the dialogbar, named IDC_EDIT and IDC_BTN.
I added a command message through the class wizard that maps the button to an OnBtn method in CMainFrame. I put a breakpoint in the method, and when I press the button, the app stops at the breakpoint.
So, how do I call CMyView::OnViewBtn() in my view class from the CMainFrame::OnBtn() method?
Thanks.
David Hisel -- http://www.hisel.com/
|
|
|
|
|
CMyView* pView = (CMyView*)GetActiveView();
if(pView)
pView->OnViewBtn();
That should work..
Rob
Whoever said nothing's impossible never tried slamming a revolving door!
|
|
|
|
|
Nope, it doesn't seem to work. Here is what I have:
void CMainFrame::OnBtn() <br />
{<br />
CMyView* pView = (CMyView*)GetActiveView();<br />
if (pView)<br />
pView->OnViewBtn();<br />
}<br />
pView is NULL every time I press the button, hence, no call to OnViewBtn().
Is there a way to send a message to the view class? Would that work?
David Hisel -- http://www.hisel.com/
|
|
|
|
|
Hi,
I've SDI application I start with SW_MAXIMIZE parameter passed to CFrameWnd::ShowWindow(). But I absolutely don't like that while the window is appearing on the screen, user can see its repainting progress (two ListViews changing their size, toolbar changing its size etc..). And it looks very ugly.
Is there any way how to get rid of this? For example Visual C++ has very nice repainting when changing size/maximizing - there are no "intermediate stages" of repainting progress that could be seen by user.
I think there must be some way how to do it - let all parts of application window (toolbars, views, ....) to find out their dimensions and placement BUT don't show main window untill this all is done!
Hope someone will understand my problem...
Thank you for any suggestion.
|
|
|
|
|
There are 3 things to look at wrt window repainting/flickering :
1. WM_ERASEBKGND - if you are drawing the control and repaint the entire area in your WM_PAINT handler then don't do anything in WM_ERASEBKGND (and return 1). This avoids flicker caused by WM_ERASEBKGND filling control with background color then WM_PAINT painting actual control detail.
2. Again, if you are painting the control, then think about rendering the control to a bitmap then bliting the bitmap to the screen.
3. If you need to reposition a number of windows at once try using BeginDeferWindowPos(), DeferWindowPos(), and EndDeferWindowPos(). This is usefull for splitter windows.
4. (ok, 4 things to look at) For initial display you could create all windows hidden, position them, then make them all visible. Another way is to create main window offscreen then when children have adjusted their sizes, move main window onscreen.
...cmk
Save the whales - collect the whole set
|
|
|
|
|
The window class is handling that for you. If you are using MFC, window classes are generally hidden from you. The flags you want to change are CS_HREDRAW and CS_VREDRAW. These flags tell windows to repaint the window when it changes size.
At least I think that is the case.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
|
Hi
I've been programming for about 4 years in C++ for fun, and I never really cared about that question. But now I'd like to know: What is "C" exactly, and what's the difference to "C++"? Is there any border? If I use functions like strlen, strcpy, strcat , fopen, fread, fwrite and use char s instead of std::string , do I program in "C" or "C++"? And what, if my program uses the Windows API?
Could someone explain to me, or give me some links that cover this question in detail?
thanks in advance
modified 12-Sep-18 21:01pm.
|
|
|
|
|
That's a tough question to answer in a short amount of space.
Here goes:
The main difference between C and C++ is that C++ has support for classes whereas C only supports structs. Because of this, a vast number of libraries/extensions are not available for use in C. This includes STL and MFC amongst others.
strlen, strcpy, strcat, fread, fwrite and char were all available in C. Obviously, the standard namespace was not. There are some language differences too, depending on the compiler, you can only declare variables in C at the beginning of you function. You can probably search Google for a complete list of syntactic differences.
Most of the Windows API should work in C as far as I know.
Personally, I prefer C - mainly for its purity, although I have been known to be a bit strange.
|
|
|
|