您的位置:首页 > 编程语言 > C语言/C++

lesson1:Windows程序运行原理及程序编写流程(vc++深入详解)

2017-09-08 13:45 495 查看
  前言:窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系。

Windows API与Win32 SDK

操作系统提供了各种方便开发Windows应用程序的编程接口,所的函数都在Windows.h头文件中声明。Win32 SDK(Software Development Kit): 即Windows 32位平台下的软件开发包,包括API函数,帮助文档,微软提供的一些辅助开发工具。

窗口与句柄

窗口是是屏幕上一块矩形区域,是Windows应用程序与用户进行交互的接口。在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的,要对某个窗口进行操作,首先就要得到这个窗口的句柄。其它各种资源(窗口,图标,光标等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。eg: 光标句柄(HCURSOR),图标句柄(HICON)等等。

消息与消息队列

Windows程序设计是一种基于消息的事件驱动方式的程序设计模式。消息,在Windows中由结构体MSG来表示。MSG语法参见MSDN。

typedef struct tagMSG {

HWND hwnd; //消息所属的窗口句柄

UINT message; //消息本身标识符

WPARAM wParam; //指定有关消息的附加信息

LPARAM lParam;

DWORD time; //指定消息发布的时间

POINT pt; //消息发布时的位置

} MSG;

消息队列:每当一个Windows应用程序创建后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序一的窗口的消息,消息产生后被投递到消息队列中,应用程序通过一个消息循环不断的消息队列中取出消息进行响应。响应过程由系统向应用程序发送消息,实际就是调用应用程序的消息处理函数。

创建一个完整的Win32程序,该程序实现创建一个窗口,其中主要步骤为:

WinMain函数的定义

创建一个窗口,创建一个完整的窗口的四个步骤:1设计窗口类,2注册窗口类,3创建窗口,4显示窗口

进行消息循环

编写窗口过程函数

相关代码:

/************************************************************************
Author: wuc
Mail: wuc201609@163.com
Time: 13:24:19/2017-9-7
Name: WinMain
Function: 简单窗口的实现
Version:
************************************************************************/
#include <Windows.h>
#include <stdio.h>

LRESULT CALLBACK WindowProc(
HWND hwnd,     //窗口句柄
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

int WINAPI WinMain(                                           //WinMain函数是基于Windows应用程序的入口函数
HINSTANCE hInstance,                         //语法:
HINSTANCE hPrevInstance,                     //int WINAPI WinMain(
LPSTR IpCmdLine,                             //HINSTANCE hInstance,  当前实例的句柄
int nCmdShow                                 //HINSTANCE hPrevInstance,
)                                            //LPSTR lpCmdLine,
//int nCmdShow
//);

{   //设计一个窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);  //(HBRUSH)强制转换类型
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);  //加载鼠标类型
wndcls.hIcon=LoadIcon(NULL,IDI_WINLOGO);    //设计文本图标
wndcls.hInstance=hInstance;       //实例句柄赋值为程序启动系统分配的句柄值
wndcls.lpfnWndProc=WindowProc;    //消息响应函数
wndcls.lpszClassName=L"Weixin2008";   //窗口类的名字
wndcls.lpszMenuName=NULL;             //菜单栏,默认为空
wndcls.style=CS_HREDRAW | CS_VREDRAW; //定义水平和垂直重画

RegisterClass(&wndcls);               //注册窗口类

HWND hwnd;     //保存创建窗口后的生成窗口句柄用于显示
hwnd=CreateWindow(L"Weixin2008",L"这是第一课",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 WindowProc(           //发送信息
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)           //设计窗口
{
case WM_CHAR:           //字符按键消息
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,LPCWSTR(szChar),L"weixin",0);
break;
case WM_LBUTTONDOWN:    //鼠标左键按键信息
MessageBox(hwnd,L"mouse clicked",L"weixin",0);
HDC hdc;
hdc=GetDC(hwnd);    //获取设备上下文句柄,用来输出文字
TextOut(hdc,0,50,L"计算机编程",strlen("计算机编程"));
ReleaseDC(hwnd,hdc);   //使用完后DC的释放
break;
case WM_PAINT:             //消息重给时的消息响应
HDC hDc;
PAINTSTRUCT ps;
hDc=BeginPaint(hwnd,&ps);
TextOut(hDc,0,0,L"Windows编程",strlen("Windows编程"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,L"是否真的结束?",L"weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
case WM_DESTROY:
PostQuitMessage(0); //在响应消息后,投递一个退出的消息使用程序安全退出
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);  //调用缺省的消息处理过程函数
}
return 0;
}


小结:

关于句柄

句柄(handle),资源的标识。

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

WinMain函数 系统入口函数

强制性转换—>编译时不会报错,运行时会报错

BeginPaint EndPaint释放只能在WM_PAINT中使用;

GetDC之后需要释放ReleaseDC;

if(1 == x)将常量写在前面,便于理解;

消息循环时default语句必不可少;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vc++