#include <Windows.h>//头文件
//6.处理窗口过程
//CALLBACK代表_stdcall参数的传递顺序,从右到左依次入栈,并且在函数返回前清空堆栈
LRESULT CALLBACK WindowProc(
HWND hwnd,//消息所属的窗口句柄
UINT uMsg,//具体的消息名称 WM_XXXX 消息名
WPARAM wParam,//键盘附加消息
LPARAM lParam//鼠标附加消息
)
{
switch(uMsg)
{
case WM_CLOSE:
//所有以XXXwindow为结尾的方法,都不会进入到消息队列中,而是直接执行,直接窗口过程
DestroyWindow(hwnd);//并不是结束进程,知识简单的关闭窗口,发送另个消息WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0);//发送一个退出消息,到下面的getmessae函数中退出,结束进程
break;
case WM_LBUTTONDOWN://鼠标左键按下
{
/*
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char buf[1024];
wsprintf(buf,TEXT("X = %d,Y = %d"),xPos,yPos);
MessageBox(hwnd,buf,TEXT("鼠标左键按下"),MB_OK);
*/
MessageBox(hwnd,TEXT("aaa"),TEXT("鼠标左键按下"),MB_OK);
break;
}
case WM_KEYDOWN://键盘
MessageBox(hwnd,TEXT("键盘按下"),TEXT("键盘按下"),MB_OK);
break;
case WM_PAINT://绘图
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd,&ps);
TextOut(hdc,100,100,TEXT("HELLO"),strlen("HELLO"));
EndPaint(hwnd,&ps);
break;
}
//返回值为默认处理方式
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//程序入口函数
//转到声明可以知道
//WINAPI代表_stdcall参数的传递顺序,从右到左依次入栈,并且在函数返回前清空堆栈
int WINAPI WinMain(
__in HINSTANCE hInstance, //应用程序实例句柄
__in_opt HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32环境下,参数一般为NULL,不起作用
__in LPSTR lpCmdLine,//char* argv[];命令行输入操作
__in int nShowCmd )//显示命令 最大化、最小化、正常
{
//1.设计窗口
//2.注册窗口
//3.创建窗口
//4.显示和更新
//5.通过循环取消息
//6.处理消息(窗口过程)
//1.设计窗口
WNDCLASS wc;
wc.cbClsExtra = 0 ;//额外的类的内存
wc.cbWndExtra = 0 ;//窗口的额外的内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景
wc.hCursor = LoadCursor(NULL,IDC_HAND);//设置光标,如果第一个参数为NULL,设置系统光标
wc.hIcon = LoadIcon(NULL,IDI_ERROR);//设置图标
wc.hInstance = hInstance;//应用程序实例句柄,传入winmain中形参即可
wc.lpfnWndProc = WindowProc;//窗口过程,回调函数
wc.lpszClassName = TEXT("WIN");//指定窗口类名称
wc.lpszMenuName = NULL;//菜单名称
wc.style = 0;//显示风格 0代表默认风格
//2.注册窗口
RegisterClass(&wc);
//3.创建窗口
/*
lpClassName, 类名
lpWindowName,标题名
dwStyle, 风格通常是要用WS_OVERLAPPEDWINDOW
x, 坐标 有默认值
y,
nWidth, 宽高
nHeight,
hWndParent, 父窗口,没有填NULL
hMenu, 菜单NULL
hInstance, 实例句柄 hinstance
lpParam 附加值NULL
*/
HWND hwnd = CreateWindow(wc.lpszClassName,TEXT("WINDOWS"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
//显示和更新
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
//通过循环取消息
/*HWND hwnd; 主窗口句柄
UINT message; 具体消息名称
WPARAM wParam; 附加消息键盘消息
LPARAM lParam; 附加消息 鼠标消息左右键
DWORD time; 消息产生的时间
POINT pt; 附加消息 鼠标消息(x,y)
*/
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
/* GetMessage函数形参
__out LPMSG lpMsg, 消息
__in_opt HWND hWnd, 捕获窗口 填NULL 代表捕获所有窗口
__in UINT wMsgFilterMin, 过滤最小和最大的过滤消息,一般写0
__in UINT wMsgFilterMax*/
//if (GetMessage(&msg,NULL,0,0) == FALSE) //点×了就退出,获取消息为false值退出
//{
// break;
//}
//翻译消息:比如说组合键
TranslateMessage(&msg);
//不为false
//分发消息
DispatchMessage(&msg);
}
}
MFC基础2
最新推荐文章于 2020-05-22 09:03:43 发布