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被暂停。
windows多线程窗口程序设计的更多相关文章
- Windows多线程多任务设计初步(转)
Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
- windows多线程没那么难
windows多线程没那么难 作者:vpoet mail:vpoet_sir@163.com 上一博文中我们引入了CreateThread()多线程编程一个简单的例子,事实上我说windows 多线程 ...
- Windows多线程编程入门
标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...
- [转]Windows的窗口刷新机制
1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序 ...
- Windows多线程
//简单的引出多线程是肿么回事儿....当点击下载的时候,下载内容还没结束也可以点击资源库,其实这就用了另一个线程,弹出“下载完成”对话框的时候,没有点击确定是不能点击主页面内容的,这就是用----- ...
- 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化
眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- Windows多线程学习随笔
自学Windows多线程知识,例程如下: #include <iostream> #include <windows.h> #include <process.h> ...
随机推荐
- 简单的卷积神经网络(CNN)的搭建
卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现.与普通神经网络非常相 ...
- GitHub项目加入Travis-CI的自动集成
Travis-CI是为github量身打造的自动集成环境,如果我们的项目托管在github上,可以十分方便的使用Travis-CI做自动集成. 使用Travis-CI十分的简单,首先打开Travis- ...
- 深入理解java内存模型
深入理解Java内存模型(一)——基础 深入理解Java内存模型(二)——重排序 深入理解Java内存模型(三)——顺序一致性 深入理解Java内存模型(四)——volatile 深入理解Java内存 ...
- Mybatis常用知识点总结
1. #{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc ...
- Gson简单使用
最近做个IM类型的Android 应用,由于有三种客户端(pc,ios,Android),所以底层使用的是C++与服务器通信,所以通信部分基本上有c++完成,封装好Jni即可,可以把底层c++通信看成 ...
- leetcode-917-仅仅反转字母
题目描述: 给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转. 示例 1: 输入:"ab-cd" 输出:"dc-b ...
- Backing Up and Restoring HBase Data
There are two strategies for backing up HBase:1> Backing it up with a full cluster shutdown2> ...
- 【java排序】 归并排序算法、堆排序算法
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- 【Java并发编程】:并发新特性—Lock锁和条件变量
简单使用Lock锁 Java5中引入了新的锁机制——Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...
- apache URL重写 标志表 以及 错误解决方法
Apache mod_rewrite规则重写的标志一览 1) R[=code](force redirect) 强制外部重定向 强制在替代字符串加上http://thishost[:thisport] ...