|
My MFC is a little rusty, but what I did was derive a new class from CButton, CMyButton which handles the WM_MOUSEMOVE event. OnMouseMove sends a custom message to it's parent, telling it that it's over the button. The parent (your dialog in this case), handles the custom message and set's the text of the static control appropriately.
A very crude example:
#define MYBTN_BUTTONHOVER WM_USER + 1000<br />
<br />
void CMyButton::OnMouseMove(UINT nFlags, CPoint point) <br />
{<br />
CButton::OnMouseMove(nFlags, point);<br />
<br />
GetParent()->SendMessage( MYBTN_BUTTONHOVER, (WPARAM) this->GetDlgCtrlID(), 0 );<br />
}<br />
And in your dialog class you'd have:
CStatic m_lblInfo;<br />
CMyButton m_btn2;<br />
CMyButton m_btn1;<br />
<br />
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)<br />
ON_MESSAGE( MYBTN_BUTTONHOVER, OnButtonHover )<br />
END_MESSAGE_MAP()<br />
<br />
void CMyDialog::OnButtonHover( WPARAM wParam, LPARAM lParam)<br />
{<br />
switch ( wParam )<br />
{<br />
case IDC_BUTTON1:<br />
m_lblInfo.SetWindowText( "This is button 1" );<br />
break;<br />
case IDC_BUTTON2:<br />
m_lblInfo.SetWindowText( "This is button 2" ); <br />
break;<br />
}<br />
}<br />
In CMyButton you could do all sorts of things to fire the buttonhover event, such as if the button gets the focus, etc..
Again, a very crude example, there might be an easier way....
I can send you the test app if you need the full source.
- S
50 cups of coffee and you know it's on!
|
|
|
|
|
i had the CButton subclassed already
GetParent()-> <------- THAT MADE MY CODE WORK
GetParent()->GetDlgItem(IDC_DISPLAY_TEXT)->SetWindowText("MY TEXT");
its the little things that get you when you dont know what you are doing...
thanks steve.
|
|
|
|
|
Im not sure its true or no in first your question you need to WM_MOUSEMOVE but in your reply I think you want to use Tooltip,right?
|
|
|
|
|
When you get a WM_MOUSEMOVE message, use the TrackMouseEvent() function, which will enable you to recieve a WM_MOUSEHOVER message. You can then update your static control with a simple WM_SETTEXT.
|
|
|
|
|
I Do think you want ToolTips. Try it, Read it, No gain without Pain
LateNightsInNewry
|
|
|
|
|
We started developing on VS2005 with Shared MFC and CLR enabled (from VS6, static MFC, and no .Net support). Now one of my MFC windows in a subclass is failing. When I compile everything is fine, but when I run in debug mode I get an acceptation:
ENSURE(afxOccMgr !=NULL);
Here is my code examples
CMainFrame::CMainFrame()
{…
AfxEnableControlContainer();
…
pMainFrm = this;
…
AfxOleInit();
….
}
Class Mysub : public CWnd
C3DWindow *m_p3dWnd;
Extern CMainFrame *MainFrm;
…
MySub::Load()
{…
m_ p3dWnd = new C3DWindow();
…
bRet = m_ p3dWnd ->Create("Internal_Win", 0, Rect,
pMainFrm, ID_MEM, NULL, FALSE);
…
}
Note: My code from the stack that caused the acceptation is the above create. Any clues?
Thanks
Programmer
Glenn Earl Graham
Austin, TX
|
|
|
|
|
Hello everybody.
This article i decided to write because i worked very much with threads.
I wrote some clases that has thread functionality untill
i wrote this class that satisfy me. In thread class i need simplity and compability in derrivations.
The issue i want to talk is destruction of derrived classes. All we know that construction is beginning from base class and finished in derrived classes from down to top, but destruction begins from top level derrivation to base thread class. The problem is that untill you do not rich destructor of base class the thread function still running and using the members of derrived classes. Commonly thread procedure is running untill base class do not stop it and it can be problem, because the top level derrived class did not exist anymore.
In my class if in derrived class you must free some resources in destructor, you can stop thread procedure in destructor and be sure that after releasing the resources no more calling to the memory will happend. It's very important point.
The using of class is very simple:
You must derrived your own class and implement only function Run , but do not make implementation in endless loop , because this function will be called in endless loop in base class thread procedure. In constructor of derrived class you can decide whether object can be suspended or not and what delay between calling to Runfunction will be made. Also the class has thread statuses that you can ask, like Suspended or Running or Exited, Thread ID Thread handle of created WinThread object.
In real time you can change sequence delay of calling to your Run function.
As i said it's very small and simple class that has not too much functionality, but if somebody needs small and simple thread class it can be useful.
I did not know how to add source code so i did it message body
Here BaseThread.h
<br />
#ifndef __D___BASE_THEAD_URU_DINKIN__20061107__<br />
#define __D___BASE_THEAD_URU_DINKIN__20061107__<br />
<br />
<br />
class CBaseThread : public CObject<br />
{<br />
enum ERunningState<br />
{<br />
e_Suspended,<br />
e_Running,<br />
e_Exited<br />
};<br />
<br />
DECLARE_DYNAMIC(CBaseThread);<br />
<br />
HANDLE m_hThread;
UINT m_nThread;
ERunningState m_eThreadState;
CWinThread* m_opThread;
HANDLE m_hExitEvent;
HANDLE m_hPauseEvent;
LONG m_iDelay;
<br />
public:<br />
<br />
CBaseThread(LONG a_iDelay = 1000, bool a_bCanBePaused = false);<br />
~CBaseThread();<br />
<br />
<br />
private:<br />
HANDLE hThread()const;
HANDLE hExitEvent()const;
HANDLE hPauseEvent()const;
LONG iDelay()const;
<br />
public:<br />
UINT nThread() const;
ERunningState eThreadState()const;
<br />
private:<br />
void SetUserData( LPVOID a_pUserData );
public:<br />
void SetDelay( LONG a_iDelay );
<br />
protected: <br />
virtual void Run() = 0;
<br />
<br />
<br />
public:<br />
bool Create(int a_iPriority = THREAD_PRIORITY_NORMAL);
void Stop();
void Suspend();
void Resume();
<br />
private:<br />
static UINT __cdecl ThreadHelper(LPVOID a_pUserData);<br />
<br />
};<br />
<br />
<br />
<br />
<br />
<br />
inline HANDLE <br />
CBaseThread::hThread()const <br />
{ <br />
if( m_opThread == NULL ) return NULL;<br />
return m_opThread->m_hThread; <br />
}<br />
<br />
<br />
inline UINT <br />
CBaseThread::nThread() const <br />
{ <br />
if( m_opThread ) return -1;<br />
return m_opThread->m_nThreadID; <br />
}<br />
<br />
<br />
inline CBaseThread::ERunningState <br />
CBaseThread::eThreadState()const<br />
{<br />
return m_eThreadState;<br />
}<br />
<br />
<br />
inline HANDLE <br />
CBaseThread::hExitEvent()const<br />
{<br />
return m_hExitEvent;<br />
}<br />
<br />
inline HANDLE <br />
CBaseThread::hPauseEvent()const<br />
{<br />
return m_hPauseEvent;<br />
}<br />
<br />
inline LONG <br />
CBaseThread::iDelay()const<br />
{<br />
return m_iDelay;<br />
}<br />
<br />
<br />
inline void <br />
CBaseThread::SetDelay(LONG a_iDelay)<br />
{<br />
m_iDelay = a_iDelay;<br />
}<br />
<br />
#endif<br />
And here is the BaseThread.cpp
<br />
#include "StdAfx.h"<br />
#include "basethread.h"<br />
<br />
<br />
IMPLEMENT_DYNAMIC(CBaseThread, CObject)<br />
CBaseThread::CBaseThread(LONG a_iDelay , bool a_bCanBePaused ) : CObject()<br />
{<br />
m_hThread = NULL;<br />
m_nThread = 0;<br />
m_eThreadState = e_Running;<br />
m_opThread = NULL;<br />
m_hExitEvent = NULL;<br />
m_hPauseEvent = NULL;<br />
m_iDelay = a_iDelay;<br />
<br />
if( a_bCanBePaused )<br />
{<br />
m_hPauseEvent = CreateEvent( NULL, FALSE, FALSE, NULL );<br />
}<br />
m_hExitEvent = CreateEvent( NULL, FALSE, FALSE, NULL );<br />
<br />
}<br />
<br />
<br />
CBaseThread::~CBaseThread()<br />
{<br />
if( eThreadState() != e_Exited )<br />
{<br />
Stop();<br />
}<br />
<br />
if( m_hExitEvent )<br />
{<br />
CloseHandle( m_hExitEvent );<br />
}<br />
<br />
if( m_hPauseEvent )<br />
{<br />
CloseHandle( m_hPauseEvent );<br />
}<br />
}<br />
<br />
<br />
bool <br />
CBaseThread::Create(int a_iPriority)<br />
{<br />
ASSERT( m_opThread == NULL );<br />
m_opThread = AfxBeginThread(ThreadHelper, (LPVOID)this, a_iPriority );<br />
return m_opThread == NULL ? false: true;<br />
}<br />
<br />
<br />
void <br />
CBaseThread::Stop()<br />
{<br />
SetEvent( m_hExitEvent );<br />
if( m_hPauseEvent != NULL )<br />
{<br />
SetEvent( m_hPauseEvent );<br />
}<br />
<br />
while( eThreadState() != e_Exited );<br />
}<br />
<br />
<br />
void <br />
CBaseThread::Suspend() <br />
{<br />
if( eThreadState() != e_Running ) return;<br />
ASSERT( m_hPauseEvent != NULL );<br />
ResetEvent( m_hPauseEvent );<br />
m_eThreadState = e_Suspended;<br />
}<br />
<br />
void <br />
CBaseThread::Resume()<br />
{<br />
if( eThreadState() != e_Suspended ) return;<br />
ASSERT( m_hPauseEvent != NULL );<br />
SetEvent( m_hPauseEvent );<br />
m_eThreadState = e_Running;<br />
}<br />
<br />
<br />
UINT __cdecl <br />
CBaseThread::ThreadHelper(LPVOID a_pUserData)<br />
{<br />
CBaseThread* l_pThis = (CBaseThread*)(a_pUserData);<br />
LONG l_iDelay = GetTickCount();<br />
do<br />
{<br />
l_iDelay = GetTickCount();<br />
if( l_pThis->eThreadState() == e_Suspended && l_pThis->hPauseEvent() != NULL )<br />
{<br />
WaitForSingleObject(l_pThis->hPauseEvent(), INFINITE) ;<br />
}<br />
<br />
if( l_pThis->eThreadState() == e_Running )<br />
{<br />
l_pThis->Run();<br />
}<br />
}<br />
while( WaitForSingleObject( l_pThis->hExitEvent(), l_pThis->iDelay()) == WAIT_TIMEOUT );<br />
l_pThis->m_opThread = NULL;<br />
l_pThis->m_eThreadState = e_Exited;<br />
return 0;<br />
}<br />
|
|
|
|
|
Why don't you create a proper article on this topis instead of a thread ?
The thread is not "bumpable" so in a couple of hours, your topic will be lost on the next pages.
|
|
|
|
|
The forums are a place for you to ask questions or look for comments. You really should have submitted this as an article. In doing such, you will also need to answer why your thread class is better than the one that MFC already has, as well as why it is better than ones that are platform-independent.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
I'm working on a WIN32 project and got stucked. I need dynamic menu... that is generated on the fly... so I have to #define a variable number of massages (one for every menu item) which I need in the WndCallback function to find out which menu item was clicked. I wandered is there is any repetitive macro directive... or some other way to do find out which item was clicked.
I hope I made myself clear... and look foreward to you solutions.
|
|
|
|
|
You don't need to #define an ID for each menu item, you can check it programatically in WM_COMMAND.
#define MENU_BASE WM_USER + 1000 // some made up number
#define NUM_ITEMS 20
char itemName[40];
for (int i = 0; i < NUM_ITEMS; i++ )
{
wsprintf( itemName, "Item %i", i );
::AppendMenu( hMenu, MF_STRING, MENU_BASE + i, itemName );
}
Then in your WndProc:
case WM_COMMAND:
{
int id = LOWORD( wParam );
if ( id >= MENU_BASE && id < MENU_BASE + NUM_ITEMS )
{
int item = id - MENU_BASE;
}
}
- S
50 cups of coffee and you know it's on!
|
|
|
|
|
Thank you a lot. I can do it from here. Thanks again *one virtual beer for Steve Echols*
|
|
|
|
|
Hello,
im serching for a zip and unzipper which is written in c. It is very important, that there are only dependencies to standard-libs exitsts. No MFC ore something else. A other condition is those that it must be possible to compress and uncompress string(char*). This is also that, for which I need it.
I hope someone can me help
thanks in advance
|
|
|
|
|
There are loads of free zipping utuilites around, try http://www.zlib.net/[^] http://www.gzip.org/[^]
Don't worry about compressing a string. Nearly all zipping libraries take a file as a byte stream, which is basically a char*. But if you are hoping to compress text with a zipping util, you won't really gain anything. Zips are for compressing binary data, the algorithms expect certain paramaters to be present which are not found in plain text strings. To compress text you need a will be better off with a special text compression algorithm.
-- modified at 15:17 Tuesday 14th November, 2006
|
|
|
|
|
WalderMort wrote: But if you are hoping to compress text with a zipping util, you won't really gain anything.
??
text compresses just fine with ZIP / deflate. it's easy to get 3:1 compression with WinZip's default settings on a plain text file.
|
|
|
|
|
WalderMort wrote: But if you are hoping to compress text with a zipping util, you won't really gain anything.
It all depends on just how large the string is. Obviously a single 80 character string will not "usually" compress well unless it is already redundant in content, where-as an entire document loaded into a single string and then compressed would "usually" result in a very nice savings.
_________________________
Asu no koto o ieba, tenjo de nezumi ga warau.
Talk about things of tomorrow and the mice in the ceiling laugh. (Japanese Proverb)
|
|
|
|
|
sknobli wrote: im serching for a zip and unzipper which is written in c.
If you really, REALLY want zip/unzip then get the zlib[^] API and use it, otherwise if you want small string compression, portibility and speed, go for the LZO[^] library.
As you get used to the compression and decompression methods and advantages/disadvantages of each, you may find that other [^] algorithms work better.
_________________________
Asu no koto o ieba, tenjo de nezumi ga warau.
Talk about things of tomorrow and the mice in the ceiling laugh. (Japanese Proverb)
|
|
|
|
|
Jeffry J. Brickley wrote: go for the LZO[^] library
nice... except for those three magic letters GPL. it's like poison.
|
|
|
|
|
Commercial licenses are available on request. - you have to pay for the potent version!
[edit]Bah. I missed "free" in the original requrest. [/edit]
--
Presented in BC [Brain Control] where available
|
|
|
|
|
|
At first, thanks for all replies. Nevertheless, i need a zip-decompression which i use without windows.h and wchar.h. There is only a limited libary availible (for Nintendo DS). Exists any chance to get sourcecode from a project, which IN-Buffer is a char* and as OUT-Buffer is a Struct or something else which i can handle with my own I/O to write it to my FS. The reason why i want to handle a ZIP-File is that i want to modfie the date under Windows.
|
|
|
|
|
Hi All,
I have some queries regarding font.
Q1. What is exactly a 'Bitmap Type Font', 'TrueType Font'?
Q2. Difference between the two.
Q3. Difference between 16-bit version and 32- version of a Font?
q4. How can we identity whether a font is 16-bit version or 32-bit?
Anwsers to any of the above will be great help for me.
Thanks in advance
Suraj
Suraj Gupta
|
|
|
|
|
|
How can i make a driver hyperthreading ....
i doent mean the single HT core but i need my driver working on a multi core
HT . Is it possible or not?
vineesh
|
|
|
|
|
How can I programmatically get the group(s) that the current user(the user account the applications is running on) is in? I can get the privileges, but i need the group(s). Thanks for any help.
--yeti
|
|
|
|