windows API入门

 

数据类型

API 第一个接触到的函数就是:

int WINAPI WinMain(
  HINSTANCE hInstance,      // 句柄
  HINSTANCE hPrevInstance,  // 总是置空
  LPSTR lpCmdLine,          //命令行
  int nCmdShow              //程序最初的显示模式
);

 

 这是个入门的函数,就像C++中的main函数,没有main函数就没法运行

 

 第二个接触到的函数:

 这是一个弹出的消息窗口

 

 UINT uType :按钮的样式类型

MB_OK :确定按钮

MB_OKCANCEL:确定和取消的按钮

MB_YESNO:是和否的按钮

MB_INFORMATION:信息提示的图标

MB_WARNING:警告图标

MB_ERROR:错误标示

每个按钮也可以进行同时使用

 

第三个接触到的函数(重要的部分-注册窗口类):

ATOM RegisterClass(
  CONST WNDCLASS *lpWndClass  // class data
);
这里的是检查你注册的窗口,如果注册失败,则返回0,注册成功,返回非0值。
ATOM 是16进制整数,且是唯一性(整个系统中是唯一的)。

这里面所使用的参数类型 是 WNDCLASS

typedef struct _WNDCLASS { 
    UINT       style;  //窗体的风格
    WNDPROC    lpfnWndProc; //窗口过程函数,定义了在用户在窗体中实现的功能,比如说点击,移动等
    int        cbClsExtra;//调用RegisterClass,注册窗口时系统就会按照此尺寸开辟一块内存 
    int        cbWndExtra;// 调用CreateClass.创建窗口时系统会找次尺寸开辟空间
    HINSTANCE  hInstance; //实例句柄-WinMain参数中的句柄
    HICON      hIcon; //图标句柄
    HCURSOR    hCursor;//鼠标句柄 
    HBRUSH     hbrBackground; //背景句柄
    LPCTSTR    lpszMenuName;/*
	一个以null结尾的字符串指针,
	指定了资源类名菜单,正如它的名字出现在资源文件。
	如果你用一个整数来识别菜单,使用MAKEINTRESOURCE宏。如果这个成员是NULL,windows属于这个类没有默认的菜单。
			*/ 
    LPCTSTR    lpszClassName;//窗体的名字 
} WNDCLASS, *PWNDCLASS; 

 

第四个接触到的函数(重要的部分-创建窗口类):

HWND CreateWindow(
  LPCTSTR lpClassName,  // 窗口类名,与wndclass中的lpszClassName必须一致<-这是重点
  LPCTSTR lpWindowName, // 第二个参数:窗体标题
  DWORD dwStyle,        // 第三个参数:窗体样式
  int x,                //窗体的位置 X
  int y,                //窗体的位置 y
  int nWidth,           //窗体的大小 宽 
  int nHeight,         //窗体的大小 高
  HWND hWndParent,      // 处理到父窗口或所有者的窗口被创建。创建子窗口或一个附属窗口,提供一个有效的窗口句柄。该参数是可选的弹出窗口。
  HMENU hMenu,          /*菜单句柄,或指定子窗口标识符根据窗口样式。
                          对于一个重叠或弹出窗口,菜单句柄标识用于与窗口;它可以是NULL如果类菜单使用。
                          为子窗口,指定子窗口句柄标识符,一个整数值使用对话框控制通知其父母谈论事件。
                          应用程序决定了子窗口标识符,它必须是唯一的所有子窗口的父窗口一样。*/
  HINSTANCE hInstance,  // 句柄->WinMain的参数
  LPVOID lpParam       /*指针值传递给窗口通过CREATESTRUCT结构通过lParam参数信息的wm创建。
                      如果一个应用程序调用CreateWindow创建一个多文档界面(MDI)客户端窗口,
                      lpParam必须指向一个CLIENTCREATESTRUCT结构*/
);

第五/六个接触到的函数(显示窗体,更新窗体):  //显示窗口  ShowWindow(hwnd,SW_FORCEMINIMIZE);  //更新窗体->发送一个WM_PAINT  UpdateWindow(hwnd);

 
第七个接触到的函数(消息队列的循环):
MSG msg;
 /*
 GetMessage
 此函数从调用线程的消息队列中取出一个消息。
 此函数发送消息队列的消息直到这个消息适合检索。然后把检索到的消息赋值给MSG结构体。
 第一个参数:带入一个msg
 第二个参数:需要检索消息的窗体句柄。这个窗体必须属于调用线程,下面是指定的值
 NULL:GetMessage检索任何属于调用线程窗体的消息,并且通过PostThreadMessage函数发送消息到调用线程
 第三个参数:指定被检索的最小消息值的整数
 第四个参数:指定被检索的最大消息值的整数
 */
 BOOL bRet;  
 while((bRet = GetMessage(&msg,hwnd,0,0))!=0)  
 {  
  if(bRet== -1)  
  {  
  //处理错误和可能的退出
   return 0;
  }  
  else  
  { 
/*
http://blog.csdn.net/pkueecser/article/details/6871745 <-可参考资料
*/
   TranslateMessage(&msg);  
   DispatchMessage(&msg);  
  }  
 } 
 
第八个接触到的函数(回调函数):
LRESULT CALLBACK WndProc(
 HWND hwnd,      // handle to window
 UINT uMsg,      // message identifier
 WPARAM wParam,  // first message parameter
 LPARAM lParam   // second message parameter
 )
{ 
 HDC hdc;
 PAINTSTRUCT ps;
 RECT rect;

 switch(uMsg)
 { //当有外设信息被传到窗体时
 case WM_CREATE: 
  {
   PlaySound("D:\\main.wav",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP); <-#pragma  comment(lib,"WinMM.Lib") 需要使用到这个库
    return 0; 
  }
  // 绘制窗口.
 case WM_PAINT: 
  hdc = BeginPaint(hwnd,&ps);
  GetClientRect(hwnd,&rect);
  DrawText(hdc,"HELLO,这是我的第一个windows程序,真不容易啊!",-1,&rect,DT_BOTTOM);
  EndPaint(hwnd,&ps);
  return 0; 
 /*
 被创建之后的消息发送到一个窗口大小后改变了。  一个窗口接收这个消息通过其WindowProc函数。
 */
 case WM_SIZE: 
  MessageBox(NULL,"窗体被改变","窗体改变",MB_OK);
  return 0; 
  // 关闭窗口. 
 case WM_DESTROY: 
  PostQuitMessage(0);
  return 0; 
 case WM_RBUTTONDOWN:
  {  //左键
   int a = MessageBox(NULL,"左键","魂淡,你按了左键",MB_YESNO);
   
   CHAR c[256] = {0};
   sprintf_s(c,"%d",a);  <- #include <stdio.h>
   MessageBox(NULL,c,"Message",MB_OK);
   return 0;
  }
 default: 
  return DefWindowProc(hwnd, uMsg, wParam, lParam); 
 }
 return 0;
}
 
 
虽然这里看上去只是用了8个函数,但实际上动用了18个函数:

 

 关于参数类别:

 

 

变量的一些命名规则:

 

结构 和 标示符 :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值