关于自己的第一个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~
回复