Hello,

i'm writing a Data acquisition software. when i start the recording i
wanted to show the elapsed time in the status bar and once the
recording is stopped, the status bar should show "Rec Stopped"

My code is as follows

static UINT BASED_CODE indicators[] ={
ID_SEPARATOR, // status line indicator

ID_STATUS_BAR_SAVE,
IDS_STATUS_MEASURE,
ID_INDICATOR_ONLINE,
ID_STATUSBAR_CONFIG,

};

int CParentFrame::OnCreate(LPCREATESTRUCT lpCS){
//if(CMDIFrameWnd::OnCreate(lpCS) == -1) return -1;
if(CreateAndDockToolBar() == -1) return -1;
m_pMenu = new CMenu();
m_pMenu->LoadMenu("MAINMENU");
CreateClient(lpCS,m_pMenu->GetSubMenu(0));
//SetMenu(pMenu);
size_t sizeIndicator;
sizeIndicator = sizeof(indicators);
//m_wndToolBar = new CToolBar();


if (!m_wndStatusBar.Create(this) ||!
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/
sizeof(UINT))){
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}

//CStatusBarCtrl &m_csb = m_wndStatusBar.GetStatusBarCtrl();
if(CMDITabFrameWnd::CreateTabs() == -1)
return -1;

UINT nID, nStyle;
int cxWidth;
int nIndex = m_wndStatusBar.CommandToIndex(ID_STATUS_BAR_SAVE);
m_wndStatusBar.GetPaneInfo(nIndex, nID, nStyle, cxWidth);
m_wndStatusBar.SetPaneInfo(nIndex, nID, nStyle | SBT_OWNERDRAW,
cxWidth);

return 0;
}

void CParentFrame::UpdateStatusBarText(jcStr *ptrText){
UINT uiPane;
UINT uiStyle;
int uiWidth;
CRect rectPane;

int nIndex = m_wndStatusBar.CommandToIndex(IDS_STATUS_MEASURE); //the
program crash in debug
//right here
or any way i used m_wndStatusBar

m_wndStatusBar.GetPaneInfo(nIndex, uiPane, uiStyle, uiWidth);

CDC *pDC;
pDC = m_wndStatusBar.GetDC();
pDC->SelectObject(m_wndStatusBar.GetFont());
pDC->DrawText(_T(ptrText->ReturnStr()), -1, rectPane, DT_CALCRECT);
m_wndStatusBar.ReleaseDC(pDC);
m_wndStatusBar.SetPaneInfo(nIndex, uiPane, uiStyle,
rectPane.Width());
m_wndStatusBar.SetPaneText(nIndex, ptrText->ReturnStr());

}
where jcStr is an object similar to CString

i created a thread which updates the string pointer every 1 second and
calls the above function to update the status bar.

also when i ran the same application on a different computer(the
release mode) then status bar would not show the elapsed time, while
it shows the same in my computer

please point me in the right direction

jc

Re: CStatusBar by Tom

Tom
Wed Dec 05 22:24:47 PST 2007

Are you attempting to update the status bar in the main GUI thread from a
worker thread? If so, I'd do it by sending a message to the GUI thread
(most likely handled in the mainframe) telling it to update the status bar.
You get into all kinds of trouble when you try to call GUI code in the main
thread from "other threads".

I would use PostMessage() from the worker thread to send messages to update
the status bar.

Tom

