Windows API一日一练(19)DestroyWindow函数-窗口的销毁

主目录传送门

https://blog.csdn.net/zb774095236/article/details/108291755

本次学习的源码模板下载:

1、 https://pan.baidu.com/s/1XqTLTQ2Noa72VgHeYQtUQw  提取码:6lzt

学习目标:

在上期的基础源码版本上学习一个新的函数

 


学习内容:

一、 项目参考  

新增函数解释 DestroyWindow

1. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-destroywindow  Microsoft官方函数文档

2.https://docs.microsoft.com/en-us/windows/win32/winmsg/using-windows    官方例程

3. https://blog.csdn.net/caimouse/article/details/1718105   大牛的Win32系列

 

二. 在往期模板上修改和新增的步骤
1.代码段

//库文件
#include "Windows.h"
#include "tchar.h"

#include "resource.h"

#define New_Add 0x01 //后续将采用宏定义的方式来标记新增代码段



HINSTANCE g_hInstance;

LRESULT CALLBACK ABOUTBOX_Proc(
	HWND hwnd,        // handle to window 
	UINT uMsg,        // message identifier
	WPARAM wParam,    // first message parameter
	LPARAM lParam)    // second message parameter
{
	switch (uMsg)
	{




	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
			// Fall through. 
		case IDCANCEL:
			EndDialog(hwnd, wParam);//结束对话框
			return TRUE;
		}
	}
	return FALSE;
}





LRESULT CALLBACK MainWndProc(
	HWND hwnd,        // handle to window 
	UINT uMsg,        // message identifier
	WPARAM wParam,    // first message parameter
	LPARAM lParam)    // second message parameter
{
	PAINTSTRUCT ps;
	HDC hdc;
	int wmId = (int)(wParam & 0xFFFF);//实验发现 wParam会有问题 这里做出来对应的修改
	switch (uMsg)
	{
#if New_Add
	case WM_CLOSE:

		// Create the message box. If the user clicks 
		// the Yes button, destroy the main window. 

		if (MessageBox(hwnd, _T("关闭窗口"), _T("测试"), MB_YESNOCANCEL) == IDYES)
			DestroyWindow(hwnd);
		else
			return 0;
		break;
#endif

	case WM_COMMAND:

		switch (wmId)
		{
		case ID_ABOUT:
			MessageBox(hwnd, _T("ALT+?"), _T("你使用了快捷键"), MB_OK);

			break;
		case ID_EXIT:
			//MessageBox(hwnd, _T("ALT+/"), _T("你使用了快捷键"), MB_OK);



#define DialogBoxTest_1  //想要调试那个自己改一下后面的参数
#if defined(DialogBoxTest_1)
			if (DialogBox(g_hInstance,
				MAKEINTRESOURCE(IDD_ABOUTBOX),
				hwnd,
				(DLGPROC)ABOUTBOX_Proc) == IDOK)
#elif defined(DialogBoxTest_2)
			if (DialogBoxParam(g_hInstance,
				MAKEINTRESOURCE(IDD_ABOUTBOX),
				NULL, (DLGPROC)ABOUTBOX_Proc,
				0) == IDOK)
#endif
			{
				MessageBox(hwnd, _T("确定"), _T("你使用了按钮"), MB_OK);
			}
			else
			{
				MessageBox(hwnd, _T("取消"), _T("你使用了按钮"), MB_OK);

			}


		
			break;
		default:
			break;
		}
		return 0;

	case WM_CREATE:
		// Initialize the window.

		return 0;

	case WM_PAINT:
		// Paint the window's client area. 
		hdc = BeginPaint(hwnd, &ps);
		TextOut(hdc, 0, 0, _T("Hello, Windows!"), 15);
		EndPaint(hwnd, &ps);
		return 0;

	case WM_SIZE:
		// Set the size and position of the window. 
		return 0;

	case WM_DESTROY:
		// Clean up window-specific data objects. 
		PostQuitMessage(0);
		return 0;

		// 
		// Process other messages. 
		// 

	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);//系统的默认消息处理函数
	}
	return 0;
}




//定义WinMain的入口
int APIENTRY _tWinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR    lpCmdLine,
	int       nCmdShow)
{

	//没有这些参数也不会发生警告
	//UNREFERENCED_PARAMETER(hInstance);
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);
	//UNREFERENCED_PARAMETER(nCmdShow);



	HACCEL hAccelTable;

	WNDCLASS wc; //创建窗口类对象

	//对窗口类的各属性进行初始化
	wc.style = CS_HREDRAW | CS_VREDRAW; /*窗口类的风格,CS前缀,C表示Class,S表示
										Style,这里使用了水平和垂直风格*/
	wc.lpfnWndProc = MainWndProc;  /*这里将回到函数的名字赋值用以windows后面回调*/
	wc.cbClsExtra = 0;  //附加参数,通常情况下为0
	wc.cbWndExtra = 0;  //附加参数,通常情况下为0
	wc.hInstance = hInstance;  //窗口句柄,这里将WinMain中的hInstance句柄赋值就可
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /*窗口图标,LoadIcon()是加载图标,这里是加载一个系统资源图标,LoadIcon()的原型是HICON LoadIcon(HINSTANCE, LPCSTR);*/
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);  /*加载鼠标,同上相似*/
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  /*窗口画刷,这里是使用的白色画刷,所以创建出来的窗口的背景颜色则是白色的*/
	wc.lpszMenuName = _T("MainMenu"); //窗口菜单名称,这里没有菜单,设为NULL
	wc.lpszClassName = _T("MainWindowClass");  //窗口类名称,这个窗口类名称可作为这个窗口的唯一标识

	/*注册窗口类*/
	if (!RegisterClass(&wc))
	{
		//注册窗口类失败时,弹出提示
		MessageBox(NULL, TEXT("This program requires Window NT!"), _T("MainWindowClass"), MB_ICONERROR);
		return FALSE;
	}

	/*创建窗口
	HWND CreateWindow(
	LPCTSTR lpClassName,  //窗口类名
	LPCTSTR lpWindowName, //窗口标题
	DWORD dwStyle,        //窗口风格,WS开头
	int x,                //窗口左上角x坐标
	int y,                //窗口左上角y坐标
	int nWidth,           //窗口宽度
	int nHeight,          //窗口高度
	HWND hWndParent,      //父窗口句柄
	HMENU hMenu,          //菜单句柄
	HANDLE hlnstance,     //窗口句柄
	LPVOID lpParam);      //改值会传递给窗口WM_CREATE消息的一个参数
	*/
	HWND hwnd;    //创建窗口函数CreateWindow()会返回一个HWND句柄,这里定义下,用来接收这个句柄
	hwnd = CreateWindow(_T("MainWindowClass"),    //窗口类名
		TEXT(" Hello Win32API"),    //窗口标题,会在窗口的左上角标题栏显示
		WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, //窗口风格
		CW_USEDEFAULT,  //窗口左上角x位置,这里使用的系统默认值,可自定义
		CW_USEDEFAULT,  //窗口左上角y位置
		CW_USEDEFAULT,  //窗口的宽度
		CW_USEDEFAULT,  //窗口的高度
		NULL, //该窗口的父窗口或所有者窗口的句柄,这里用不到,设为NULL
		NULL, //窗口菜单句柄,这里没有菜单,设置为NULL
		hInstance, //窗口句柄
		NULL  //传递给窗口WM_CREATE消息的一个参数,这里不用,设置为NULL
		);

	/*显示窗口,显示方式使用WinMain的参数*/
	ShowWindow(hwnd, nCmdShow);
	/*更新窗口*/
	UpdateWindow(hwnd);

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_TESTWIN));//自己定义的快捷键表


	g_hInstance = hInstance;//得到全局窗口的句柄



	MSG msg;
	// 主消息循环:
	while (GetMessage(&msg, nullptr, 0, 0))
	{

		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))//用来处理快捷键
		{
			TranslateMessage(&msg);//把虚键消息翻译成字符消息(WM_CHAR)
			//再把WM_CHAR消息放到消息队列中去
			DispatchMessage(&msg);//指示操作系统把这条消息发到窗口
			//过程MainWndProc 进行处理
		}
	}

	return 0;

}

项目下载地址:

1.百度云:https://pan.baidu.com/s/1gCzgIJtWEBgGcIsUwRWPSA  提取码:f5dv

留在最后

加班断了,加油奥力给

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要使用Windows API中的DialogBox函数创建一个对话框,并在对话框中添加一个垂直滚动条控件。 以下是一个简单的示例代码: ```c #include <windows.h> // 对话框过程函数 BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: // 设置滚动条范围和初始位置 SetScrollRange(hwndDlg, SB_VERT, 0, 100, TRUE); SetScrollPos(hwndDlg, SB_VERT, 0, TRUE); return TRUE; case WM_VSCROLL: // 处理滚动条消息 switch (LOWORD(wParam)) { case SB_THUMBPOSITION: case SB_THUMBTRACK: // 设置滚动条位置 SetScrollPos(hwndDlg, SB_VERT, HIWORD(wParam), TRUE); return 0; } break; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { // 关闭对话框 EndDialog(hwndDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; } // 弹出带有垂直滚动条的对话框 int ShowScrollableMessageBox(HWND hwndParent, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) { // 创建对话框 HWND hwndDlg = CreateDialog(NULL, NULL, hwndParent, DialogProc); // 设置对话框标题和文本 SetWindowText(hwndDlg, lpCaption); SetDlgItemText(hwndDlg, IDC_STATIC, lpText); // 显示对话框 int nResult = (int)DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), hwndParent, DialogProc); // 销毁对话框 DestroyWindow(hwndDlg); return nResult; } ``` 在上面的代码中,DialogProc是对话框过程函数,用于处理对话框的消息。在WM_INITDIALOG消息中,我们使用SetScrollRange函数设置滚动条的范围和初始位置。在WM_VSCROLL消息中,我们处理滚动条的消息,设置滚动条的位置。在WM_COMMAND消息中,我们处理对话框的关闭消息,关闭对话框并返回结果。 ShowScrollableMessageBox是我们自己编写的函数,用于弹出带有垂直滚动条的对话框。在函数中,我们首先使用CreateDialog函数创建对话框,并使用SetWindowText和SetDlgItemText函数设置对话框的标题和文本。然后,我们使用DialogBox函数显示对话框,并返回对话框的结果。最后,我们使用DestroyWindow函数销毁对话框。 要使用这个函数,你只需要调用它并传递相应的参数,就像使用MessageBox函数一样。例如: ```c ShowScrollableMessageBox(NULL, TEXT("这是一段很长的文本,需要滚动条来查看。"), TEXT("带有垂直滚动条的消息框"), MB_OK); ``` 注意,上面的代码中,我们使用了一个对话框模板,其中包含一个ID为IDC_STATIC的静态文本控件和一个ID为IDOK的确定按钮。你需要在资源文件中定义这个对话框模板,并在程序中使用它。例如,可以在.rc文件中定义如下资源: ``` IDD_DIALOG1 DIALOGEX 0, 0, 200, 100 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "带有垂直滚动条的消息框" FONT 8, "MS Sans Serif" BEGIN LTEXT "这是一段很长的文本,需要滚动条来查看。", IDC_STATIC, 10, 10, 180, 80, WS_VSCROLL | SS_LEFT | SS_NOPREFIX | WS_GROUP | WS_TABSTOP DEFPUSHBUTTON "确定", IDOK, 70, 90, 60, 14 END ``` 上面的资源定义中,我们使用了一个LTEXT控件来显示文本,并设置了WS_VSCROLL样式来启用垂直滚动条。我们还定义了一个默认按钮ID为IDOK。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值