📄 sampleview.cpp
字号:
// SampleView.cpp : implementation of the CSampleView class
//
#include "stdafx.h"
#include "Sample.h"
#include "SampleDoc.h"
#include "SampleView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSampleView
IMPLEMENT_DYNCREATE(CSampleView, CView)
BEGIN_MESSAGE_MAP(CSampleView, CView)
//{{AFX_MSG_MAP(CSampleView)
ON_COMMAND(ID_RUN_THREAD, OnRunThread)
ON_UPDATE_COMMAND_UI(ID_RUN_THREAD, OnUpdateRunThread)
ON_COMMAND(ID_RUN_STOP, OnRunStop)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
//添加自定义消息处理函数
ON_MESSAGE (WM_USER_THREAD_FINISHED, OnThreadFinished)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSampleView construction/destruction
CSampleView::CSampleView()
{
// TODO: add construction code here
IsRun = false;
}
CSampleView::~CSampleView()
{
}
BOOL CSampleView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CSampleView drawing
void CSampleView::OnDraw(CDC* pDC)
{
CSampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rt;
GetClientRect(&rt);
int x,y;
x = (int)rt.Width()/2;
y = (int)rt.Height()/2;
CString str;
str.Format("子线程运行: %d 次",GetDocument()->ThreadNum);
pDC->SetTextAlign(TA_CENTER);
pDC->SetTextColor(RGB(0,0,255));
pDC->TextOut(x,y,str);
}
/////////////////////////////////////////////////////////////////////////////
// CSampleView printing
BOOL CSampleView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CSampleView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CSampleView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CSampleView diagnostics
#ifdef _DEBUG
void CSampleView::AssertValid() const
{
CView::AssertValid();
}
void CSampleView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CSampleDoc* CSampleView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSampleDoc)));
return (CSampleDoc*)m_pDocument;
}
#endif //_DEBUG
//----------------CSampleView message handlers-----------------------------
//---------------自定义消息处理函数,调用MFC成员函数------------------------
void CSampleView::OnThreadFinished(WPARAM wParam, LPARAM lParam)
{
Invalidate(); //调用OnDraw()
char frame_num[20];
memset(frame_num, 0, sizeof(frame_num));
CMainFrame* MFrame = (CMainFrame*)AfxGetMainWnd();
sprintf(frame_num,"子线程运行次数: %d",GetDocument()->ThreadNum);
MFrame->m_wndStatusBar.SetPaneText (1,frame_num,true); //更新状态栏内容
}
//---------------------启动线程-----------------------------------------
void CSampleView::OnRunThread()
{
//指针调用MFC成员函数
/*CWnd* pWnd = ::AfxGetMainWnd();
AfxBeginThread (ThreadFunc, pWnd,
THREAD_PRIORITY_NORMAL,
0,0,NULL);*/
//句柄调用MFC成员函数
/*CWnd* pWnd = ::AfxGetMainWnd();
AfxBeginThread (ThreadFunc, pWnd->m_hWnd,
THREAD_PRIORITY_NORMAL,
0,0,NULL);*/
//通过消息调用MFC成员函数
IsRun = true;
THREADPARMS* ptp = new THREADPARMS;
ptp->pt = this; //当前视图类指针
ptp->hWnd = this->m_hWnd; //视图类句柄
AfxBeginThread (ThreadFunc, ptp,
THREAD_PRIORITY_NORMAL,
0,0,NULL);
}
void CSampleView::OnUpdateRunThread(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(IsRun);
}
//--------------------线程控制函数-----------------------------------
//通过指针调用MFC成员函数
/*UINT ThreadFunc (LPVOID pParam)
{
CWnd* pWnd = (CWnd*)pParam;
pWnd->GetParent();
return 0;
}*/
//通过句柄调用MFC成员函数
/*UINT ThreadFunc (LPVOID pParam)
{
CWnd* pWnd = CWnd::FromHandle((HWND)pParam);
pWnd->GetParentFrame();
return 0;
}*/
//通过发送消息调用MFC成员函数
UINT ThreadFunc (LPVOID pParam)
{
THREADPARMS* ptp = (THREADPARMS*) pParam;
CSampleView* pt = (CSampleView*)ptp->pt; //得到视图类指针
HWND hWnd = ptp->hWnd;
delete ptp;
while(pt->IsRun)
{
Sleep(100);
pt->GetDocument()->ThreadNum++;
::PostMessage (hWnd, WM_USER_THREAD_FINISHED, 0, 0);//发送消息
}
return 0; //关闭线程
}
//-------------------------停止线程运行------------------------------
void CSampleView::OnRunStop()
{
IsRun = false;
}
void CSampleView::OnDestroy()
{
CView::OnDestroy();
IsRun = false;
}
//----------------------------The End---------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -