SDK编程-窗口编写

SDK 第一节 Hello SDK
一、概述:
SDK(software Development kit 软件开发包) 。
   我们从这堂课开始,要学习基于Windows操作平台上的程序设计。
 我们平常用的软件如:RealONE Player、OFFICE2003、金山影霸、甚至我们现在所用 到的Microsoft Visual Studio .NET 2003 等,在我们按装完操作系统时,这些软件是不存在的,是我们后来人工按装上的,也就是说这些软件都是基于Windows操作平台开发出来的软件,那么,我们在写程序的时候就要和操作系统打交道,就要利用微软给我们提供的接口来实现Windows操作平台的程序设计。
 我们把接口称做API函数(Application Programming Interface 应用程序接口)。
 微软把2800多个API函数通过包的形式提供给我们(也就是我们要学习的SDK)。
 SDK的组成:Win32 API。
 注意:概述一下API函数.
 Windows当中的新数据类型:
 1、结构:
  MSG               消息结构
  WNDCLASS        窗体类结构
  RECT    矩形结构:left x
   Top y
   Right x1
   Bottem y1
  POINT             点结构(x,y)
 2、句柄
  HINSTANCE        应用程序实例句柄
  HWND             窗体句柄
    HDC   设备描述表句柄
   3、数据类型
    WORD   (unsigned  short  int)
    DWORD     (unsigned  long  int )
    BYTE       (unsigned  char)
    TCHAR     (wchar:宽字符集)
    UINT       (unsigned  int)
    WPARAM   (unsigned  int)
    LPARAM    (unsigned  int)
    LRESULT   (long  int)
    CALLBACK   回调函数
二、Windows编程的第一个程序(Hello Win):
   1、建立VC++项目-->win32win32项目。
   2、应用程序设置windows应用程序-->空项目。
   3、源文件-->添加新文件。
   4、添加源代码。
三、Hello win的源代码:
#include <windows.h>   //声明窗体的消息处理函数
HRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(
   HINSTANCE hInstance, //当前应用程序实例句柄
   HINSTANCE hPrevInstance,//前一个应用程序实例句柄
   PSTR szCmdLine, //命令行参数
   int iCmdShow //当前系统的标准窗体显示模式
   )
{
MSG msg; //消息结构对象
//定义窗体类对象
WNDCLASS  wndclass;
//设计窗体类对象
wndclass.cbClsExtra = 0; //类扩展样式,为没有扩展样式
wndclass.cbWndExtra = 0; //窗体扩展样式,为没有扩展样式
wndclass.hbrBackground =  
(HBRUSH)GetStockObject(BLACK_BRUSH);//指定窗体的背景笔刷
//使用GetStockObject函数从系统内取得WHITE_BRUSH的句柄
wndclass.hCursor = 
LoadCursor(NULL,IDC_CROSS);//指定光标句柄,使用LoadCursor从系统内加载
wndclass.hIcon = 
LoadIcon(NULL,IDI_APPLICATION);//指定图标句柄,使用LoadIcon从系统加载
wndclass.hInstance = hInstance; //指定应用程序实例句柄为当前实例句柄
wndclass.lpfnWndProc = WndProc;//指定窗体消息处理函数WndProc
wndclass.lpszClassName = "Hello"; //指定窗体类名称
wndclass.lpszMenuName = NULL;//指定菜单名称,NULL没有菜单
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//窗体类样式,允许水平/垂直方向重绘
//注册窗体类
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,"注册窗体失败,请确认是在win nt 系统下运行","错误",MB_OK);
return 0;
}
//创建窗体
HWND hWnd = CreateWindow(
"Hello",//窗体类对象名称
"我的第一个windows应用程序",
WS_OVERLAPPEDWINDOW,//指定窗体样式,无透明效果
CW_USEDEFAULT, //窗体的X坐标
CW_USEDEFAULT, //窗体的Y坐标
CW_USEDEFAULT, //窗体宽度
CW_USEDEFAULT, //窗体高度
NULL, //父窗体句柄
NULL, //菜单句柄
hInstance, //应用程序实例句柄
NULL //备用参数,没意义
);
//显示窗体
ShowWindow(hWnd,SW_SHOW);
//更新窗体
UpdateWindow(hWnd);
//消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

//
//函数:WndProc
//作用:用来处理窗体收到的所有消息
//返回类型:HRESULT(long类型)
//调用约定:CALLBACK系统回调函数
//参数:
// HWND hWnd 收到消息的窗体句柄
// UINT    message 消息ID
// WPARAM wParam 消息参数
// LPARAM  lParam 消息参数
/
HRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
MessageBox(NULL,"窗体销毁啦,程序马上没了","提示",MB_OK);
PostQuitMessage(0);
break;
case WM_CLOSE:
if(MessageBox(NULL,"是否关闭","提示",MB_OKCANCEL)==IDCANCEL)
return 0;
break;
case WM_CREATE:
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
四、Hello win的知识点:
  1、包含windows.h文件。
#include <windows.h>
  2、WinMain: Windows程序入口点。
返回值:int 类型。
关键字:WINAPI windowsAPI 函数
名称  :WinMain
  3、WinMain的四个参数:
HINSTANCE hInstance:操作系统提供当前应用程序的实例句柄。
  (* H:凡是以H开头的函数都是句柄(Handle).)
  HINSTANCE:当前应用程序实例句柄   
HINSTANCE hPrevInstance:操作系统提供前一个应用程序的前一个实例句 柄。
PSTR  szCmdLine:字符串类型的指针,操作系统提供的命令行参数。
Int   iCmdShow:当前系统默认显示的方式。

注意:当程序运行后,WinMain主函数由操作系统来调用,而不是我们来调用的,当操作系统起动我们的程序的时候,操作系统会给我们的运行程序分配一个实例号。通过参数就传递进来了,如果起动程序时传递了一个命令行的参数,操作系统会将参数放到第三个参数当中传递进来.程序如何显示,显示的状态,这些都是由操作系统传递进来的,所以,参数都由操作系统来赋值。

  创建一个完整的窗口,需要以下四个步骤
设计窗体类     (WNDCLASS)
注册窗体类     (RegisterClass(&wndclass))
创建窗体类     (CreateWindow) 
显示及更新窗体类 (ShowWindow/UpdateWindow)
消息循环       (message)
  4、static TCHAR szAppName[]=TEXT("hellowin");    //应用程序名称
HWND   hWnd;                                  //窗体句柄
MSG    msg;                                   //消息结构
WNDCLASS wndclass;                            //窗体类对象
  5、 wndclass.style=CS_HREDRAW|CS_VREDRAW; 
  //style:窗体样式. CS_HREDRAW|CS_VREDRAW:垂直重画和水平垂画
   当窗体垂直和水平发生改变时,窗体自动重绘
  wndclass.lpfnWndProc=WndProc;          
  //指定消息处理函数(又称回调函数和过程序函数)
wndclass.cbClsExtra=0;
  //扩展函数
wndclass.cbWndExtra=0;     
  //扩展窗体
wndclass.hInstance=hInstance;         
  //指定应用程序实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
//加载图标(第一个参数要一个应用程序的实例句柄,第二个参数要图标显示方式如果用微软为我们提供的,那么第一个参数设为空)
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); 
//加载光标(第一个参数要一个应用程序的实例句柄,第二个参数要光标显示方式如果用微软为我们提供的,那么第一个参数设为空)
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
//设置背景色为白色(利用GetStockObject来获取黑色画刷设为背景, 然后把  强制转换为HBRUSH类型)
wndclass.lpszMenuName=NULL; 
  //在程序中设置窗体有无菜单
wndclass.lpszClassName=szAppName; 
  //在程序中设置窗体标题栏文本.
  
  //注册窗体:
  RegisterClass(&wndclass)
   //向操作系统注册窗体,参数要一个窗体类的指针。
  
  //创建一个窗体
  创建窗体时,首先定义一个窗体句柄
  HWND hwnd;
