关于自己的第一个windows程序(新手使用WIN32 API编程)

作者:Wupei  |  发表时间:  |  所属分类:我的作品

自己的第一个windows程序,使用WIN32 API,当初也是胡里胡涂的,为了更好的了解,自己就全部都写上了注释,供大家参考

刚开发时,API中的缩写最使人头疼,我那时也总结了一下:

H Handle Cls Class
WND Window WindowProc Window Process
def Define CT Const
sz String Zero PARAM Parameter
fu Function CS_ Class Style
prev Prevenient WM_ Window Message
cb Combo Box SW_ Show Window
br Brush CW_ Class Window
msg Message MB_ Message Button
ps Pain Struct IDC_ Identify Curor
lp Long Point IDI_ Identify Icon

WINDOWS API自己定义的类型:

内置类型 WND 定义类型 字节
unsigned long DWORD 4
int BOOL 4
unsigned char BYTE 1
unsigned short WORD 2
float FLOAT 4
unsigned int UINT 4
_w64 unsigned int WPARAM 4
_w64 long LPARAM 4
_w64 long LRESULT 4

MSG结构体:

typedef struct tagMSG
{
   HWND	       hwnd;           //窗口句柄
   UINT	          message;     //消息(一个整数) 宏:WM_LBUTTONDOWN
   WPARAM   wParam;      //附加信息(一个整数)	WM_CHAR消息时:ASCⅡ码
   LPARAM     lParam;	    //附加信息(一个整数)	WM_CHAR消息时:key data
   DWORD      time;	      //时间		
   POINT         pt;	          //点结构体
} MSG, *PMSG;

窗口的创建需要以下四个步骤:
1.设计窗口类
2.注册窗口类
3.创建窗口
4.显示及更新窗口

以下为全部代码(由于注释太多,可能有点乱):

#include <windows.h> //windows程序需要的头文件
#include <stdio.h>      //用到的库函数


LRESULT CALLBACK WinSunProc(
   HWND hwnd,               //窗口句柄
   UINT uMsg,                 //消息标识
   WPARAM wParam,     //附加信息(一个整数) WM_CHAR消息时:ASCⅡ码
   LPARAM lParam         //附加信息(一个整数) WM_CHAR消息时:key data
);
 

/////////////////////////////////////////////////////////////////////////////////////////////
//主函数操作体统调用(参数由操作系统传递)
int WINAPI WinMain( 
   HINSTANCE hInstance,   //应用程序实例句柄(操作系统为应用程序分配实例号)
   HINSTANCE hPrevInstance, //先前实例句柄(Win32程序恒为空)
   LPSTR lpCmdLine,  //命令行参数
   int nCmdShow           //显示状态(最大化或最小化或隐藏状态)
)
{
   WNDCLASS wndclass; //声明窗口类结构体      //一位二进制位代表一个特征
   wndclass.style=CS_HREDRAW | CS_VREDRAW;    //[UINT]   窗口类类型(水平重画|~垂直重画-redraw)
   wndclass.lpfnWndProc=WinSunProc;      //[WNDPROC] 窗口过程函数、回调函数
   wndclass.cbClsExtra=0;         //[int]   类的附加内存
   wndclass.cbWndExtra=0;            //[int]   窗口的附加内存
   wndclass.hInstance=hInstance;           //[HANDLE] 应用程序实例句柄
   wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);    //[HICON]  图标句柄(标准图标:首参数为空)
   wndclass.hCursor=LoadCursor(NULL,IDC_CROSS); //[HCURSOR] 光标句柄(标准光标:首参数为空)
   wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
                  //[HBRUSH] 画刷或字体或调色板句柄(强制转换)
   wndclass.lpszMenuName=NULL;       //[LPCTSTR] (常量字符串)菜单名字
   wndclass.lpszClassName="Weixin2003";        //[LPCTSTR] (常量字符串)窗口类名字
 
   RegisterClass(&wndclass);   //注册窗体(有可能不成功)
   HWND hwnd;     //定义句柄
   hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,
      0,0,600,400,NULL,NULL,hInstance,NULL); //创建窗口API函数
   //参数依次为:[LPCTSTR]注册过的窗口类名[LPCTSTR]窗口标题[DWORD]窗口类型(包括层叠菜单等)
