Win32学习(第十天)控件与文件操作

本文介绍如何在Win32环境下创建和使用组合框控件,并演示了通过按钮控件实现组合框数据的添加及文件操作的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控件:
上次笔记记述了button,edit,static常用的控件及其使用方式,这次的控件主要是讲述组合框combobox的使用
这里首先需要借助一个自定义的控件创建函数

//创建控件
void CreateControl(HWND hParentWnd)
{   //WS_BORDER 在控件的外面添加边框
	CreateWindow(_T("static"), _T("请输入内容"), WS_CHILD | WS_VISIBLE, 10, 15, 100, 30, hParentWnd, (HMENU)5001, hInst, nullptr);
	CreateWindow(_T("edit"), _T(""), WS_CHILD | WS_VISIBLE | WS_BORDER, 110, 15, 300, 30, hParentWnd, (HMENU)6001, hInst, nullptr);
	CreateWindow(_T("button"), _T("添加数据"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 110, 50, 100, 30, hParentWnd, (HMENU)7001, hInst, nullptr);
	CreateWindow(_T("button"), _T("删除数据"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 310, 50, 100, 30, hParentWnd, (HMENU)7002, hInst, nullptr);
	//组合框  类名conbobox;
	//组合框一共分为三类:CBS_SIMPLE  简单组合框,CBS_DROPDOWN  下拉式组合框  CBS_DROPDOWNLIST  下拉列表式组合框
	CreateWindow(_T("combobox"), _T(""), WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | WS_BORDER, 110, 100, 300, 180, hParentWnd, (HMENU)8001, hInst, nullptr);
	//在使用组合框时,需要额外注意尺寸的高度,一定要留出足够的高度,否则组合框的内容是无法完全显示出来的
    //这只是一个预留高度,它并不代表里面只有一行字符串的时候,也有这个高度
}

与此同时,为了使其有一个对话框作为载体,在资源中添加一个对话框资源并使用它来作为载体

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_LBUTTONDOWN:
		DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);//这里的DlgProc是一个自定义的函数
		break;//按下鼠标显示添加的对话框资源
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择: 
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO:  在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

自定义的DlgProc函数`

`TCHAR strArr[1024] = {};
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		CreateControl(hDlg);
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case 7001:
			GetDlgItemText(hDlg, 6001, strArr, 1023);
			SetDlgItemText(hDlg, 8001, strArr);
			SendMessage(GetDlgItem(hDlg, 8001), CB_ADDSTRING, 0, (LPARAM)strArr);
			break;
		//组合框理解为有2个区域,
			//第一个区域为显示区域,组合框要显示什么字符串;
			//第二个区域为源区域,组合框提供了哪些字符可供选择
			//应用程序层级的发送消息,这里发的是一个组合框的控件消息(CB_ADDSTRING,追加字符串消息)
			//把添加的字符串通过lParam来传递
		case 7002:
			//GetDlgItemText(hDlg, 6001, strArr, 1023);
			//SetDlgItemText(hDlg, 8001, strArr);
			//wParam保存的是插入的下标
			//SendMessage(GetDlgItem(hDlg, 8001), CB_INSERTSTRING,1, (LPARAM)strArr);
			//wParam参数也是下标
			//SendMessage(GetDlgItem(hDlg, 8001), CB_DELETESTRING, 0, 0);
			//CB_RESETCONTENT释放所有空间
			//SendMessage(GetDlgItem(hDlg, 8001), CB_RESETCONTENT, 0, 0);
			
			//得到工作路径
			GetCurrentDirectory(1023, strArr);
			SetDlgItemText(hDlg, 6001, strArr);
			GetTempPath(1023, strArr);//得到临时路径
			MessageBox(0, strArr, 0, 0);
			break;

		}
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

文件操作:

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;
	
		case WM_COMMAND:
			
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
			{
				EndDialog(hDlg, LOWORD(wParam));
				////win32中文件操作的实现
				////1、定义用于文件操作的句柄(文件句柄)  HANDLE句柄
				//HANDLE hFile = nullptr;
				////2、创建文件
				//hFile = CreateFile(_T("2.txt"),//文件路径名,用相对路径
				//	GENERIC_WRITE,//文件的访问权限
				//	FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,//共享读模式
				//	nullptr,//安全属性
				//	OPEN_EXISTING,//文件创建方式
				//	FILE_ATTRIBUTE_NORMAL,//文件属性
				//	nullptr);//文件模板句柄
				//if (hFile == INVALID_HANDLE_VALUE)
				//{
				//	MessageBox(NULL, _T("打开文件失败"), _T("Error"), MB_OK);
				//	CloseHandle(hFile); //一定注意在函数退出之前对句柄进行释放。
				//	return (INT_PTR)TRUE;
				//}
				//char s[1024] = "NI";
				//DWORD len = 0;
				//ReadFile(hFile, s, 1023, &len, nullptr);
				//MessageBoxA(0, s, 0, 0);
				////SetFilePointer(hFile, 0, 0, FILE_BEGIN);
				//

				//WriteFile(hFile, s, strlen(s), &len, nullptr);

				//CloseHandle(hFile);
				WIN32_FIND_DATAA fileData;//文件的数据结构
				char fileStr[1024] = {};//准备一个辅助按钮
				HANDLE hFile = CreateFile(_T("2.txt"), GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
				HANDLE hFindFile = FindFirstFileA("../Debug/*.*",//路径文件名 *.*表示所有文件,不管文件名和后缀名
					&fileData);
				memcpy(fileStr, fileData.cFileName, sizeof(char)*strlen(fileData.cFileName));
				strcat_s(fileStr, "\r\n");
				DWORD len = 0;
				WriteFile(hFile, fileStr, strlen(fileStr), &len, nullptr);
				while (FindNextFileA(hFindFile, &fileData))
				{
					ZeroMemory(fileStr, sizeof(char)* 1024);
					memcpy(fileStr, fileData.cFileName, sizeof(char)*strlen(fileData.cFileName));
						strcat_s(fileStr, "\r\n");
						WriteFile(hFile, fileStr, strlen(fileStr), &len, nullptr);
				}
				//CloseHandle(hFindFile);
				CloseHandle(hFile);
				return (INT_PTR)TRUE;
			}

			break;
	
	}
	return (INT_PTR)FALSE;
}``

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值