hWnd=CreateWindow(szAppName,
TEXT("Hellowin程序,我的第一个WINDOWS程序"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
  //创建窗体用关键字CreateWindow(
   第一个参数是窗体类的名子,
    第二个参数是标题栏上的文本,
    第三个参数是窗体样式
    第四个参数是窗体在屏幕上的x坐标   //用默认的就可以
    第五个参数是窗体在屏幕上的y坐标     //用默认的就可以
    第六个参数是窗体的高度              //用默认的就可以
    第七个参数是窗体的宽度   //用默认的就可以
    第八个参数是窗体的句  //在窗体没有父窗体的情况下,该参数设为空
    第九个参数是窗体的菜单句柄 //在本窗体中没有菜单句柄,该参数设为空
    第十个参数是应用程序实例句柄
  第十一个参数是当窗体运行时,要一个窗体消息的一个指针,在本程序中,该参数设为空

//显示及更新窗体
 显示窗体用:ShowWindow(hWnd,iCmdShow);
 第一个参数是窗体句柄,表示将要显示的是那一个窗体
 第二个参数是显示状态,表示将窗体如何的显示出来

   更新窗体用:UpdateWindow(hWnd);
   参数表明要更新那个窗体

以上就是对窗体的设计,注册,创建和显示及更新,下面就是对消息的处理:
  MSG    msg;              //我们用MSG消息结构体定义了一个变量
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
  
  GetMessage到消息队列中取得消息
第一个参数:要一个结构体变量的地址,当调用函数时,将自动填充结构体当中的内部的成员变量
第二个参数:要一个窗体的句柄,指要获取的是那一个窗体的消息,设为空的意思是要获取所有的消息
第三个参数:指定消息对列中最小的消息值,指定特定消息,和消息范围
第四个参数:指定消息对列中最大的消息值,指定特定消息,和消息范围

注意:将第三个参数和第四个参数设为0,将获取消息对列中所有的消息,也就
没有范围的过滤了,我们还可以获取指定范围内的消息(范围过滤),当然
不在范围内的消息,不会获取
GetMessage的返回值为bool类型,获取到消息,返回为真,否则返回0

TranslateMessage(&msg); //翻译消息,把获取来的消息翻译完后,在投入到消息    对列中.转换过程不会影响原有的消息对列,只会产生一个新的消息
DispatchMessage(&msg); //将收到的消息传递给窗体的回调函数(窗体过程序函数)中处理.作用是消息传递给操作系统,然后操作系去调用我们的过程序函数,也就是说我们在窗体的过程函数中处理消息

//回调函数(过程函数)
  LRESULT CALLBACK WndProc(HWND hWnd,
 UINT message,
 WPARAM wParam,
 LPARAM lParam)
//第一个参数:窗体句柄
//第二个参数:消息的标识
//第三个参数:消息的附加参数
//第四个参数:第二个消息的附加参数

LRESULT://返回值是一个Long类型
CALLBACK://回调函数,表明此函数由系统调用,不用人为调用

HDC  hdc;
//HDC:设备描述表句柄
PAINTSTRUCT ps;
//定义一个结构体的变量,作用是用来刷新客户区的
RECT rect;
//定义一个矩形的结构体
switch(message)
{
case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
//GetClientRect(hWnd,&rect); //DrawText(hdc,"Hello,Windows!",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_V     CENTER);
TextOut(hdc,100,100,”Hello win”,strlen(“Hello win”));
  EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
  //然后我们利用swicth循环来处理特定的消息
  Switch(message)
  
  WM_PAINT:只处理绘图消息,只能客户区绘图,执行条件:1、窗体最大化,最小化
    2、窗体被其它窗体挡住时,3、人为调用。
//hdc=BeginPaint(hWnd,&ps); //BeginPaint获取Paint消息中,设备描述表句柄的方法
//EndPaint(hWnd,&ps);       //EndPaint释放Paint消息中,设备描述表句柄的方法
TextOut(HDC,int,int,lpctstr,int) //在指定位置书写一个文本
  
case WM_DESTROY:
PostQuitMessage(0);
return 0;

  WM_DESTROY: //当窗体消毁时,触发该消息
PostQuitMessage(0)://退出消息循环,该参数要一个退出消息的模式,给0按默认方式通出,如想按其它方式退出,请参看MSDN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值