目录
WinMain程序如下:
#include <windows.h>
#include <stdio.h>
//消息是由MSG结构体来表示的。
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window表示消息所属的窗口
UINT uMsg, // message identifier指定了消息的标识符
WPARAM wParam, // first message parameter指定消息的附加信息
LPARAM lParam // second message parameter指定消息的附加信息
);
//WinMain是Windows程序的入口点函数。
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance该程序当前运行的实例的句柄
HINSTANCE hPrevInstance, // handle to previous instance当前实例的前一个实例的句柄
LPSTR lpCmdLine, // command line一个以空终止的字符串,指定传递给应用程序的命令行参数。
int nCmdShow // show state指定程序的窗口应该如何显示
)
{
//窗口的特征就是由WNDCLASS结构体来定义的。
//设计一个窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra = 0; //为系统中的每一个窗口类管理一个 WNDCLASS 结构。不应使用(应为零)
wndcls.cbWndExtra = 0; //为每一个窗口管理一个内部数据结构,不应使用(应为零)
wndcls.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); //hbrBackground指定窗口类的背景画刷句柄。背景色
wndcls.hCursor = LoadCursor(NULL, IDC_ARROW); //hCursor 指定窗口类的光标句柄。当鼠标悬停在窗口上时的游标
wndcls.hIcon = LoadIcon(NULL, IDI_QUESTION); //hIcon指定窗口类的图标句柄。框架窗口的图标
wndcls.hInstance = hInstance; //hInstance指定包含窗口过程的程序的实例句柄。自动填充 AfxGetInstanceHandle,应用程序实例句柄由WinMain函数传进来
wndcls.lpfnWndProc = WinSunProc; //函数指针,指向窗口过程函数。窗口进程,必须是 AfxWndProc
wndcls.lpszClassName = "have a happy day"; // lpszClassName 是一个以空终止的字符串,指定窗口类的名字。类名
wndcls.lpszMenuName = NULL; //lpszMenuName是一个以空终止的字符串,指定菜单资源的名字。不应使用(应为NULL)
wndcls.style = CS_HREDRAW | CS_VREDRAW;//style指定这一类型窗口的样式,当窗口水平方向垂直方向上的高度发生变化时,将重新绘制整个窗口。
//在设计完窗口类(WNDCLASS)后,需要调用 RegisterClass 函数对其进行注册,在注册成功后,才可以创建该类型的窗口。
RegisterClass(&wndcls);
//创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄
HWND hwnd;
hwnd = CreateWindow("have a happy day", "hello",
WS_OVERLAPPEDWINDOW, 10, 10, 500, 500, NULL, NULL, hInstance, NULL);
//显示及刷新窗口
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
//定义消息结构体,开始消息循环
MSG msg;
BOOL bRet;
//while (GetMessage(&msg, NULL, 0, 0))
while ((bRet = GetMessage(&msg, hwnd, 0, 0)) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
return -1;
}
else
{
TranslateMessage(&msg);//用于将虚拟键消息转换为字符消息。
DispatchMessage(&msg);//分派一个消息到窗口过程,由窗口过程函数对消息进行处理。
}
}
return msg.wParam;
}
//编写窗口过程函数
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window,消息的窗口句柄
UINT uMsg, // message identifier,消息代码
WPARAM wParam, // first message parameter,消息代码的附加参数
LPARAM lParam // second message parameter,消息代码的附加参数
)
{
switch (uMsg)
{
case WM_CHAR://当用户在窗口中按下一个字符键,程序将得到一条WM_CHAR消息
char szChar[20];
sprintf_s(szChar, sizeof(szChar), "char code is %d", wParam);
MessageBox(hwnd, szChar, "char", 0);//弹出一个包含了显示信息的消息框
break;
case WM_LBUTTONDOWN://当用户在窗口中按下鼠标左键时,将产生WM_LBUTTONDOWN消息调用MessageBox,函数弹出一个提示信息,告诉用户“点击了鼠标”
MessageBox(hwnd, "mouse clicked", "message", 0);
HDC hdc;//定义了一个类型为HDC的变量hdc
hdc = GetDC(hwnd);//用hdc保存GetDC函数返回的与特定窗口相关联的DC的句柄。不能在响应WM_PAINT消息时调用
TextOut(hdc, 0, 50, "HAVE A NICE DAY!", strlen("HAVE A NICE DAY!"));//TextOut函数利用得到的DC句柄在指定的位置(x坐标为0,y坐标为50)输出一行文字
ReleaseDC(hwnd, hdc);//如果使用GetDC函数来得到DC的句柄,那么在完成图形操作后,必须调用ReleaseDC函数来释放DC所占用的资源,否则会引起内存泄漏。
break;
case WM_PAINT://对WM_PAINT消息进行处理。当窗口客户区的一部分或者全部变为“无效”时,系统会发送WM_PAINT消息,通知应用程序重新绘制窗口。
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd, &ps);//调用BeginPaint函数得到DC的句柄。BeginPaint函数的第1个参数是窗口的句柄,第二个参数是PAINTSTRUCT结构体的指针,该结构体对象用于接收绘制的信息。BeginPaint只能在响应WM_PAINT消息时调用
TextOut(hDC, 0, 0, "https://blog.csdn.net/qq_44974888/article/details/124137129?spm=1001.2014.3001.5501", strlen("https://blog.csdn.net/qq_44974888/article/details/124137129?spm=1001.2014.3001.5501"));//TextOut函数在(0,0)的位置输出一个网址
EndPaint(hwnd, &ps);//BeginPaint函数得到的DC,必须用EndPaint函数去释放
break;
case WM_CLOSE://当用户单击窗口上的关闭按钮时,系统将给应用程序发送一条WM_CLOSE 消息。
if (IDYES == MessageBox(hwnd, "是否退出程序?", "warning", MB_YESNO))
{
DestroyWindow(hwnd);//调用DestroyWindow函数销毁窗口
}//DestroyWindow 函数在销毁窗口后会向窗口过程发送 WM_DESTROY 消息。注意,此时窗口虽然销毁了,但应用程序并没有退出。
break;
case WM_DESTROY://DestroyWindow函数在销毁窗口后,会给窗口过程发送WM_DESTROY消息,在该消息的响应代码中调用PostQuitMessage函数
PostQuitMessage(0);//PostQuitMessage函数向应用程序的消息队列中投递一条WM_QUIT消息并返回
break;//GetMessage函数只有在收到WM_QUIT消息时才返回0,此时消息循环才结束,程序退出
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);//对WM_CLOSE消息的响应并不是必须的,如果应用程序没有对该消息进行响应,系统将把这条消息传给DefWindowProc函数,那么DefWindowProc函数则调用DestroyWindow函数来响应这条WM_CLOSE消息。
}
return 0;
}