//[int][int]窗口坐标[int][int]窗口高度和宽度[HWND]父窗口句柄[HMENU]菜单句柄
    //[HANDLE]应用程序实例句柄[LPVOID]附加参数指针(多文档界面需要使用)
   ShowWindow(hwnd,SW_SHOWNORMAL); //显示窗口的API函数(显示状态)
   UpdateWindow(hwnd);     //更新窗口

   MSG msg;
   while(GetMessage(&msg,NULL,0,0))   //消息循环(从消息队列中取消息)返回值BOOL
   //参数依次为:[LPMSG]消息结构体指针  //[UINT]消息最小值[UINT]消息最大值(范围过滤)
//[HWND]窗体句柄:获取哪个窗体的消息(NULL为获取任何线程消息)
   {
      TranslateMessage(&msg); //翻译消息(对取到的消息对转换,并将消息投放到消息队列中)
      DispatchMessage(&msg); //处理消息(将消息路由给操作系统,操作系统再传到窗口的过程函数处理)
   }
   return 0;  //程序结束
}
////////////////////////////////////////////////////////////////////////////////////
//窗口过程函数 WindowProc形式(名字可以改变,类型不可以改变) 返回值long结果码
 //CALLBACK宏: __stdcall 标准调用约定(也是PASCAL标准约定) 还有一种__cdecl: C语言调用约定(缺省)
 //主要区别:参数传递的顺序和堆栈的清除不同
 /* 
  * #define CALLBACK     __stdcall
  * #define WINAPI          __stdcall
  * #define WINAPIV        __cdecl
  * #define APIENTRY     WINAPI
  * #define APIPRIVATE   __stdcall
  * #define PASCAL         __stdcall    
  */
LRESULT CALLBACK WinSunProc(
   HWND hwnd,            //窗口句柄
   UINT uMsg,              //消息标识
   WPARAM wParam,  //附加信息(一个整数) WM_CHAR消息时:ASCⅡ码
   LPARAM lParam      //附加信息(一个整数) WM_CHAR消息时:key data
)
{
   switch(uMsg)
   {
   case WM_CHAR:    //按下字母键
      char szChar[20];
      sprintf(szChar,"char is %d",wParam); //库函数(格式化输出到字符数组)
      MessageBox(hwnd,szChar,"weixin",0); //消息框API函数  
      //依次参数为:[HWND]句柄:哪个窗口拥有消息框
      //[LPCTSTR]消息显示文本[LPCTSTR]消息标题[UINT]消息框类型
   break;

   case WM_LBUTTONDOWN:  //按下鼠标左键
      MessageBox(hwnd,"mouse clicked","weixin",0); //消息框函数
      HDC hdc;    //DC句柄(设备上下文/设备描述表(与显卡声卡相关系)
      hdc=GetDC(hwnd);  //获取DC句柄(跟哪个窗口相关的DC)相当于画布
      TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训")); //文本输出API函数
         //参数依次为:[HDC]DC句柄[int][int]输出文本的坐标位置[LPCTSTR]文本内容[int]文本长度
      ReleaseDC(hwnd,hdc);  //释放DC(内存泄漏)跟GetDC一对,不能在WM_PAINT消息中使用
   break;

   case WM_PAINT:   //窗口重绘消息(刷新)
      HDC hDC;      //DC句柄
      PAINTSTRUCT ps;    //结构体
      hDC=BeginPaint(hwnd,&ps);  //为窗口绘画做准备
      //参数依次为:[HWND]句柄[LPPAINTSTRUCT]系统所需填充结构体指针
      TextOut(hDC,0,0,"维新培训",strlen("维新培训"));  //文本输出
      EndPaint(hwnd,&ps);    //释放DC(跟BeginPaint一对)只能在WM_PAINT消息中使用
   break;

   case WM_CLOSE:  //窗口关闭时响应的消息
      if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO)) //消息框API函数
      {
         DestroyWindow(hwnd);  //销毁指定窗口,随之发送WM_DESTROY消息
      }
   break;

   case WM_DESTROY:
      PostQuitMessage(0);  //通知系统,请求应用程序终止,传送WM_QUIT到消息队列,立即返回
   break;       //使得GetMessage( )返回0,最终程序退出
  
   default:
      return DefWindowProc(hwnd,uMsg,wParam,lParam);  //缺省处理
   }

   return 0;
}

2006-11-5 17:40 5 小时
记录第一个运行的windows程序

Trackback from your site.

(2)条评论

  • wupei

    |

    貌似我也能看懂你的英文了,呵呵,很高兴的….英语水平提高ing

    回复

  • snowdown

    |

    偶然看到你QQ上个性签名中的BLOG,哈哈~~~过来踩踩~
    I think this paper just a sample frame of SDK Programming~

    回复

请在这里留言: