Отправляет email-рассылки с помощью сервиса Sendsay

Школа программирования

  Все выпуски  

Школа программирования


Добавим визуальности

    Добавим скролбар в наш всплывающий диалог. А то как-то непонятно получается, сколько времени еще ждать:) Конечно, можно посмотреть сколько осталось времени, наведя мышку на иконку программы. Сама иконка покажет, правда если так можно сказать в четвертинках, сколько еще времени ждать, а также всплывающая подсказка более точно и по-русски:) Но это не удобно, согласитесь. Поэтому надо добавить в нашу html страницу javascript progressbar. Я полазил по инету и нашел, что хотел. Правда не с первого раза, но нашел:) Просто и удобно, дешево и сердито, короче нашел вот здесь http://forumsblogswikis.com/2008/10/06/javascript-progress-bar-indicator/. Сама идея очень простая - делаем div с фоном и в этом div рисуем картинку.

Выглядеть это будет примерно так

11_1


А сам html код такой

<html>
<head>


<style type="text/css">
html,body {
overflow: auto;
}

.statusBar    {
    background: url(./images/white.gif);
    background-repeat: repeat-x;
    width: 700px;
    height: 15px;
    border:1px solid silver;
    overflow: hidden;

    }
.whiteOverlay {
    float:left;
    height:15px;
    width: 0px;
    margin-left: -4px;
    }
</style>


<script type="text/javascript">
function setPercentage(percentage)
    {
    newWidth = (percentage * 7) + 'px';
    document.getElementById('whiteOverlay').style.width = newWidth;
    }

//http://forumsblogswikis.com/2008/10/06/javascript-progress-bar-indicator/

</script>


</head>

<body>
<table width=100% height=100% border=0>
<tr><td>
<center>
<img src="./images/cup.png" align="middle">
<br><br>

<div id="statusIndicator" class="statusBar"><img class="whiteOverlay" id="whiteOverlay" src="./images/statusIndicator.png"></div>


</center>
</td></tr>



</table>
</body>
</html>


Чтобы прогрессбар двигался, нужно вызывать функцию
setPercentage. Кажется просто? Есть закавыка:) Нам нужно вызывать javascript функцию из программы на c++. Отправимся по этому поводу в инет:) Нам поможет CodeProject - http://www.codeproject.com/KB/COM/jscalls.aspx. Статья называется Javascript call from C++. Из нее Вы, если знаете английский, можете узнать как вызвать функцию на javascript из Вашей программы на C++. Если не знаете - я Вам сейчас расскажу. Значит так, берите вот такую функцию

bool DLG_SPLASH::CallJScript(const CString strFunc, const CStringArray& paramArray,CComVariant* pVarResult)
{
    CComPtr<IDispatch> spScript;

    HRESULT hr;
    LPDISPATCH pDispatch;
    hr = m_browser->get_Document(&pDispatch);       

    IHTMLDocument* pHtmlDoc;
    hr = pDispatch->QueryInterface( __uuidof( IHTMLDocument ), (void**)&pHtmlDoc );
    pDispatch->Release();

    pHtmlDoc->get_Script(&spScript);

    CComBSTR bstrMember(strFunc);
    DISPID dispid = NULL;
    hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1, LOCALE_SYSTEM_DEFAULT,&dispid);
   
    if(FAILED(hr))
    {
//        ShowError(GetSystemErrorMessage(hr));
        return false;
    }
   
    const int arraySize = paramArray.GetSize();
   
    DISPPARAMS dispparams;
    memset(&dispparams, 0, sizeof dispparams);
    dispparams.cArgs = arraySize;
    dispparams.rgvarg = new VARIANT[dispparams.cArgs];
   
    for( int i = 0; i < arraySize; i++)
    {
        CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i); // back reading
        bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
        dispparams.rgvarg[i].vt = VT_BSTR;
    }
    dispparams.cNamedArgs = 0;
   
    EXCEPINFO excepInfo;
    memset(&excepInfo, 0, sizeof excepInfo);
       CComVariant vaResult;
    UINT nArgErr = (UINT)-1;  // initialize to invalid arg
   
    hr = spScript->Invoke(dispid,IID_NULL,0, DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);
   
    delete [] dispparams.rgvarg;
    if(FAILED(hr))
    {
        //ShowError(GetSystemErrorMessage(hr));
        return false;
    }
   
    if(pVarResult)
    {
        *pVarResult = vaResult;
    }

    return true;
}

и вызываете ее вот так:

void DLG_SPLASH::SetRestTimePercentsToJavaScript(int _percents)
{
    CString str;
    str.Format("%d",_percents);

    CStringArray paramArray;
    paramArray.Add(str);
   
    CComVariant pVarResult;

    CallJScript("setPercentage", paramArray, &pVarResult);
}

Как можно заметить, значение мы передаем как строку, а javascript сам переводит его в число.
Немного изменим наш метод показа сплеш окна - будем загружать html страницу каждый раз, как только сплеш окно появится на экране.

void DLG_SPLASH::SplashShow()
{
    LoadProject();
    ShowWindow(SW_SHOW);
}

Это позволит нам.... а в прочем это в следующий раз:)
Исходники можно скачать тут - http://program-school.narod.ru/source/waterEyeKeeper5.zip

В избранное