VC系列之Win32

 

    编写一个完整的Win32 控台应用程序,首先应该掌握的是Windows程序运行的机理,只有清楚Windows程序运行的内层机理,才能真正明白编写一个Windows时程每一步的具体意义。

    简言之,Windows应用程序是建立在操作系统之上的用户接口,而操作系统又承担着应用程序和机器的交互作用。用户对应用程序实现控制,需要的是向应用程序发送一系列指令,即消息。所谓消息,目前只需简单理解为用户通过鼠标、键盘等IO设备传到计算机内的各种信号,操作系统将这些信号包装成消息后依次存放到消息队列中。当程序启动之后,操作系统负责不断的捕获消息,包装消息,消息入队,从队列提取消息,然后将得到的消息分配给该应用程序。

    应用程序为了能处理,操作系统交给他的消息,也就是完成从操作系统给他的任务,必须对收到的消息给出正确的响应。而这个消息响应的具体过程就是程序员编写的窗口过程函数。

    我们知道之前编写一个简单控台应用函数时,函数中必须有且仅有一个main()函数作为整个程序的入口,然后才能保证程序的执行。同样的Windows控台应用程序,也有自己入口函数WinMain()。

 

重点一:WinMain:

 

函数定义:

int WINAPI WinMain(

  HINSTANCE hInstance,       //handle to current instance

  HINSTANCEhPrevInstance,   // handle toprevious instance

  LPSTR lpCmdLine,           //command line

  int nCmdShow               // show state

);

 

笔记1、HINSTANCE hInstance:当前应用程序实例句柄,指向当前应用程序。

笔记2、句柄:功能类似C语言指针,某些实例对象的索引,句柄本身只是系统某种资源的一个代号。系统为了管理内核对象保留着一个资源表,句柄就存放在这个资源表中,句柄只是作为某个资源的ID。通过这个ID号,既可以找到对应的资源,可见依靠的不是物理地址,而是逻辑映射间接访问。因此和指针不同。

笔记3、HINSTANCE hPrevInstance:先前实例句柄,默认为空。

笔记4、LPSTR lpCmdLine:用于允许用户通过命令行启动你程序。类似于console程序中的int  argc,   char *argv[];

笔记5、int nCmdShow:指明窗口如何显示。(有的程序打开后就不显示窗口)

 

重点二:创建窗口的五大步骤:

 

<1>设计窗口类;

<2>注册窗口类;

<3>创建窗口;

<4>显示窗口

<5>更新窗口

 

<1>设计窗口类——设计一辆新型汽车

 

要设计一个窗口类首先应该掌握Windows系统规定的标准的窗口类所具有的属性,窗口类的结构,所谓用户创建窗口类实际就是按照自己的想法为窗口类的每个成员赋予合理的参数。

 

typedef struct _WNDCLASS { 
    UINT       style; 
    WNDPROC    lpfnWndProc; 
    int        cbClsExtra; 
    int        cbWndExtra; 
    HINSTANCE  hInstance; 
    HICON      hIcon; 
    HCURSOR    hCursor; 
    HBRUSH     hbrBackground; 
    LPCTSTR    lpszMenuName; 
    LPCTSTR    lpszClassName; 
} WNDCLASS, *PWNDCLASS; 

 

笔记7、WNDPROC lpfnWndProc;指向窗口回调函数的指针,即指向程序员编写的窗口过程函数。

HANDLE hInstance:用以指明所设计的窗口类属于的应用程序实例号,该实例号是在程序启动时由操作系统分配给WinMain的HINSTANCE hInstance

LPCTSTR lpszClassName:用户在完成组建具有自己特色的窗口类之前为自己的窗口起一个名字留以今后注册窗口类和创建窗口用。

 

<2>注册窗口类——将你设计的汽车注册到系统去审核。

 

ATOM RegisterClass(
  CONST WNDCLASS *lpWndClass  // class data
);

 

笔记8、CONST WNDCLASS*lpWndClass  :注册时用到的是窗口类的指针,因此需要加&

 

<3>创建窗口——汽车投入生产线。

 

要创建窗口必须掌握的是创建一个窗口需要完成的必要任务,即给窗口确立最基本的属性,其实还是用户通过API对窗口的组建。

 

HWND CreateWindow(
  LPCTSTR lpClassName// registered class name
  LPCTSTR lpWindowName, // window name
  DWORD dwStyle,        // window style
  int x,                // horizontal position of window
  int y,                // vertical position of window
  int nWidth,           // window width
  int nHeight,          // window height
  HWND hWndParent,      // handle to parent or owner window
  HMENU hMenu,          // menu handle or child identifier
  HINSTANCE hInstance// handle to application instance
  LPVOID lpParam        // window-creation data
);

 

笔记8、HINSTANCE hInstance :用以指明被创建的窗口所属于的应用程序实例号,该实例号是在程序启动时由操作系统分配给WinMain的HINSTANCEhInstance

 

<4>显示窗口——一辆新车产品展示。

 

显示窗口时,必须给出需要显示窗口的句柄,和显示方式。

 

BOOL ShowWindow(
  HWND hWnd,     // handle to window
  int nCmdShow   // show state
);

 

笔记9、HWND hWnd :窗口的句柄,本身是窗口的属性之一,即窗口类中都保留了一个默认成员作为自己的句柄,供系统管理和程序调用。

 

<5>更新窗口——负责窗口的刷新重绘。

 

BOOL UpdateWindow(
  HWND hWnd   // handle to window
);

 

重点三:消息循环:

 

消息循环机制是应用程序正常运行的核心驱动。没有消息循环机制的程序,就像没有发动机的汽车失去活动的能力。消息循环的主要功能还是由操作系统完成,包括消息的接收、打包、入队、读取、分发。应用程序的功能是接受系统交给的消息,然后再调用系统API完成相应的操作。

 

消息结果体:

 

typedef struct tagMSG {

  HWND   hwnd;

  UINT   message;

  WPARAM wParam;

  LPARAM lParam;

  DWORD  time;

  POINT  pt;

} MSG, *PMSG;

 

笔记10、HWND   hwnd:指向接受消息的窗口的句柄。

UINT   message:消息的具体值。

 

获取消息:

 

BOOL GetMessage(
  LPMSG lpMsg,         // message information
  HWND hWnd,           // handle to window
  UINT wMsgFilterMin// first message
  UINT wMsgFilterMax   // last message
);

 

笔记11、LPMSG lpMsg, :消息结构体的指针

HWND hWnd,:对所取消息的范围限制,为NULL是取所有消息

 

消息的打包:

 

BOOL TranslateMessage(
  CONST MSG *lpMsg   // message information
);

 

操作系统将消息解析为应用程序可以识别的消息。

 

消息的分发:

 

LRESULT DispatchMessage(
  CONST MSG *lpmsg   // message information
);

 

消息的处理:

 

笔记12、应用程序接收到系统分发过来的消息之后通过窗口类中保存的窗口过程函数的指针找到窗口过程函数,进入窗口过程函数内进行消息的相应。而窗口过程函数本身就是一系列消息处理方法的集合。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值