"jc" <k.jayachandran@gmail.com> wrote in message
news:7f8aff43-e506-4c22-86bf-df5b727c3b27@a35g2000prf.googlegroups.com...
> Hello,
>
> i'm writing a Data acquisition software. when i start the recording i
> wanted to show the elapsed time in the status bar and once the
> recording is stopped, the status bar should show "Rec Stopped"
>
> My code is as follows
>
> static UINT BASED_CODE indicators[] ={
> ID_SEPARATOR, // status line indicator
>
> ID_STATUS_BAR_SAVE,
> IDS_STATUS_MEASURE,
> ID_INDICATOR_ONLINE,
> ID_STATUSBAR_CONFIG,
>
> };
>
> int CParentFrame::OnCreate(LPCREATESTRUCT lpCS){
> //if(CMDIFrameWnd::OnCreate(lpCS) == -1) return -1;
> if(CreateAndDockToolBar() == -1) return -1;
> m_pMenu = new CMenu();
> m_pMenu->LoadMenu("MAINMENU");
> CreateClient(lpCS,m_pMenu->GetSubMenu(0));
> //SetMenu(pMenu);
> size_t sizeIndicator;
> sizeIndicator = sizeof(indicators);
> //m_wndToolBar = new CToolBar();
>
>
> if (!m_wndStatusBar.Create(this) ||!
> m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/
> sizeof(UINT))){
> TRACE0("Failed to create status bar\n");
> return -1; // fail to create
> }
>
> //CStatusBarCtrl &m_csb = m_wndStatusBar.GetStatusBarCtrl();
> if(CMDITabFrameWnd::CreateTabs() == -1)
> return -1;
>
> UINT nID, nStyle;
> int cxWidth;
> int nIndex = m_wndStatusBar.CommandToIndex(ID_STATUS_BAR_SAVE);
> m_wndStatusBar.GetPaneInfo(nIndex, nID, nStyle, cxWidth);
> m_wndStatusBar.SetPaneInfo(nIndex, nID, nStyle | SBT_OWNERDRAW,
> cxWidth);
>
> return 0;
> }
>
> void CParentFrame::UpdateStatusBarText(jcStr *ptrText){
> UINT uiPane;
> UINT uiStyle;
> int uiWidth;
> CRect rectPane;
>
> int nIndex = m_wndStatusBar.CommandToIndex(IDS_STATUS_MEASURE); //the
> program crash in debug
> //right here
> or any way i used m_wndStatusBar
>
> m_wndStatusBar.GetPaneInfo(nIndex, uiPane, uiStyle, uiWidth);
>
> CDC *pDC;
> pDC = m_wndStatusBar.GetDC();
> pDC->SelectObject(m_wndStatusBar.GetFont());
> pDC->DrawText(_T(ptrText->ReturnStr()), -1, rectPane, DT_CALCRECT);
> m_wndStatusBar.ReleaseDC(pDC);
> m_wndStatusBar.SetPaneInfo(nIndex, uiPane, uiStyle,
> rectPane.Width());
> m_wndStatusBar.SetPaneText(nIndex, ptrText->ReturnStr());
>
> }
> where jcStr is an object similar to CString
>
> i created a thread which updates the string pointer every 1 second and
> calls the above function to update the status bar.
>
> also when i ran the same application on a different computer(the
> release mode) then status bar would not show the elapsed time, while
> it shows the same in my computer
>
> please point me in the right direction
>
> jc


RE: CStatusBar by Paresh

Paresh
Thu Dec 06 04:12:01 PST 2007

Hi,

Have you tried with

ON_UPDATE_COMMAND_UI(ID_STATUSBAR_CONFIG, OnUpdateStatusBarText)

Regards,
Paresh.

"jc" wrote:

> Hello,
>
> i'm writing a Data acquisition software. when i start the recording i
> wanted to show the elapsed time in the status bar and once the
> recording is stopped, the status bar should show "Rec Stopped"
>
> My code is as follows
>
> static UINT BASED_CODE indicators[] ={
> ID_SEPARATOR, // status line indicator
>
> ID_STATUS_BAR_SAVE,
> IDS_STATUS_MEASURE,
> ID_INDICATOR_ONLINE,
> ID_STATUSBAR_CONFIG,
>
> };
>
> int CParentFrame::OnCreate(LPCREATESTRUCT lpCS){
> //if(CMDIFrameWnd::OnCreate(lpCS) == -1) return -1;
> if(CreateAndDockToolBar() == -1) return -1;
> m_pMenu = new CMenu();
> m_pMenu->LoadMenu("MAINMENU");
> CreateClient(lpCS,m_pMenu->GetSubMenu(0));
> //SetMenu(pMenu);
> size_t sizeIndicator;
> sizeIndicator = sizeof(indicators);
> //m_wndToolBar = new CToolBar();
>
>
> if (!m_wndStatusBar.Create(this) ||!
> m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/
> sizeof(UINT))){
> TRACE0("Failed to create status bar\n");
> return -1; // fail to create
> }
>
> //CStatusBarCtrl &m_csb = m_wndStatusBar.GetStatusBarCtrl();
> if(CMDITabFrameWnd::CreateTabs() == -1)
> return -1;
>
> UINT nID, nStyle;
> int cxWidth;
> int nIndex = m_wndStatusBar.CommandToIndex(ID_STATUS_BAR_SAVE);
> m_wndStatusBar.GetPaneInfo(nIndex, nID, nStyle, cxWidth);
> m_wndStatusBar.SetPaneInfo(nIndex, nID, nStyle | SBT_OWNERDRAW,
> cxWidth);
>
> return 0;
> }
>
> void CParentFrame::UpdateStatusBarText(jcStr *ptrText){
> UINT uiPane;
> UINT uiStyle;
> int uiWidth;
> CRect rectPane;
>
> int nIndex = m_wndStatusBar.CommandToIndex(IDS_STATUS_MEASURE); //the
> program crash in debug
> //right here
> or any way i used m_wndStatusBar
>
> m_wndStatusBar.GetPaneInfo(nIndex, uiPane, uiStyle, uiWidth);
>
> CDC *pDC;
> pDC = m_wndStatusBar.GetDC();
> pDC->SelectObject(m_wndStatusBar.GetFont());
> pDC->DrawText(_T(ptrText->ReturnStr()), -1, rectPane, DT_CALCRECT);
> m_wndStatusBar.ReleaseDC(pDC);
> m_wndStatusBar.SetPaneInfo(nIndex, uiPane, uiStyle,
> rectPane.Width());
> m_wndStatusBar.SetPaneText(nIndex, ptrText->ReturnStr());
>
> }
> where jcStr is an object similar to CString
>
> i created a thread which updates the string pointer every 1 second and
> calls the above function to update the status bar.
>
> also when i ran the same application on a different computer(the
> release mode) then status bar would not show the elapsed time, while
> it shows the same in my computer
>
> please point me in the right direction
>
> jc
>

Re: CStatusBar by jc

jc
Thu Dec 06 06:14:23 PST 2007

Thanks for the reply.

i used the ON_UPDATE_COMMAND_UI(ID_STATUSBAR_CONFIG,
OnUpdateStatusBarText)

the problem is this function is called when my mouse is on the
application and if the mouse is moving. i want the update to continue
even when the gui is not in focus

thanks
jc
On Dec 6, 6:12 am, Paresh <Par...@discussions.microsoft.com> wrote:
> Hi,
>
> Have you tried with
>
> ON_UPDATE_COMMAND_UI(ID_STATUSBAR_CONFIG, OnUpdateStatusBarText)
>
> Regards,
> Paresh.
>
> "jc" wrote:
> > Hello,
>
> > i'm writing a Data acquisition software. when i start the recording i
> > wanted to show the elapsed time in the status bar and once the
> > recording is stopped, the status bar should show "Rec Stopped"
>
> > My code is as follows
>
> > static UINT BASED_CODE indicators[] ={
> > ID_SEPARATOR, // status line indicator
>
> > ID_STATUS_BAR_SAVE,
> > IDS_STATUS_MEASURE,
> > ID_INDICATOR_ONLINE,
> > ID_STATUSBAR_CONFIG,
>
> > };
>
> > int CParentFrame::OnCreate(LPCREATESTRUCT lpCS){
> > //if(CMDIFrameWnd::OnCreate(lpCS) == -1) return -1;
> > if(CreateAndDockToolBar() == -1) return -1;
> > m_pMenu = new CMenu();
> > m_pMenu->LoadMenu("MAINMENU");
> > CreateClient(lpCS,m_pMenu->GetSubMenu(0));
> > //SetMenu(pMenu);
> > size_t sizeIndicator;
> > sizeIndicator = sizeof(indicators);
> > //m_wndToolBar = new CToolBar();
>
> > if (!m_wndStatusBar.Create(this) ||!
> > m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/
> > sizeof(UINT))){
> > TRACE0("Failed to create status bar\n");
> > return -1; // fail to create
> > }
>
> > //CStatusBarCtrl &m_csb = m_wndStatusBar.GetStatusBarCtrl();
> > if(CMDITabFrameWnd::CreateTabs() == -1)
> > return -1;
>
> > UINT nID, nStyle;
> > int cxWidth;
> > int nIndex = m_wndStatusBar.CommandToIndex(ID_STATUS_BAR_SAVE);
> > m_wndStatusBar.GetPaneInfo(nIndex, nID, nStyle, cxWidth);
> > m_wndStatusBar.SetPaneInfo(nIndex, nID, nStyle | SBT_OWNERDRAW,
> > cxWidth);
>
> > return 0;
> > }
>
> > void CParentFrame::UpdateStatusBarText(jcStr *ptrText){
> > UINT uiPane;
> > UINT uiStyle;
> > int uiWidth;
> > CRect rectPane;
>
> > int nIndex = m_wndStatusBar.CommandToIndex(IDS_STATUS_MEASURE); //the
> > program crash in debug
> > //right here
> > or any way i used m_wndStatusBar
>
> > m_wndStatusBar.GetPaneInfo(nIndex, uiPane, uiStyle, uiWidth);
>
> > CDC *pDC;
> > pDC = m_wndStatusBar.GetDC();
> > pDC->SelectObject(m_wndStatusBar.GetFont());
> > pDC->DrawText(_T(ptrText->ReturnStr()), -1, rectPane, DT_CALCRECT);
> > m_wndStatusBar.ReleaseDC(pDC);
> > m_wndStatusBar.SetPaneInfo(nIndex, uiPane, uiStyle,
> > rectPane.Width());
> > m_wndStatusBar.SetPaneText(nIndex, ptrText->ReturnStr());
>
> > }
> > where jcStr is an object similar to CString
>
> > i created a thread which updates the string pointer every 1 second and
> > calls the above function to update the status bar.
>
> > also when i ran the same application on a different computer(the
> > release mode) then status bar would not show the elapsed time, while
> > it shows the same in my computer
>
> > please point me in the right direction
>
> > jc


Re: CStatusBar by jc

jc
Thu Dec 06 06:38:26 PST 2007

thanks your suggestion solved the problem i think
i created a message function which will called the UpdateStatusBar
function and my worker thread did a PostMessage from that function.

now the debug mode doesn't crash. i have to create a release output
and move to a lab pc and test my code over there

thanks everybody for your help

