|
How do I display the text in the status bar pane as right justified?
If I use the following code,
CDC* pDC = m_wndStatusBar.GetDC();
pDC->SetTextAlign(TA_RIGHT);
It's not working.
|
|
|
|
|
if you are manullay drawing in the status bar you can use DrawText() with style DT_RIGHT
nave
|
|
|
|
|
No.I am displaying the text in the status bar that was entered from a edit box in a dialog. The code for displaying the message is,
void CPerspectiveDoc::OnShowMsg(CCmdUI* pCmdUI)
{
char str1[150];
//int len = message.GetLength();
sprintf(str1, "%s",message.GetString());
CDC* pDC = m_wndStatusBar.GetDC();
pDC->SetTextAlign(TA_RIGHT);
pCmdUI->Enable(TRUE);
//m_wndStatusBar.SetPaneInfo(1,IDS_MESSAGE,SBPS_NORMAL,100);
pCmdUI->SetText((const char *)str1);
//m_wndStatusBar.SetPaneInfo(1, IDS_MESSAGE, SBPS_STRETCH, len);
}
ID for that edit box is, IDS_MESSAGE.
|
|
|
|
|
T.RATHA KRISHNAN wrote: pDC->SetTextAlign(TA_RIGHT);
This will not do.
I think you should owner draw the status bar.
nave
|
|
|
|
|
Why you dont use of manullay drawing ?
|
|
|
|
|
Hi
I would like to create a Login Screen that would mimic the Windows XP Welcome Screen. Typically my app would handle many users on a single machine. Therefore the Login screen should show several usernames with edit boxes for their passwords. When a user needs to login, she should be able to navigate through the list of usernames in the Screen just like in the Win XP Welcome Screen and select the required username and enter the password.
My que is, how do I animate the controls to mimic the Windows XP Welcome Screen and also what controls should I use ( CWnd / CDialog ) to best achieve this ?
thanx , expecting a quick reply.
Eraj.
|
|
|
|
|
There is nothing special about the welcome screen. It is just a full screen window with a few skinned controls.
In your case, it may be better to use a CDialog, that way you can run and destroy it before you main window appears. Look on CP for articles about skinning controls. If you want it to be fullscreen, make the dialog topmost, remove all borders, and adjust the size so that it fills the screen.
|
|
|
|
|
No no, my question is not regarding the Welcome Screen itself.
But rather the control with the Username and Password field together, which lightens up when not focused, and darkens when in focus.
In other words, Im only worried about creating the control for showing the Username and the Password field for each user, that would have a similar look and feel to that of the XP login. I jus want to animate the controls that way.
I would hold all these individual Username/Password combo controls in a CDialog.
Its jus the animation of the controls Im really worried about and have no clue of !
|
|
|
|
|
Like I said in my last reply, search CP for articles about skinning controls.
|
|
|
|
|
I want to set the widht of the first pane as 100. If I use the following code,
m_wndStatusBar.SetPaneInfo(1,IDS_MESSAGE,SBPS_STRETCH,100);
it gives me an exception. What should I use?
|
|
|
|
|
T.RATHA KRISHNAN wrote: m_wndStatusBar.SetPaneInfo(1,IDS_MESSAGE,SBPS_STRETCH,100);
If you want to width of first satus pane, it should be 0th index , isn't it ?
What exception it is throwing ? Have you tried debugging it ?
|
|
|
|
|
Unhandled exception at 0x7c1d71bb (MFC71.dll) in Perspective.exe: 0xC0000005: Access violation writing location 0x00000014.
If I break this, it goes to a class called
void CStatusBar::SetPaneInfo(int nIndex, UINT nID, UINT nStyle, int cxWidth)
{
ASSERT_VALID(this);
BOOL bChanged = FALSE;
AFX_STATUSPANE* pSBP = _GetPanePtr(nIndex);
pSBP->nID = nID;
if (pSBP->nStyle != nStyle)
{
if ((pSBP->nStyle ^ nStyle) & SBPS_STRETCH)
bChanged = TRUE;
else
{
pSBP->nStyle = nStyle;
pSBP->nFlags |= SBPF_UPDATE;
SetPaneText(nIndex, pSBP->strText);
}
pSBP->nStyle = nStyle;
}
if (cxWidth != pSBP->cxText)
{
// change width of one pane -> invalidate the entire status bar
pSBP->cxText = cxWidth;
bChanged = TRUE;
}
if (bChanged)
UpdateAllPanes(TRUE, FALSE);
}
What to do?
|
|
|
|
|
You have not answered my first question about index, have you passed 0th index ?
And where exactly it is crashing in above code? you are definitely using invalid pointer here.
|
|
|
|
|
Actually my requirement is to set width of the second pane only. I have told that first pane by mistake.
My initial statement,
m_wndStatusBar.SetPaneInfo(1,IDS_MESSAGE,SBPS_STRETCH,100);
is the right requirement only. If I use this code, I got the afore mentioned
exception.(refer last message by me).
|
|
|
|
|
Ok, At which line exactly, debugger is showing crash ?
I can run this code in sample SDI app, without any problem.
|
|
|
|
|
If I remove the comments from this line,
//m_wndStatusBar.SetPaneInfo(1,IDS_MESSAGE,SBPS_NORMAL,100); an exception occurs. If I break that exception, it goes to a file called barstat.cpp
void CStatusBar::SetPaneInfo(int nIndex, UINT nID, UINT nStyle, int cxWidth)
{
ASSERT_VALID(this);
BOOL bChanged = FALSE;
AFX_STATUSPANE* pSBP = _GetPanePtr(nIndex);
pSBP->nID = nID;
if (pSBP->nStyle != nStyle)
********{
if ((pSBP->nStyle ^ nStyle) & SBPS_STRETCH)
bChanged = TRUE;
else
{
pSBP->nStyle = nStyle;
pSBP->nFlags |= SBPF_UPDATE;
SetPaneText(nIndex, pSBP->strText);
}
pSBP->nStyle = nStyle;
}
if (cxWidth != pSBP->cxText)
{
// change width of one pane -> invalidate the entire status bar
pSBP->cxText = cxWidth;
bChanged = TRUE;
}
if (bChanged)
UpdateAllPanes(TRUE, FALSE);
}
The yellow pointer appears in the line where ******** is shown. What may be the problem?
-- modified at 1:27 Monday 12th February, 2007
|
|
|
|
|
T.RATHA KRISHNAN wrote: AFX_STATUSPANE* pSBP = _GetPanePtr(nIndex);
pSBP->nID = nID;
if (pSBP->nStyle != nStyle)
It may be beacuase, pSBP is NULL. Are you sure, there are two panes present in status bar ? Have you called this function after creating status bar ?
|
|
|
|
|
Yes, There are two status bar panes. I've called SetPaneInfo function after creating the Status Bar only. The code for displaying message in the status bar pane is,
void CPerspectiveDoc::OnShowMsg(CCmdUI* pCmdUI)
{
char str1[150];
//int len = message.GetLength();
sprintf(str1, "%s",message.GetString());
CDC* pDC = m_wndStatusBar.GetDC();
pDC->SetTextAlign(TA_RIGHT);
pCmdUI->Enable(TRUE);
//m_wndStatusBar.SetPaneInfo(1,IDS_MESSAGE,SBPS_NORMAL,100);
pCmdUI->SetText((const char *)str1);
//m_wndStatusBar.SetPaneInfo(1, IDS_MESSAGE, SBPS_STRETCH, len);
}
Here this line,
CDC* pDC = m_wndStatusBar.GetDC();
compiles without any problem.
This line also,
pDC->SetTextAlign(TA_RIGHT);
compiles without problem. But not displaying message right aligned.
If I remove commenting from this line,
//m_wndStatusBar.SetPaneInfo(1,IDS_MESSAGE,SBPS_NORMAL,100);
then only that exception occurs.
|
|
|
|
|
Show the code, how you have created this status bar ?
|
|
|
|
|
The code for creating Status Bar is,
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1;
}
Here is the Indicators.
static UINT indicators[] =
{
0,// ID_SEPARATOR
IDS_MESSAGE,
ID_SHOWFPS,
};
IDS_MESSAGE is the ID of the second pane. The pane in which we display the message. ID_SHOWFPS is the ID of the First pane.
I display the message in some other class using the following code.
void CPerspectiveDoc::OnShowMsg(CCmdUI* pCmdUI)
{
char str1[150];
//int len = message.GetLength();
sprintf(str1, "%s",message.GetString());
CDC* pDC = m_wndStatusBar.GetDC();
pDC->SetTextAlign(TA_RIGHT);
pCmdUI->Enable(TRUE);
//m_wndStatusBar.SetPaneInfo(1,IDS_MESSAGE,SBPS_NORMAL,100);
pCmdUI->SetText((const char *)str1);
//m_wndStatusBar.SetPaneInfo(1, IDS_MESSAGE, SBPS_STRETCH, len);
}
|
|
|
|
|
T.RATHA KRISHNAN wrote: if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1;
}
I'm seeing nothing wrong with your code, its creation is succesful. May be you mail send across your sample code ay prasad.som at mail dot com.
|
|
|
|
|
Could U pls send me your correct email ID? (like this one rtr_18@yahoo.com)
|
|
|
|
|
T.RATHA KRISHNAN wrote: Could U pls send me your correct email ID?
It is correct.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
If you call,
m_wndStatusBar.SetPaneInfo(0, IDS_MESSAGE, SBPS_STRETCH, len);
is program crashing?
|
|
|
|
|
T.RATHA KRISHNAN wrote: static UINT indicators[] =
{
0,// ID_SEPARATOR
IDS_MESSAGE,
ID_SHOWFPS,
};
IDS_MESSAGE is the ID of the second pane.
Do you have an entry for IDS_MESSAGE in the stringtable resource?
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|