    /*
     * Status Bar Print Formatted
     * Форматный вывод в строку состояния
     * (c) 2000 Sergey Radkevitch
     * www.mtu-net.ru/syr
     *
     * В этом файле определены функции
     * sbprintf, vsbprintf и AfxSBPrintf
     * позволяющие производить вывод в строку
     * состояния программы аналогично функции sprintf
     */

    #include "stdafx.h"

    extern void AfxSBprintf(LPCTSTR lpctstrFmt, ...);
    extern int sbprintf(CStatusBar* pStatusBar, LPCTSTR lpctstrFmt, ...);
    extern int vsbprintf(CStatusBar* pStatusBar, LPCTSTR lpctstrFmt, va_list vaArgPtr);

    int vsbprintf(CStatusBar* pStatusBar, LPCTSTR lpctstrFmt, va_list vaArgPtr)
    {
    #if defined(FAST_AND_DIRTY)
    	TCHAR Buffer[256];
    	int nLen=vsprintf(Buffer, lpctstrFmt, vaArgPtr);
    	pStatus->SetPaneText(0,Buffer);
    #else
    	FILE* f=fopen("NUL","a");
    	if(f==0)
    	{
    		return -1;
    	}
    	int nLen=vfprintf(f,lpctstrFmt,vaArgPtr);
    	fclose(f);
    	if(nLen<0)
    	{
    		return nLen;
    	}
      #if defined(USE_DYNAMIC_MEMORY)
    	LPTSTR lpstrBuffer=new TCHAR[nLen+1];
      #else
    	LPTSTR lpstrBuffer=static_cast<LPSTR>(_alloca(nLen+1));
      #endif
    	nLen=vsprintf(lpstrBuffer, lpctstrFmt, vaArgPtr);
    	if(nLen<0)
    	{
      #if defined(USE_DYNAMIC_MEMORY)
    		delete[] lpstrBuffer;
      #endif
    		return nLen;
    	}
    	BOOL bCode=pStatusBar->SetPaneText(0,lpstrBuffer);
      #if defined(USE_DYNAMIC_MEMORY)
    	delete[] lpstrBuffer;
      #endif
    	if(bCode==0)
    	{
    		return -1;
    	}
    #endif
    	pStatusBar->UpdateWindow();
    	return nLen;
    }

    int sbprintf(CStatusBar* pStatusBar, LPCTSTR lpctstrFmt, ...)
    {
    	va_list vaArgPtr;
    	va_start(vaArgPtr, lpctstrFmt);
    	int nLen=vsbprintf(pStatusBar,lpctstrFmt,vaArgPtr);
    	va_end(vaArgPtr);
    	return nLen;
    }

    void AfxSBprintf(LPCTSTR lpctstrFmt, ...)
    {
    // search for status bar
    	if (AfxGetApp() == NULL || AfxGetApp()->m_pMainWnd == NULL)
    	{
    		return;
    	}
    	CStatusBar* pStatusBar = (CStatusBar*)
    		AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
    	if(pStatusBar==NULL)
    	{
    		return;
    	}
    // output string
    	va_list vaArgPtr;
    	va_start(vaArgPtr, lpctstrFmt);
    	if(vsbprintf(pStatusBar,lpctstrFmt,vaArgPtr)<0)
    	{
    		pStatusBar->SetPaneText(0, _T(""));
    		pStatusBar->UpdateWindow();
    	}
    	va_end(vaArgPtr);
    }