设为首页 收藏本站
查看: 520|回复: 0

[经验分享] windows多线程窗口程序设计

[复制链接]

尚未签到

发表于 2017-6-28 11:20:49 | 显示全部楼层 |阅读模式
  掌握windows基于消息驱动的窗口应用程序设计的基本方法,掌握窗口程序资源的概念与设计,掌握常用的消息的程序处理方法,掌握文字图形输出相关函数编程。掌握设计的基本方法(选项),掌握时钟消息设计动画程序(选项)
  利用windows基于消息驱动的窗口应用程序设计的基本方法,利用常用的消息程序处理方法,设计一个多线程程序,然后用时钟动画将各线程的执行过程直观的表现出来。
  操作环境:安装有Windows操作系统PC机一台,实验环境为VS(任何版本都行).
  1.在vs中,生成一个空白的win32项目,了解win32的消息驱动,学习窗口程序资源的概念与设计,并为程序设计一个位图图标。
DSC0000.png DSC0001.png DSC0002.png

  2. 观察win32程序基本结构,了解常用的消息的程序处理方法,掌握文字图形输出相关函数编程,并练习文字与图形的输出。
  3.设计并构建程序用户界面
  菜单栏
DSC0003.png

  线程设置对话框
DSC0004.png

  菜单与对话框函数如下:
  // 分析菜单选择:
  LRESULTCALLBACK WndProc(HWNDhWnd, UINTmessage, WPARAMwParam, LPARAMlParam)
  {
  int wmId, wmEvent;
  PAINTSTRUCT ps;
  HDC hdc;
  int pausecount;
  switch (message)
  {
  caseWM_COMMAND:
  wmId    = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // 分析菜单选择:
  switch (wmId)
  {
  caseIDM_ABOUT:
  switch (DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About))
  {
  caseIDSTART:
  CreateThreadStart(hWnd);
  //GetSecurityInfo
  break;
  caseIDPAUSE:
  pausecount=SuspendThread((HANDLE)ThreadId[treatwith]);
  pausecount=SuspendThread(ThreadHandle[treatwith]);
  if(pausecount==-1)
  {
  pausecount=GetLastError();
  }
  break;
  caseIDRESET:
  pausecount=ResumeThread((HANDLE)ThreadId[treatwith]);
  pausecount=ResumeThread(ThreadHandle[treatwith]);
  if(pausecount==-1)
  {
  pausecount=GetLastError();
  }
  break;
  }
  break;
  
  caseIDM_EXIT:
  DestroyWindow(hWnd);
  break;
  default:
  returnDefWindowProc(hWnd, message, wParam, lParam);
  }
  break;
  caseWM_SIZE:
  wndWidthSize=LOWORD(lParam);
  wndHighSize=HIWORD(lParam);
  break;
  caseWM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  //TextOut(hdc,100,50,_T("SOUTH WEST UNIVERSITY"),wcslen(_T("SOUTH WEST UNIVERSITY")));
  // TODO: 在此添加任意绘图代码...
  EndPaint(hWnd, &ps);
  break;
  caseWM_DESTROY:
  PostQuitMessage(0);
  break;
  default:
  returnDefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
  }
  // "开始"对话框的消息处理程序。
  INT_PTRCALLBACK About(HWNDhDlg, UINTmessage, WPARAMwParam, LPARAMlParam)
  {
  UNREFERENCED_PARAMETER(lParam);
  switch (message)
  {
  caseWM_INITDIALOG:
  return (INT_PTR)TRUE;
  caseWM_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(HWNDhWnd)
  {
  bool SecurityDescriptorSuc=true;
  threadStruct *pthreadparam;
  UINT threadXuHao=0;
  int i=0;
  HANDLE handleRes;
  while(threadXuHao<threadNum)
  {
  pthreadparam=newthreadStruct;//到线程里面去释放
  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++;
  }
  }
  //绘图
  DWORDWINAPI PaintThread(LPVOIDlpParam)
  {
  UINT threadXuHao=((threadStruct*)lpParam)->threadXuHao;
  HWND hWnd=((threadStruct*)lpParam)->hWnd;
  deletelpParam;
  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;
  }
  五. 实验结果
  程序运行结果如下:
DSC0005.png

  其中,进程3被暂停。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-388923-1-1.html 上篇帖子: 背水一战 Windows 10 (48) 下篇帖子: windows 10 multiple editions x64 dvd.iso+密钥
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表