关于自己的第一个windows程序(新手使用WIN32 API编程)
自己的第一个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~
回复