动手写一个基于windows API 的基于窗体、消息循环、事件驱动的 Windows C语言风格的Windows 程序。
//定义窗口类
typedef struct WNDCLASS{
UINT style;//窗口类的类型
WNDPROC lpfnWndProc;//窗口的过程函数(回调函数)
int cbClsExtra;//窗口类的附加内存,一般设置为0
int cbWndEXtra;//窗口附加内存空间,通常设置为0
HISNSTANCE hInstance;//实例号
HICON hIcon;//图标句柄
HCURSOR hCursor;//光标句柄
HBRUSH hbrBackground;//画刷句柄
LPCTSTR lpszMenuName;//设置菜单的名字
LPCTSTR lpszClassName;//设置类的名称
}WNDCLASS;
//注册函数
RegisterClass(){
const WNDCLASS *ipWndClass;//窗口类的指针
}
//创建窗口的函数原型声明
HWND CreateWindow(
LPCTSTR lpClassName,//窗口类名称
LPCTSTR lpWindowName,//窗口的名称
DWORD dwstyle,//创建窗口的样式
int x,//窗口左上角x坐标
int y,//窗口左上角y坐标
int nWidth,//窗口宽度
int nHeight,//窗口高度
HWND hWndParent,//创建窗口的父窗口句柄
HMENU hMenu,//窗口菜单的句柄
HANDLE hInstance,//窗口所属的应用程序的实例句柄
LPVOID lpParam//数据指针
);
//显示窗口
BOOL ShowWindow(
HWND hWnd,//窗口句柄
int nCmdShow//窗口显示状态
);
//更新窗口
BOOL UpdateWindow(
HWND hWnd//创建成功后的窗口句柄
)
typedef struct tagMSG{
HWND hWnd;//窗口表示,代表消息所属窗口
UINT message;//消息标识
WPARAM wParam;//消息附加信息
LPARAM lParam;//消息附加信息
DWORD time;//消息投递到消息队列的时间
POINT pt;//鼠标当前位置
}
BOOL GetMessage(
LPMSG lpMsg,//指向消息结构体
HWND hWnd,//接收属于哪个窗口的消息
UINT wMsgFilteMin,//获取消息的最小值
UINT wMsgFilteMax//获取消息的最大值
);
MSG msg;//一个消息对象
//消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//将虚拟键消息转换为字符消息
DispatchMessage(&msg);//将消息传回给操作系统
}
LRESULT CALLBACK WindowProc(
HWND hWnd,//窗口句柄
UINT uMsg,//消息代码
WPARAM wParam,//消息附加参数
LPARAM lParam//消息附加参数
)
#include
#include
LRESULT CALLBACK WindowProc(
HWND hWnd,//窗口句柄
UINT uMsg,//消息代码
WPARAM wParam,//消息附加参数
LPARAM lParam//消息附加参数
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//设计一个窗口类
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
//wndclass.hbrBackground=CreateSolidBrush(RGB(183,157,226));//对窗口背景颜色的设置,画刷句柄
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);//光标句柄,IDC_CROSS表示十字形光标
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//图标句柄,窗口默认图标
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WindowProc;
wndclass.lpszClassName="sunxin2006";//类名称可以自己选择
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW | CS_VREDRAW;
//CS_HREDRAW表示窗口水平方向宽度变化,将重新绘制窗口;CS_VREDRAW表示窗口垂直方向高度变化,将重新绘制窗口
//注册窗口
RegisterClass(&wndclass);
//创建窗口
HWND hwnd;
hwnd=CreateWindow("sunxin2006","http://www.sunxin.org",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
//显示和刷新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
//消息循环
MSG msg;//一个消息对象
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//将虚拟键消息转换为字符消息
DispatchMessage(&msg);//将消息传回给操作系统
}
return msg.wParam;
}
//窗口过程函数
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
RECT rect;//矩形结构
switch(uMsg)
{
//表示当键盘输入一个按键,程序将获得一个WM_CHAR消息
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char is %d",wParam);//将字符转成ASCII,放到数组szChar
MessageBox(hwnd,szChar,"提示信息",MB_OK); //信息消息框
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","提示信息",MB_OK);//鼠标点击,显示一个提示内容
HDC hdc;//设备环境句柄
hdc=GetDC(hwnd);
TextOut(hdc,250,200,"Hello World!",strlen("Hello World!"));//在窗口输出一句Hello World
ReleaseDC(hwnd,hdc);
break;
//客户区重绘消息
case WM_PAINT:
HDC hDC;//设备环境句柄
PAINTSTRUCT ps; //绘制结构
hDC=BeginPaint(hwnd,&ps);
DrawText(hDC,TEXT("Hello"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd,&ps);
break;
//实现关闭窗口的消息响应
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","提示信息",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
创建一个Win32的应用程序,主要步骤是对窗口的创建,显示,以及编写消息循环,窗口过程函数。完成这些步骤,一个基本的Window API窗口程序就基本完成。
提示:灵活使用MSDN对编写程序帮助很大