控件:
上次笔记记述了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;
}``