WindowsAPI实现简单窗口操作
目的
- 了解Windows操作系统应用程序开发的基本概念,win32API函数、消息与事件驱动;
- 掌握Win Main函数的基本框架,窗口定义、窗口创建、消息循环及窗口过程函数;
准备工具
- 这里我用的是VC++6.0、WindowsXP
- 虚拟机装载XP进行实验操作
创建过程:
1.定义WinMain函数;
2.设计窗口类WNDCLASS;
3.注册窗口类,告诉系统窗口过程函数;
4.创建窗口类,定义一个变量来保存成功创建窗口返回的句柄;
5.显示及刷新窗口
6.定义循环体结构体,开始消息循环;
7.编写窗口函数
源码
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc(
HWND hwnd, //窗口句柄
UINT uMsg, //消息代码
WPARAM wParam, //第一消息参量
LPARAM lParam //第二消息参量
);
//定义WinMain函数
int WINAPI WinMain(
HINSTANCE hInstance, //运行当前窗口句柄
HINSTANCE hPrevInstance, //起一个窗口实例
LPSTR lpCmdLine, //命令长参数
int nCmdShow //指定窗口显示格式
) //应用程序实例
{
//设计一个窗口类
WNDCLASS wndlcs;
wndlcs.cbClsExtra=0; //类的附加信息
wndlcs.cbWndExtra=0; //窗口的附加信息
wndlcs.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndlcs.hCursor=LoadCursor(NULL,IDC_CROSS);//加载系统默认光标
wndlcs.hIcon=LoadIcon(NULL,IDI_ERROR); //加载系统默认图标
wndlcs.hInstance=hInstance; //应用程序实例句柄由WinMain函数传进来
wndlcs.lpfnWndProc=WinSunProc; //窗口的过程函数名字,消息处理函数
wndlcs.lpszClassName="Mr.Kuang2020"; //类的名字
wndlcs.lpszMenuName=NULL; //菜单名字
wndlcs.style=CS_HREDRAW |CS_VREDRAW;
//注册窗口类,告诉系统窗口过程函数
RegisterClass(&wndlcs);
//创建窗口类,定义一个变量来保存成功创建窗口返回的句柄
HWND hwnd;
hwnd=CreateWindow("Mr.Kuang2020","http://www.Mr.Kuang2020.org",
WS_OVERLAPPEDWINDOW, //窗口风格
400,400,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 WinSunProc(
HWND hwnd, //同开始
UINT uMsg, //
WPARAM wParam, //
LPARAM lParam //
)
{
switch(uMsg)
{
case WM_CHAR: //定义字符
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
break;
case WM_LBUTTONDOWN: //鼠标左键按下
MessageBox(hwnd,"打开页面","鼠标左键按下",0);
HDC hdc;
hdc=GetDC(hwnd); //不能在响应WM_PAINT消息时调用
TextOut(hdc,0,50,"一个小窗口",strlen("一个小窗口"));
//ReleaseDC(hwnd,hdc);
break;
case WM_PAINT: //窗口绘制
HDC hDC;
PAINTSTRUCT ps; //开始绘制
hDC=BeginPaint(hwnd,&ps); //BeginPaint只能在响应WM_PAINT消息是调用
TextOut(hDC,150,150,"http://www.Mr.Kuang2020.org",strlen("http://www.Mr.Kuang2020.org"));
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;
}
实验截图
- 运行源码
- 点击退出