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> ...
随机推荐
- python 十进制 和 IP 地址互转
#! /bin/python def ip2decimalism(ip): dec_value = 0 v_list = ip.split('.') v_list.reverse() t = 1 fo ...
- leetcode 90. 子集 II JAVA
题目: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2] ...
- 学习 swift (1)
https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwi ...
- Java并发工具类之并发数控制神器Semaphore
Semaphore(信号量)使用来控制通知访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 我们可以这么理解Semaphore,比如一个厕所只有6个坑,同时只能满足6个人上厕所( ...
- [Swift实际操作]七、常见概念-(2)点CGPoint和变形CGAffineTransform的使用
本文将为你演示点对象CGPoint的使用,其中CG表示来自CoreGraphic(核心图形)这个跨平台框架 首先导入需要使用的两个框架第一个框架表示界面工具框架第二个框架表示核心绘图和动画框架 imp ...
- ubuntu14.04 安装五笔输入法(fcitx)
ubuntu 14.04安装完成之后,一打字,默认的ibus一直在显示.解决办法,直接卸载ibus,使用fcitx. fictix拼音有fcitx-pinyin.fcitx-sogoupinyin.f ...
- centos安装python与jdk
安装python #压缩包安装 [root@china ~]# yum -y install zlib* Loaded plugins: fastestmirror, refresh-packagek ...
- (转)Mysql技术内幕InnoDB存储引擎-事务&备份&性能调优
事务 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC ...
- SQLite使用入门
什么是SQLite SQLite是一款非常轻量级的关系数据库系统,支持多数SQL92标准.SQLite在使用前不需要安装设置,不需要进程来启动.停止或配置,而其他大多数SQL数据库引擎是作为一个单独的 ...
- java文件上传-使用apache-fileupload组件
目前文件上传的(框架)组件:Apache----fileupload .Orialiy – COS – 2008() .Jsp-smart-upload – 200M. 用fileupload上传文件 ...