正文

关于窗口、进程和线程的初步探讨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);//也可以用本句进行调试!

阅读(3508) | 评论(2)


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

评论

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