}
m_hThread = (HANDLE)_beginthreadex(NULL,0,ThreadProc,(void*)this,0,&m_threadID);
if (NULL == m_hThread)
{
TRACE("创建线程失败");
OnOK();
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CDlgProcessBar::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类www.2cto.com
if (pMsg->message==WM_KEYDOWN && (pMsg->wParam==VK_RETURN ||
pMsg->wParam==VK_ESCAPE || pMsg->wParam==VK_SPACE))
{
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CDlgProcessBar::OnOK()
{
// TODO: Add your specialized code here and/or call the base class
if (NULL != m_hThread)
{
WaitForSingleObject(m_hThread,INFINITE);
m_hThread = NULL;
}
ob = NULL;
CDialog::OnOK();
}
// DlgProcessBar.cpp : implementation file
//
#include "stdafx.h"
#include "DlgProcessBar.h"
#include "process.h"
#include "../Observer.h"
// CDlgProcessBar dialog
IMPLEMENT_DYNAMIC(CDlgProcessBar, CDialog)
CDlgProcessBar::CDlgProcessBar(CWnd* pParent /*=NULL*/)
: CDialog(CDlgProcessBar::IDD, pParent)
{
ob = NULL;
m_hThread = NULL;
}
CDlgProcessBar::~CDlgProcessBar()
{
ob = NULL;
if (NULL != m_hThread)
{
WaitForSingleObject(m_hThread,INFINITE);
m_hThread = NULL;
}
}
void CDlgProcessBar::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_PROGRESS, m_ProcessCtl);
DDX_Control(pDX, IDC_STATIC_NOTE, m_StaticCtl);
}
BEGIN_MESSAGE_MAP(CDlgProcessBar, CDialog)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
// CDlgProcessBar message handlers
unsigned __stdcall CDlgProcessBar::ThreadProc(void *pArgParam)
{
TRACE("执行回调函数\r\n");
if (NULL == pArgParam)
{
TRACE("请设置线程参数\r\n");
_endthreadex(0);
}
CDlgProcessBar *dlg = (CDlgProcessBar *)pArgParam;
if (NULL == dlg->ob)
{
TRACE("请设置观察者\r\n");
_endthreadex(0);
}
TRACE(L"Call CallBack Function\r\n");
dlg->ob->CallbackFunc();
TRACE(L"End CallBack Function\r\n");
if (NULL != dlg->GetSafeHwnd())
{
TRACE(L"Post Message\r\n");
dlg->PostMessage(WM_COMMAND,
MAKEWPARAM(IDOK,BN_CLICKED),(LPARAM)dlg->GetSafeHwnd());
}
return 0;
}
BOOL CDlgProcessBar::SetCallBack(CObserver *ob)
{
if (NULL == ob)
{
TRACE("设置观察者失败");
return FALSE;
}
this->ob = ob;
return TRUE;
}
BOOL CDlgProcessBar::SetNotice(const CString ice /* = L"正在处理..." */,
const COLORREF &color /* = RGB */)
{
m_TextColor = color;
m_StaticCtl.SetWindowText(notice);
RedrawWindow(); //
return TRUE;
}
BOOL CDlgProcessBar::InitProcessBar(const int &range)
{
m_ProcessCtl.SetRange(0,range);
return TRUE;
}
BOOL CDlgProcessBar::SetProcessBar(const int &inc)
{
int iCurPos = m_ProcessCtl.GetPos();
m_ProcessCtl.SetPos(iCurPos + inc);
return TRUE;
}
HBRUSH CDlgProcessBar::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch (nCtlColor)
{
case CTLCOLOR_STATIC:
pDC->SetTextColor(m_TextColor);
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
default:
return CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
}
}
BOOL CDlgProc