在window 中应用程序编程,重要的是明白应用程序、操作系统、消息之间的关系,一句话总结就是:事件驱动消息的机制。操作系统通过消息的机制来传递给应用程序

不同的消息代表用户不同的操作和状态,特定的消息让操作系统来响应某一个特定功能来响应消息。

MSG结构定义如下:

typedef struct tagMSG {      
      HWND   hwnd;     
      UINT   message;
      WPARAM wParam;
      LPARAM lParam;
      DWORD  time;(双十六位即32位)
      POINT  pt;(结构体)
} MSG;

句柄(HANDLE),资源的标识。(有点类似于指针,占着内存一部分资源)

操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄

 

Windows程序的入口函数(相当于C语言中main()函数)

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance(当前实例)
  HINSTANCE hPrevInstance,  // handle to previous instance(前一个实例,一般为NULL)
  LPSTR lpCmdLine,          // command line(lp开头为长指针,指向字符串)
  int nCmdShow              // show state
);

      创建一个完整的窗口需要经过下面四个操作步骤:

n设计一个窗口类;

n注册窗口类;

n创建窗口;

n显示及更新窗口。

1、设计窗口类

typedef struct _WNDCLASS {
   UINT      style;
   WNDPROC  lpfnWndProc; (函数处理)
   int       cbClsExtra; (额外信息,一般为0)
   int       cbWndExtra;
   HANDLE   hInstance; (当前应用程序实例)
   HICON     hIcon;
   HCURSOR   hCursor;
   HBRUSH    hbrBackground;
   LPCTSTR   lpszMenuName; (指向32位字符串,菜单名)
   LPCTSTR   lpszClassName; 
} WNDCLASS;

下面以一个简单的实例程序来作为window程序原理的分析:

#include <windows.h>
#include <stdio.h>//函数声明
LRESULT CALLBACK WinSunProc(
 HWND hwnd, // handle to window
 UINT uMsg, // message identifier
 WPARAM wParam, // first message parameter
 LPARAM lParam // second message parameter
); 
//主函数入口
int WINAPI WinMain(
 HINSTANCE hInstance, // handle to current instance
 HINSTANCE hPrevInstance, // handle to previous instance
 LPSTR lpCmdLine, // command line
 int nCmdShow // show state
)
{
 WNDCLASS wndcls;//定义一个设计窗口类的实例化
 wndcls.cbClsExtra=0;
 wndcls.cbWndExtra=0;
 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//定义一个窗口的背景,这里要强制转换?查看msdn可以得知函数返回的是神马类型的
 wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//光标
 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//应用程序图标
 wndcls.hInstance=hInstance;
 wndcls.lpfnWndProc=WinSunProc;//注册处理函数,这个很重要,注意与C语言中的区别
 wndcls.lpszClassName="yangyong";
 wndcls.lpszMenuName=NULL;
 wndcls.style=CS_HREDRAW | CS_VREDRAW;//水平和垂直类型
 RegisterClass(&wndcls);//注册设计类HWND hwnd;//创建一个窗口,首先要定义一个句柄
 hwnd=CreateWindow("yangyong","常熟理工",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
 ShowWindow(hwnd,SW_SHOWNORMAL);
 UpdateWindow(hwnd);

 MSG msg;
 while(GetMessage(&msg,NULL,0,0))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 return 0;
} 
LRESULT CALLBACK WinSunProc(
 HWND hwnd, // handle to window
 UINT uMsg, // message identifier
 WPARAM wParam, // first message parameter
 LPARAM lParam // second message parameter
)
{
 switch(uMsg)
 {
 case WM_CHAR:
 char szChar[20];
 sprintf(szChar,"char is %d",wParam);
 MessageBox(hwnd,szChar,"weixin",0);
 break;
 case WM_LBUTTONDOWN:
 MessageBox(hwnd,"Mouse Click","weixin",0);
 HDC hdc;
 hdc=GetDC(hwnd);
 TextOut(hdc,0,50,"计算机编程",strlen("计算机编程"));
 ReleaseDC(hwnd,hdc);
 break;
 case WM_PAINT:
 HDC hDc;
 PAINTSTRUCT ps;
 hDc=BeginPaint(hwnd,&ps);
 TextOut(hDc,0,0,"wei xin peix un ",strlen("wei xin peix un "));
 EndPaint(hwnd,&ps);
 break;
 case WM_CLOSE:
 if(IDYES==MessageBox(hwnd,"真的结束?","weixin",MB_YESNO))
 {
 DestroyWindow(hwnd);
 }
 break;
 case WM_DESTROY:
 PostQuitMessage(0);
 break;
 default:
 return DefWindowProc(hwnd,uMsg,wParam,lParam);}
 return 0;
}

 

在写这些程序过程中,我们不可能记住所有API的函数类型和参数等,这里我们主要下载msdn帮助手册,通过手册查询熟悉常用的即可,本人是初学msdn,这里只是作为我学习的一个记录心得,与朋友一起分享学习的过程。这是第一篇,以后会不断的更新自己的学习过程。嘿嘿!!!!!

注明:本系列的学习知识参考孙鑫老师 的C++编程,里面含有一些个人的思想与学习总结,绝无抄袭之用,仅供学习。