|
The slider doesn't work that way (otherwise they'd call it a Clickbar, not a Trackbar ).
When you click in the track, the control's pagesize setting determines how far
the slider moves.
Here's the docs for the control:
http://msdn.microsoft.com/en-us/library/bb760149(VS.85).aspx[^]
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi mark,
Thanks for your effort on this... One thing i want to make sure before qucik start. Is the track bar and slider both are same ..? If not please direct me how to create track bar dynamically..
if both are similar, do we get exact position of the slider..? if so please give me one example code if possible...
Your help would be apriciated.
modified on Tuesday, February 17, 2009 10:14 AM
|
|
|
|
|
Trackbar is the real name for the "slider" Windows control.
You can get the exact position of the CSliderCtrl with the GetPos() method.
You'll probably have to customize the control if you want to click in the track
and have the slider move to that position.
The control's features, as with other controls, is documented:
Trackbar[^]
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi mark,
I have tried to set TB_THUMBTRACK and TB_THUMBPOSITION controls .... Still i am facing with the same problem. even after setting this i am not getting correct SBCode value in ONHSCROLL evnt message.
I have used SetPageSize function, then i came to know that jumping of slider postion is under control of SetPageSize function. Earlier i told you right..? whenever i have clicked on slider it is incrementing by 20. now if i set the parameter of this function as 5 then every slider position is incrementing by 5 only.
But i am not getting the exact mouse position in the code.
Can you please help me regarding this..?
modified on Tuesday, February 17, 2009 10:14 AM
|
|
|
|
|
venki502 wrote: But i am not getting the exact mouse position in the code.
Correct. The control doesn't work that way. Like I mentioned previously - if you
want the slider position to move to the exact spot you click, then you'd have to
customize the control, perhaps by subclassing the control, intercepting the mouse click
message(s), somehow calculate how the position clicked relates to the new position, and
call SetPos() to set that new position.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mark,
Sorry i didn't understand your answer, because setpos() expects only one parameter. but using mouse functions you will get pixel information i.e x-axis value and y-axis value. how do u pass this pixel parameter to slider setpos().
Please clarify my doubt..
modified on Tuesday, February 17, 2009 10:15 AM
|
|
|
|
|
venki502 wrote: ow do u pass this pixel parameter to slider setpos().
That's why I said "somehow" I wouldn't know, because I don't know
how the control is implemented, whether it's different between Windows
versions, etc.
You can experiment and probably find a calculation that works.
For example, on a horizontal trackbar, let's assume the track takes
up the control's entire width (in pixels).
In the mouse message, you get a mouse coordinate relative to the screen.
First convert the x coord to make it relative to the control.
Then to calculate the resulting slider position:
double positionfactor = (double)xcoordrelativetocontrol / (double)controlwidthinpixels
int sliderrange = m_sliderctrl.GetRangeMax() - m_sliderctrl.GetRangeMin()
int newsliderpos = m_sliderctrl.GetRangeMin() + (sliderrange * positionfactor)
m_sliderctrl.SetPos(newsliderpos);
You could also write your own trackbar control.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi mark,
Thanks for your information. just now i have tried to implement same thing in my application. I am using all the mouse events in my application. whenever i have clicked on slider using mouse, no event ralated to mouse are getting fired. But if i clcked on some where in the dialog box, i am able to recieve LButtonDown event.
Can you please explain me why it is happening like this..?
Thanks in advance..
modified on Tuesday, February 17, 2009 10:15 AM
|
|
|
|
|
You'll need to derive a class from CSliderCtrl and make your "m_slider_bar1"
an object of that derived class.
It's in that derived class you'll need to catch the mouse messages, not in
the dialog class...the messages are going to the control
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mark,
I have written separater class which is deriving from CSliderCtrl base class.
I have written function Init(), in the function definition i have included slider creation function. Then i am calling Init() from OnInitDlalog(), but no luck.
At run time no slider is displaying in the dialog box..
modified on Tuesday, February 17, 2009 10:16 AM
|
|
|
|
|
You should be creating the control the same way you did before,
just using your new class.
All you should have to change is the class. There's no new Init function necessary.
Here's the basic shell of a CSliderCtrl derived class:
#pragma once
class CMySliderCtrl : public CSliderCtrl
{
DECLARE_DYNAMIC(CMySliderCtrl)
public:
CMySliderCtrl();
virtual ~CMySliderCtrl();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};
#include "stdafx.h"
#include "MyApp.h"
#include "MySliderCtrl.h"
IMPLEMENT_DYNAMIC(CMySliderCtrl, CSliderCtrl)
CMySliderCtrl::CMySliderCtrl()
{
}
CMySliderCtrl::~CMySliderCtrl()
{
}
BEGIN_MESSAGE_MAP(CMySliderCtrl, CSliderCtrl)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
void CMySliderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CSliderCtrl::OnLButtonDown(nFlags, point);
}
Create the control the same way you did before:
m_slider_bar1 = new CMySliderCtrl();
m_slider_bar1->Create(...
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mark,
I did the same thing what you have suggested in the previous post. I have included AfxMessageBox function in the constructor of CMySliderCtrl class.
but this is not executing.
then i came to know that the class constructor is not getting executing..
Below i am including the code snippet..
Here CMySliderCtrl is slider class, and CIncidentSample4Dlg class is my dialog box class. in my dilaog box class i have written create function for slider.
class CMySliderCtrl : public CSliderCtrl
{
DECLARE_DYNAMIC(CMySliderCtrl)
public:
CMySliderCtrl();
virtual ~CMySliderCtrl();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};
class CIncidentSample4Dlg : public CDialog
{
// Construction
public:
CIncidentSample4Dlg(CWnd* pParent = NULL); // standard constructor
CSliderCtrl *m_slider_bar1;
// Dialog Data
//{{AFX_DATA(CIncidentSample4Dlg)
enum { IDD = IDD_INCIDENTSAMPLE4_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CIncidentSample4Dlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CIncidentSample4Dlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnCancelMode();
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_INCIDENTSAMPLE4DLG_H__1BDF3DFC_90DC_4DB5_89D3_910D63A593B4__INCLUDED_)
modified on Tuesday, February 17, 2009 10:16 AM
|
|
|
|
|
venki502 wrote: CSliderCtrl *m_slider_bar1;
That needs to be
CMySliderCtrl *m_slider_bar1;
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hello,
I have a problem with a tooltip control in a modeless dialog. I have created the tooltip like this in the dialogs OnInitDialog() function:
m_pTip = new CToolTipCtrl();
m_pTip->Create(this, TTS_ALWAYSTIP);
m_pTip->SetMaxTipWidth(250);
m_pTip->Activate(TRUE);
m_pTip->AddTool(this, "TEST");
I also call RelayEvent in PreTranslateMessage. This works fine.
But in a certain situation I must disable the parent window of the dialog, so the dialog behaves like a modal dialog.
I do this just with
m_pParentWnd->EnableWindow(FALSE);
But after this call the tooltips in my dialog do not work anymore.
Does someone have a hint for me?
Thank you
|
|
|
|
|
|
Hello Hans,
thank you for your answer. I have tried this but it does not work.
After calling AfxGetStaticModuleState() in the GetMessageProc, AfxGetApp() returns a NULL pointer within the proc. So I removed AFX_MANAGE_STATE(AfxGetStaticModuleState( )) and then the pointer is OK. (But here is no change in the tooltip behavior)
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
...
I think the problem is not that it is a modeless dialog, because when the dialog is in modeless state, the tooltips work (without any GetMessageProc). This means that PreTranslateMessage within my dialog is called.
The problem only occurs when I call
m_pParentWnd->EnableWindow(FALSE);
in the dialog class.
When I set a breakpoint in PreTranslateMessige procedure of my dialog, I can see that RelayEvent is called (But the Tooltip doens not apear):
Btw: My modeless dialog is created in the mainframe, it is not in a dll.
Any ideas?
regards
|
|
|
|
|
You got to activate the tooltip new. If it doesnt work create every tiem a new one.
Greetings from Germany
|
|
|
|
|
Hi Karsten
That's it! I just have to call Activate after disabling the parent wnd.
Thank you very much
|
|
|
|
|
I have doubt about the slider control.
I am creating slider dynamically using the below code snippet.
m_slider_bar1->Create(WS_CHILD | WS_VISIBLE | TBS_HORZ | TBS_BOTH | TBS_NOTICKS, CRect(75, 20, 500, 45), this, IDC_SLIDER1);
I am able to get the slider in the dialog box, but when i clicked on the slider at some location, iam seeing border.
I have written code like whenever you drag the mouse to some location then line should move from current location to there. the line is able to move but the new control is overriding the slider..
now what i want is, i should not get the slider with border..
Your help me will be appriciated regarding this..
Thanks
Venkatesh
|
|
|
|
|
venki502 wrote: I am creating slider dynamically using the below code snippet.
Why not at design time?
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Hi David,
I want to create the slider at run time at specified position as that is my requirement.
But even if i create the slider at design time i am facing with the same problem.
whereever i have clicked in the slider the silider poisition is not moved directly to the respected position.
I am explaining my scenario with example below, i hope this will help you for better understanding my question.
I gave the min and max values as 0 and 100. Suppose if i clicked at 33 position, the slider position is not directlt moving to 33 location, instead it is moving to 20th location. every time the tic value is incrementing by 20.
Any help would be appriciated regarding this.
Thanks in advance.
Thanks
Venkatesh.
|
|
|
|
|
venki502 wrote: whereever i have clicked in the slider the silider poisition is not moved directly to the respected position.
See here[^].
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hello,
This is Venkatesh, I am working on VC++ (MFC). Currently i am working on one application which deals with the graphs and lines. i want to create one line and have to move (drag) that line horizotally from one end to other using mouse.
Can any one help me out regarding this...?
Any help would be much appreciated, because as it is very urgent requirement for me..
Thanks
Venkatesh.
|
|
|
|
|
You need to declare WM_MOUSEMOVE and WM_LBUTTONUP/DOWN and you need to get current postion of mouse with GetCursorPos and then you can use of LineTo/MoveTo.
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|
|
Thanks Hamid ,thanks for your valuable reply.
|
|
|
|