数据类型
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个函数:
关于参数类别:
变量的一些命名规则:
结构 和 标示符 :