正文

关于窗口、进程和线程的初步探讨2008-04-13 18:48:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/34131.html

分享到:

A.无窗口的线程#i nclude "stdafx.h"INT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,  LPSTR lpszCmdParam,INT nCmdShow){ MSG message; while(GetMessage(&message,NULL,0,0)) //建立消息循环 {  TranslateMessage(&message); //翻译键盘消息  DispatchMessage(&message); //向消息处理模块发送消息 } return 0;} B.默认回调函数的窗口程序 #i nclude "stdafx.h"LRESULT CALLBACK WndProc(HWND hMainwnd, UINT message, WPARAM wParam, LPARAM lParam); HINSTANCE myhInst;//自己定义实例句柄名称!!char szAppName[]="WinAPIDemo";//应用程序名 char szAppTitle[]="利用应用程序接口的Windows应用程序";//程序标题 INT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,INT nCmdShow){ //主窗口句柄(句柄为窗口windows中的标识) HWND hMainwnd;                  WNDCLASS myWC;  //定义窗口类 {  myWC.style =CS_HREDRAW|CS_VREDRAW;  myWC.lpfnWndProc=DefWindowProc;//默认回调函数的窗口程序(窗口过程)  myWC.cbClsExtra=0;  myWC.cbWndExtra=0;  myWC.hInstance=hInstance;  myWC.hIcon=LoadIcon(NULL,IDI_APPLICATION);  myWC.hCursor=LoadCursor(NULL,IDC_ARROW);  myWC.hbrBackground=HBRUSH(GetStockObject(WHITE_BRUSH));  myWC.lpszMenuName=NULL;  myWC.lpszClassName=szAppName; } RegisterClass(&myWC);  //创建应用程序窗口 hMainwnd=CreateWindow(szAppName,//窗口类名  szAppTitle,//窗口标题  WS_OVERLAPPEDWINDOW,//窗口风格  200,//初始X坐标  200,//初始Y坐标  400,//初始宽度  500,//初始高度  NULL,//父窗口句柄  NULL,//窗口菜单句柄  hInstance,//程序当前句柄  NULL);//创建参数   ShowWindow(hMainwnd,SW_SHOWMAXIMIZED); //显示窗口 UpdateWindow(hMainwnd); //刷新窗口用户区  //定义windows消息数据结构(下面部分可以省略,没有线程-没有消息) MSG message; while(GetMessage(&message,NULL,0,0)) //建立消息循环 {  TranslateMessage(&message); //翻译键盘消息  DispatchMessage(&message); //向消息处理模块发送消息 }  return 0;}   C.用SPY++以及设置断点可以追踪到最简单的WIN32程序都具有进程和线程(没有窗口的程序)(个人理解:进程是指整个程序的实体,线程是程序内一个一个的代码执行片段) #i nclude "stdafx.h"INT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,INT nCmdShow){              WNDCLASS myWC; {  myWC.style =CS_HREDRAW|CS_VREDRAW;  myWC.lpfnWndProc=NULL;  myWC.cbClsExtra=0;  myWC.cbWndExtra=0;  myWC.hInstance=hInstance;  myWC.hIcon=LoadIcon(NULL,IDI_APPLICATION);  myWC.hCursor=LoadCursor(NULL,IDC_ARROW);  myWC.hbrBackground=HBRUSH(GetStockObject(WHITE_BRUSH));  myWC.lpszMenuName=NULL;  myWC.lpszClassName=“szAppName”; }                  RegisterClass(&myWC);//可以去掉此句  return 0;} //MessageBox(NULL,"HelloWorld!","caption",1);//也可以用本句进行调试! D.完整一点的窗口及单线程(线程下含窗口)程序,利用了MFC的类库中的类WNDCLASS #i nclude "stdafx.h"LRESULT CALLBACK WndProc(HWND hMainwnd, //窗口句柄 UINT message, //消息标识                   WPARAM wParam, //消息附加信息 LPARAM lParam); //消息附加信息 HINSTANCE myhInst;//实例句柄 INT PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,       LPSTR lpszCmdParam,INT nCmdShow){ char szAppName[]="WinAPI应用程序名";//应用程序名 char szAppTitle[]="利用应用程序接口的Windows应用程序";//程序标题  //主窗口句柄(句柄为窗口windows中的标识) HWND hMainwnd;    WNDCLASS myWC; //定义窗口类 {  myWC.style =CS_HREDRAW|CS_VREDRAW;  myWC.lpfnWndProc=WndProc;//没有执行,占据位置(空间)  myWC.cbClsExtra=0;  myWC.cbWndExtra=0;  myWC.hInstance=hInstance;  myWC.hIcon=LoadIcon(NULL,IDI_APPLICATION);  myWC.hCursor=LoadCursor(NULL,IDC_ARROW);  myWC.hbrBackground=HBRUSH(GetStockObject(WHITE_BRUSH));  myWC.lpszMenuName=NULL;  myWC.lpszClassName=szAppName; } RegisterClass(&myWC);  //创建应用程序窗口 hMainwnd=CreateWindow(szAppName,//窗口类名  szAppTitle,//窗口标题  WS_OVERLAPPEDWINDOW,//窗口风格  200,//初始X坐标  200,//初始Y坐标  400,//初始宽度  500,//初始高度  NULL,//父窗口句柄  NULL,//窗口菜单句柄  hInstance,//程序当前句柄  NULL);//创建参数   ShowWindow(hMainwnd,SW_SHOWMAXIMIZED); //显示窗口 UpdateWindow(hMainwnd); //刷新窗口用户区  //定义windows消息数据结构 MSG message; while(GetMessage(&message,NULL,0,0)) //建立消息循环 {  TranslateMessage(&message); //翻译键盘消息  DispatchMessage(&message); //向消息处理模块发送消息(系统指令) }       return message.wParam;//return 0;是一样的!}   //只能被回调!!!LRESULT CALLBACK WndProc(HWND hMainwnd, //窗口句柄       UINT message, //消息标识       WPARAM wParam, //消息附加信息       LPARAM lParam) //消息附加信息{ char MsgLBTN[]="你刚按下了鼠标左键!"; char MsgRBTN[]="你刚按下了鼠标右键!";  //消息处理分支 switch(message) {  case WM_RBUTTONDOWN: //右鼠标键被按下  {   MessageBeep(MB_ICONINFORMATION);   MessageBox(GetFocus(),MsgRBTN,"Message",MB_OK|MB_ICONINFORMATION);    break;   }  case WM_LBUTTONDOWN: //左鼠标键被按下  {   MessageBeep(MB_ICONINFORMATION);   MessageBox(GetFocus(),MsgLBTN,"Message",MB_OK|MB_ICONINFORMATION);    break;  }  case WM_DESTROY: //关闭窗口,非常关键!没有则线程消息循环无法退出,造成资源泄露!!!  {     PostQuitMessage(0);//使函数GetMessage(&message,NULL,0,0)不成立,退出循环(线程)  return 0;//可以去掉此句。  }  default:   return DefWindowProc(hMainwnd,message,wParam,lParam);  } return 0;} //MessageBox(NULL,"HelloWorld!","caption",1);//也可以用本句进行调试!

阅读(7011) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册