掌握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. 790. Domino and Tromino Tiling

    We have two types of tiles: a 2x1 domino shape, and an "L" tromino shape. These shapes may ...

  2. Axure学习了解

    我这次介绍的原型设计工具为Axure 一.区域介绍 这是主界面: 左上区域显示原型的各个界面,可以添加新界面: 左中包含各种原型设计所包含的组件,例如文本框,图片等: 左下是各种模板,模板由自己设计, ...

  3. Mac 设置终端中使用 sublime 打开文件

    在Mac下用终端创建文件等比较方便,但如果配合Sublime用,最好是可以直接在终端中输入命令就可以用Sublime打开指定文件或文件夹. #检查用户目录下有没有bin目录,如里没有就创建一个(目的是 ...

  4. 換根lca

    假設我們要求u,v,在根為rt情況下的lca 則lca為lca(u,v),lca(u,rt),lca(v,rt)中的深度的最大值

  5. clang 编译 OC

    clang -fobjc-arc -framework Foundation helloworld.m -o helloworld.out OVERVIEW: clang LLVM compiler ...

  6. [JavaScript] css将footer置于页面最底部

    <!-- 父层 --> <div id="wapper"> <!-- 主要内容 --> <div id="main-conten ...

  7. 无头结点的单链表(C语言)

    1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的, ...

  8. Maven 上传本地包到仓库 (来源于同事(gagahjt)的笔记本)

    1:将本地jar包导入到自己的Maven仓库 mvn install:install-file -Dfile=D:\\kaptcha-2.3.2.jar -DgroupId=com.google -D ...

  9. SS配置

    { "server":"0.0.0.0", "server_port":8388, "local_address": & ...

  10. 弹幕和回到顶部前端web

    弹幕和回到顶部前端web 弹幕 1.效果演示 2.相关代码 <!DOCTYPE html> <html lang="en"> <head> &l ...