jc
On Dec 6, 12:24 am, "Tom Serface" <tom.nos...@camaswood.com> wrote:
> Are you attempting to update the status bar in the main GUI thread from a
> worker thread? If so, I'd do it by sending a message to the GUI thread
> (most likely handled in the mainframe) telling it to update the status bar.
> You get into all kinds of trouble when you try to call GUI code in the main
> thread from "other threads".
>
> I would use PostMessage() from the worker thread to send messages to update
> the status bar.
>
> Tom
>
> "jc" <k.jayachand...@gmail.com> wrote in message
>
> news:7f8aff43-e506-4c22-86bf-df5b727c3b27@a35g2000prf.googlegroups.com...
>
> > Hello,
>
> > i'm writing a Data acquisition software. when i start the recording i
> > wanted to show the elapsed time in the status bar and once the
> > recording is stopped, the status bar should show "Rec Stopped"
>
> > My code is as follows
>
> > static UINT BASED_CODE indicators[] ={
> > ID_SEPARATOR, // status line indicator
>
> > ID_STATUS_BAR_SAVE,
> > IDS_STATUS_MEASURE,
> > ID_INDICATOR_ONLINE,
> > ID_STATUSBAR_CONFIG,
>
> > };
>
> > int CParentFrame::OnCreate(LPCREATESTRUCT lpCS){
> > //if(CMDIFrameWnd::OnCreate(lpCS) == -1) return -1;
> > if(CreateAndDockToolBar() == -1) return -1;
> > m_pMenu = new CMenu();
> > m_pMenu->LoadMenu("MAINMENU");
> > CreateClient(lpCS,m_pMenu->GetSubMenu(0));
> > //SetMenu(pMenu);
> > size_t sizeIndicator;
> > sizeIndicator = sizeof(indicators);
> > //m_wndToolBar = new CToolBar();
>
> > if (!m_wndStatusBar.Create(this) ||!
> > m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/
> > sizeof(UINT))){
> > TRACE0("Failed to create status bar\n");
> > return -1; // fail to create
> > }
>
> > //CStatusBarCtrl &m_csb = m_wndStatusBar.GetStatusBarCtrl();
> > if(CMDITabFrameWnd::CreateTabs() == -1)
> > return -1;
>
> > UINT nID, nStyle;
> > int cxWidth;
> > int nIndex = m_wndStatusBar.CommandToIndex(ID_STATUS_BAR_SAVE);
> > m_wndStatusBar.GetPaneInfo(nIndex, nID, nStyle, cxWidth);
> > m_wndStatusBar.SetPaneInfo(nIndex, nID, nStyle | SBT_OWNERDRAW,
> > cxWidth);
>
> > return 0;
> > }
>
> > void CParentFrame::UpdateStatusBarText(jcStr *ptrText){
> > UINT uiPane;
> > UINT uiStyle;
> > int uiWidth;
> > CRect rectPane;
>
> > int nIndex = m_wndStatusBar.CommandToIndex(IDS_STATUS_MEASURE); //the
> > program crash in debug
> > //right here
> > or any way i used m_wndStatusBar
>
> > m_wndStatusBar.GetPaneInfo(nIndex, uiPane, uiStyle, uiWidth);
>
> > CDC *pDC;
> > pDC = m_wndStatusBar.GetDC();
> > pDC->SelectObject(m_wndStatusBar.GetFont());
> > pDC->DrawText(_T(ptrText->ReturnStr()), -1, rectPane, DT_CALCRECT);
> > m_wndStatusBar.ReleaseDC(pDC);
> > m_wndStatusBar.SetPaneInfo(nIndex, uiPane, uiStyle,
> > rectPane.Width());
> > m_wndStatusBar.SetPaneText(nIndex, ptrText->ReturnStr());
>
> > }
> > where jcStr is an object similar to CString
>
> > i created a thread which updates the string pointer every 1 second and
> > calls the above function to update the status bar.
>
> > also when i ran the same application on a different computer(the
> > release mode) then status bar would not show the elapsed time, while
> > it shows the same in my computer
>
> > please point me in the right direction
>
> > jc


Re: CStatusBar by Ulrich

Ulrich
Thu Dec 06 07:53:02 PST 2007

jc wrote:
> i'm writing a Data acquisition software. when i start the recording i
> wanted to show the elapsed time in the status bar and once the
> recording is stopped, the status bar should show "Rec Stopped"
[...]
> i created a thread which updates the string pointer every 1 second and
> calls the above function to update the status bar.

Apart from what was already said, I would also suggest that you use a timer
instead of a separate thread to update the status bar. The advantage is
that you avoid the whole bunch of thread-synchronisation issues. The
disadvantage is that the timer routine must not block execution because
otherwise it freezes the whole UI, but unless your thread is a worker
thread this is irrelevant.

Uli


Re: CStatusBar by Tom

Tom
Thu Dec 06 09:27:44 PST 2007

Glad that worked for you...

Tom

"jc" <k.jayachandran@gmail.com> wrote in message
news:8c441ffc-cb72-43b4-aee6-407c9c0543a5@w34g2000hsg.googlegroups.com...
> thanks your suggestion solved the problem i think
> i created a message function which will called the UpdateStatusBar
> function and my worker thread did a PostMessage from that function.
>
> now the debug mode doesn't crash. i have to create a release output
> and move to a lab pc and test my code over there
>
> thanks everybody for your help
>
> jc
> On Dec 6, 12:24 am, "Tom Serface" <tom.nos...@camaswood.com> wrote:
>> Are you attempting to update the status bar in the main GUI thread from
>> a
>> worker thread? If so, I'd do it by sending a message to the GUI thread
>> (most likely handled in the mainframe) telling it to update the status
>> bar.
>> You get into all kinds of trouble when you try to call GUI code in the
>> main
>> thread from "other threads".
>>
>> I would use PostMessage() from the worker thread to send messages to
>> update
>> the status bar.
>>
>> Tom


