掌握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. django 自定义中间件 middleware

    Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ...

  2. http 协议 c++代码 获取网页

    最近接触了些 html 和 JavaScript,索性了解下 http 协议.在园子里找到了 HTTP协议详解,图文并茂,很爽! 于是小小的尝试了下 #include <WinSock2.h&g ...

  3. JavaScript ES6 核心功能一览(转)

    原文地址:Overview of JavaScript ES6 features (a.k.a ECMAScript 6 and ES2015+) 原文作者:Adrian Mejia 译文出自:掘金翻 ...

  4. CentOS7搭建FastDFS V5.11分布式文件系统-第一篇

    1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...

  5. git连接通过ssh连接github

    解决 git连接通过ssh连接github 1. 首先产生一个rsa的私钥和公钥 ssh-keygen -t rsa -C "15950093214@163.com"  //你的g ...

  6. Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆

    Unity 使用有限状态机 完美还原 王者荣耀 虚拟摇杆 效果如图所示 摇杆的UI组成 如图所示 简单的可以认为摇杆由1.2.3贴图组成 为摇杆的底座 为摇杆的杆 为摇杆的指向 可以理解这就是街机上的 ...

  7. 自动安装zabbix_agent脚本 -- python2

    #!/usr/bin/env python # -*- coding: utf-8 -*- import os ZABBIX_SERVER_IP='10.171.100.28' if os.path. ...

  8. (转)十分钟了结MySQL information_schema

    十分钟了结MySQL information_schema  原文:http://www.cnblogs.com/shengdimaya/p/6920677.html information_sche ...

  9. tomcat启动(Ⅶ)请求处理--Processor.process(SocketWrapper<S> socketWrapper)

    tomcat启动(六)Catalina分析-StandardServer.start() 上一篇分析到:Http11NioProcessor.process(SocketWrapper<S> ...

  10. mongodb-mongotemplate进行地理坐标操作

    因为项目中使用的springboot + mongotemplate, 所以还是需要mongotemplate的操作方式 首先建立一个bean: package com.iwhere.easy.tra ...