Здравствуйте, m16, Вы писали:
m16>Здравствуйте, rus blood, Вы писали:
m16>>>Как сделать, чтобы обновлялся???
RB>>Выведи прогресс-бар в другой поток.
m16>Вы предлагаете сделать второй интерфейсный поток. Таким образом, в программе будет два цикла обработки сообщений. Далее из второго потока создается прогресс бар и вешается на строку состояний, созданную в первом потоке.
m16>Есть ли у кого-нибудь пример?
Вот пример. Можно и красивее, наверно.
Есть диалог на MFC. На нем кнопка. По нажатию кнопки делаем следующее.
#include <process.h>
#include <atlbase.h>
...........
struct ThreadData
{
CTestMFCDlg* pDlg;
HANDLE hEvent;
};
UINT __stdcall ThreadProc(void* lParam)
{
ThreadData* pstData = (ThreadData*)lParam;
CTestMFCDlg* pDlg = pstData->pDlg;
HANDLE hEvent = pstData->hEvent;
CProgressCtrl ctrl;
ctrl.Create(WS_CHILD|WS_VISIBLE, CRect(10, 10, 100, 30), pDlg, 101);
ctrl.SetRange(0, 100);
ctrl.SetPos(0);
SetEvent(hEvent);
UINT nTimer = ctrl.SetTimer(1, 100, NULL);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (WM_TIMER == msg.message && msg.wParam == nTimer)
ctrl.SetPos(ctrl.GetPos() + 1);
DispatchMessage(&msg);
}
ctrl.KillTimer(nTimer);
ctrl.DestroyWindow();
return 0;
}
void CTestMFCDlg::OnButton1()
{
ThreadData stData;
stData.pDlg = this;
stData.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
UINT nID;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, &stData, 0, &nID);
AtlWaitWithMessageLoop(stData.hEvent);
CloseHandle(stData.hEvent);
Sleep(10000); // мертвый код. Вызываем ActiveX
::PostThreadMessage(nID, WM_QUIT, 0, 0);
AtlWaitWithMessageLoop(hThread);
CloseHandle(hThread);
}
ЗЫ
atlbase нужна только для функции AtlWaitWithMessageLoop — ожидание с прокруткой сообщений. Ее можно просто скопировать себе и забыть об atlbase.