Re: CStatusBar by jc

jc
Fri Dec 07 08:00:34 PST 2007

Ulrich,

my worker thread is basically a timer thread, with a wait time of 1000
millisec, and it is not part of my data acquisition thread, the
program works in all lab pcs in the release mode too. so i guess that
solves my problem.
i learned a very valuable lesson. don't mess stuffs in the gui thread
with a worker thread.
if you want to do stuffs with the gui, then just post a message and
let windows take care of it.

thanks
jc
On Dec 6, 11:27 am, "Tom Serface" <tom.nos...@camaswood.com> wrote:
> Glad that worked for you...
>
> Tom
>
> "jc" <k.jayachand...@gmail.com> wrote in message
>
> news:8c441ffc-cb72-43b4-aee6-407c9c0543a5@w34g2000hsg.googlegroups.com...
>
> > thanks your suggestion solved the problem i think
> > i created a message function which will called the UpdateStatusBar
> > function and my worker thread did a PostMessage from that function.
>
> > now the debug mode doesn't crash. i have to create a release output
> > and move to a lab pc and test my code over there
>
> > thanks everybody for your help
>
> > jc
> > On Dec 6, 12:24 am, "Tom Serface" <tom.nos...@camaswood.com> wrote:
> >> Are you attempting to update the status bar in the main GUI thread from
> >> a
> >> worker thread? If so, I'd do it by sending a message to the GUI thread
> >> (most likely handled in the mainframe) telling it to update the status
> >> bar.
> >> You get into all kinds of trouble when you try to call GUI code in the
> >> main
> >> thread from "other threads".
>
> >> I would use PostMessage() from the worker thread to send messages to
> >> update
> >> the status bar.
>
> >> Tom


Re: CStatusBar by Tom

Tom
Fri Dec 07 09:54:27 PST 2007

That sort of thing happens all the time and we get questions here almost
weekly where people try to update controls directly from threads or other
windows. PostMessage() is almost always a better way to do it, but it's not
so obvious as just grabbing a pointer and calling a function.

Tom

"jc" <k.jayachandran@gmail.com> wrote in message
news:c6fe6e54-c222-471f-9fa2-9079ae2422c7@p69g2000hsa.googlegroups.com...
> Ulrich,
>
> my worker thread is basically a timer thread, with a wait time of 1000
> millisec, and it is not part of my data acquisition thread, the
> program works in all lab pcs in the release mode too. so i guess that
> solves my problem.
> i learned a very valuable lesson. don't mess stuffs in the gui thread
> with a worker thread.
> if you want to do stuffs with the gui, then just post a message and
> let windows take care of it.
>
> thanks
> jc
> On Dec 6, 11:27 am, "Tom Serface" <tom.nos...@camaswood.com> wrote:
>> Glad that worked for you...
>>
>> Tom
>>
>> "jc" <k.jayachand...@gmail.com> wrote in message
>>
>> news:8c441ffc-cb72-43b4-aee6-407c9c0543a5@w34g2000hsg.googlegroups.com...
>>
>> > thanks your suggestion solved the problem i think
>> > i created a message function which will called the UpdateStatusBar
>> > function and my worker thread did a PostMessage from that function.
>>
>> > now the debug mode doesn't crash. i have to create a release output
>> > and move to a lab pc and test my code over there
>>
>> > thanks everybody for your help
>>
>> > jc
>> > On Dec 6, 12:24 am, "Tom Serface" <tom.nos...@camaswood.com> wrote:
>> >> Are you attempting to update the status bar in the main GUI thread
>> >> from
>> >> a
>> >> worker thread? If so, I'd do it by sending a message to the GUI
>> >> thread
>> >> (most likely handled in the mainframe) telling it to update the status
>> >> bar.
>> >> You get into all kinds of trouble when you try to call GUI code in the
>> >> main
>> >> thread from "other threads".
>>
>> >> I would use PostMessage() from the worker thread to send messages to
>> >> update
>> >> the status bar.
>>
>> >> Tom
>