掌握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多线程窗口程序设计的更多相关文章

  1. Windows多线程多任务设计初步(转)

    Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...

  2. windows多线程编程星球(一)

    以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...

  3. windows多线程没那么难

    windows多线程没那么难 作者:vpoet mail:vpoet_sir@163.com 上一博文中我们引入了CreateThread()多线程编程一个简单的例子,事实上我说windows 多线程 ...

  4. Windows多线程编程入门

    标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...

  5. [转]Windows的窗口刷新机制

    1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序 ...

  6. Windows多线程

    //简单的引出多线程是肿么回事儿....当点击下载的时候,下载内容还没结束也可以点击资源库,其实这就用了另一个线程,弹出“下载完成”对话框的时候,没有点击确定是不能点击主页面内容的,这就是用----- ...

  7. 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

    眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...

  8. 总结windows多线程同步互斥

    windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...

  9. Windows多线程学习随笔

    自学Windows多线程知识,例程如下: #include <iostream> #include <windows.h> #include <process.h> ...

随机推荐

  1. 【DC010沙龙年度合集】顶尖Hacking技术盛宴(文末福利)

    岁末盘点,让我们一起回顾2017年DEFCON GROUP 010带来的那些最前端的Hacker技术,体验原汁原味的mini DEFCON黑客大会,满满的干货帮你开启Hacker技术大门     &g ...

  2. js事件委托 jQuery写法

    http://www.cnblogs.com/liugang-vip/p/5616484.html 不是抄的,这篇文章写的细 这是js 事件委托写法 <!DOCTYPE html> < ...

  3. js处理url中的请求参数(编码/解码)

    在处理 a 链接跳转其他页面时,总会遇到需要传递一些当前页面的信息到其他页面,然后其他页面利用这些信息进行相关操作.利用 get 请求或 hash 传递是常见的方式. 首先,需要对传递的参数进行编码, ...

  4. Jmeter服务器监控 serveragent如何使用

    安装jmeter插件Plugins Managerjmeter-plugins.org推出了全新的Plugins Manager,对于其提供的插件进行了集中的管理,我们只需要安装这个管理插件,即可以在 ...

  5. C#里面获取web和非web项目路径

    非Web程序获取路径几种方法如下: 1.AppDomain.CurrentDomain.BaseDirectory  2.Environment.CurrentDirectory 3.HttpRunt ...

  6. POJ 2243

    #include <iostream> #include <queue> using namespace std; ][] = {-,-,-,,,-,,,,-,-,-,,,-, ...

  7. JavaScript函数理解

    本文参考自简书javaScript之函数详解 这里从函数的构造函数开始. 在js中,函数都是对象,它们都是Function构造函数的实例.因此,类似Java中的对象,函数名可以理解为指向该Functi ...

  8. jython实现java运行python代码

    Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现.最近的一个项目需要将python代码转换成java实现,所以用了一 ...

  9. 【Express系列】第4篇——使用session

    session 在 web 应用中使用很普遍,不过在 node 上面,要用 session 还真得折腾一番才行. 从加入中间件,到 session 的写入.清除,当时是遇到了不少坑的. 当然也可能是我 ...

  10. tomcat安装以及常用配置

    目录 一 什么是tomcat 二 tomcat 的版本: 三 tomcat的下载 3.1 tomcat9版本下载链接 3.2 tomcat8.5版本下载链接 四 tomcat的安装 4.1 java环 ...