windows多线程窗口程序设计
掌握windows基于消息驱动的窗口应用程序设计的基本方法,掌握窗口程序资源的概念与设计,掌握常用的消息的程序处理方法,掌握文字图形输出相关函数编程。掌握设计的基本方法(选项),掌握时钟消息设计动画程序(选项)
利用windows基于消息驱动的窗口应用程序设计的基本方法,利用常用的消息程序处理方法,设计一个多线程程序,然后用时钟动画将各线程的执行过程直观的表现出来。
操作环境:安装有Windows操作系统PC机一台,实验环境为VS(任何版本都行).
1.在vs中,生成一个空白的win32项目,了解win32的消息驱动,学习窗口程序资源的概念与设计,并为程序设计一个位图图标。
2. 观察win32程序基本结构,了解常用的消息的程序处理方法,掌握文字图形输出相关函数编程,并练习文字与图形的输出。
3.设计并构建程序用户界面
菜单栏
线程设置对话框
菜单与对话框函数如下:
// 分析菜单选择:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
int pausecount;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
switch (DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About))
{
case IDSTART:
CreateThreadStart(hWnd);
//GetSecurityInfo
break;
case IDPAUSE:
pausecount=SuspendThread((HANDLE)ThreadId[treatwith]);
pausecount=SuspendThread(ThreadHandle[treatwith]);
if(pausecount==-1)
{
pausecount=GetLastError();
}
break;
case IDRESET:
pausecount=ResumeThread((HANDLE)ThreadId[treatwith]);
pausecount=ResumeThread(ThreadHandle[treatwith]);
if(pausecount==-1)
{
pausecount=GetLastError();
}
break;
}
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_SIZE:
wndWidthSize=LOWORD(lParam);
wndHighSize=HIWORD(lParam);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//TextOut(hdc,100,50,_T("SOUTH WEST UNIVERSITY"),wcslen(_T("SOUTH WEST UNIVERSITY")));
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// "开始"对话框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDPAUSE)
{
treatwith=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDRESET)
{
treatwith=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDSTART)
{
threadNum=GetDlgItemInt(hDlg,IDC_EDIT1,NULL,TRUE);
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
4.编写多线程创建函数,创建多个线程,编写动画绘图函数绘制图形,每个线程都调用绘图函数,在用户区中绘制动画,以直观表现线程的运行。具体代码如下:
//线程创建
void CreateThreadStart(HWND hWnd)
{
bool SecurityDescriptorSuc=true;
threadStruct *pthreadparam;
UINT threadXuHao=0;
int i=0;
HANDLE handleRes;
while(threadXuHao<threadNum)
{
pthreadparam=new threadStruct;//到线程里面去释放
pthreadparam->hWnd=hWnd;
pthreadparam->threadXuHao=threadXuHao;
if(SecurityDescriptorSuc==false)
{
//handleRes=CreateThread(&sa,0,PaintThread,
// (LPVOID)pthreadparam,0,&ThreadId[threadXuHao]);
ThreadHandle[threadXuHao]=handleRes;
}
else
{
handleRes=CreateThread(NULL,0,PaintThread,
(LPVOID)pthreadparam,0,&ThreadId[threadXuHao]);
ThreadHandle[threadXuHao]=handleRes;
}
threadXuHao++;
}
}
//绘图
DWORD WINAPI PaintThread(LPVOID lpParam)
{
UINT threadXuHao=((threadStruct*)lpParam)->threadXuHao;
HWND hWnd=((threadStruct*)lpParam)->hWnd;
delete lpParam;
HDC hdc=GetDC(hWnd);
/*UINT currentHigh=wndHighSize-1;*/
wchar_t str[100];
swprintf(str,_T("this is the %d thread"),threadXuHao);
TextOut(hdc, 50 * (threadXuHao + 1) - 40 , 50 * (threadXuHao + 1) - 40 + (threadXuHao + 1) * 5, str, wcslen(str));
/*UINT rectWidth;
rectWidth=wndWidthSize/threadNum;*/
//HFONT X=CreateHfont
/*HPEN logicPen=CreatePen(PS_SOLID,3,logicColor[threadXuHao]);*/
HPEN logicPen = CreatePen(PS_SOLID, 3, RGB(50 * threadXuHao - 80, 20 * threadXuHao, 10*threadXuHao+150));
HPEN oldPenObj;
RECT rc;
GetClientRect(hWnd, &rc);
int n = 0;
int x=0;
int y = 0;
while (x<wndWidthSize)
{
x = 50 * (threadXuHao + 1) -40+150;
y = 50 * (threadXuHao+1)-40;
/*if (y > wndHighSize)
y -= wndHighSize;*/
int m = 10*(threadXuHao+1);
//MoveToEx(hdc,rectWidth*threadXuHao,currentHigh,NULL);
oldPenObj=(HPEN)SelectObject(hdc,(HGDIOBJ)logicPen);
//LineTo(hdc,(rectWidth-30)*(threadXuHao+1),currentHigh);
Ellipse(hdc, x+n ,y, x + m+n , y+m);
SelectObject(hdc,(HGDIOBJ)oldPenObj);
//currentHigh=currentHigh-3;
n += (threadXuHao + 1) * 5;
Sleep((threadXuHao+1)*200);
}
ReleaseDC(hWnd,hdc);
return 1;
}
五. 实验结果
程序运行结果如下:
其中,进程3被暂停。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?