📄 student.cpp
字号:
SendMessage(hCtrlWnd, CB_ADDSTRING, 0, (LPARAM)szText);
}
SendMessage(hCtrlWnd, CB_SETCURSEL, 0, 0); // 设置当前默认月份为1月
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_COMBO_DAY); // 设置“日期”下拉框中的数据
for(x=1; x<=31; x++) // 默认一个月为31天(因为现在默认月份为1月份)
{
sprintf(szText, "%02d", x);
SendMessage(hCtrlWnd, CB_ADDSTRING, 0, (LPARAM)szText);
}
SendMessage(hCtrlWnd, CB_SETCURSEL, 0, 0); // 默认当前日期为1号
if(lParam) // lParam不为NULL,表示对话框弹出的目的是修改信息而不是添加新学生
{
LPSTUDENT_INFO lpInfo;
lpInfo = (LPSTUDENT_INFO)lParam; // 从lParam中得到传过来的学生信息
SetWindowText(hDlgWnd, "修改学生信息");
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_NAME);
SetWindowText(hCtrlWnd, lpInfo->m_szName); // 向控件填充学生姓名
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_NUMBER);
SetWindowText(hCtrlWnd, lpInfo->m_szNumber); // 向控件填充学生学号
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_CLASS);
SetWindowText(hCtrlWnd, lpInfo->m_szClass); // 向控件填充学生班级号
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_TEL);
SetWindowText(hCtrlWnd, lpInfo->m_szTelephone); // 向控件填充学生联系电话
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_ADDRESS);
SetWindowText(hCtrlWnd, lpInfo->m_szAddress); // 向控件填充学生家庭住址
// 设置好学生性别
CheckRadioButton(hDlgWnd,IDC_RADIO_MALE, IDC_RADIO_FEMALE,
(lpInfo->m_bSex ? IDC_RADIO_MALE : IDC_RADIO_FEMALE));
// 设置好学生出生年月日
// 设置年
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_COMBO_YEAR);
SendMessage(hCtrlWnd, CB_SETCURSEL, lpInfo->m_dtBirthday.m_nYear - 1900, 0);
// 设置月
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_COMBO_MONTH);
SendMessage(hCtrlWnd, CB_SETCURSEL, lpInfo->m_dtBirthday.m_nMonth - 1, 0);
// 设置日
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_COMBO_DAY);
SendMessage(hCtrlWnd, CB_SETCURSEL, lpInfo->m_dtBirthday.m_nDay - 1, 0);
// 当前功能为修改,所以使用指针lpOrgStu保存原来的节点
lpOrgStu = lpInfo;
}
else // 传过来NULL参数,则表明目的是创建一个新学生
{
SetWindowText(hDlgWnd, "添加一个新同学");
// 当前功能为添加,所以无所谓原先节点
lpOrgStu = NULL;
}
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_COMBO_YEAR:
case IDC_COMBO_MONTH: // 下拉框发来消息(可能是用户使用鼠标或者键盘点击了下拉框)
if(HIWORD(wParam) == CBN_SELCHANGE) // 用户的选择改变了“年份”或者“月份下拉框”
{
InitDateCombo(hDlgWnd); // 重新初始化下拉框
}
break;
case IDOK: // 点击了【确定】按钮
LPSTUDENT_INFO lpInfo;
// 得到新学生的信息(或者修改更新后的学生信息)
lpInfo = GetNewStudentInfo(hDlgWnd, lpOrgStu);
if(!lpInfo) break;
EndDialog(hDlgWnd, (int)lpInfo);
return TRUE;
case IDCANCEL:
EndDialog(hDlgWnd, IDCANCEL);
return TRUE;
default: break;
}
break;
}
return FALSE;
}
// 初始化【添加新学生】对话框上的年月日下拉框
void InitDateCombo(HWND hDlgWnd)
{
TCHAR szText[MAX_STRING] = "\0";
int nMonth, nYear, nDays = 0;
HWND hYearWnd, hMonthWnd, hDayWnd;
hYearWnd = GetDlgItem(hDlgWnd, IDC_COMBO_YEAR);
hMonthWnd = GetDlgItem(hDlgWnd, IDC_COMBO_MONTH);
hDayWnd = GetDlgItem(hDlgWnd, IDC_COMBO_DAY);
GetWindowText(hYearWnd, szText, MAX_STRING);
nYear = atoi(szText); // 将数字字符串转换为数字
GetWindowText(hMonthWnd, szText, MAX_STRING);
nMonth = atoi(szText); // 将数字字符串转换为数字
if(nMonth <= 0) return;
if(nYear <= 0) return;
nDays = 0;
if(nMonth == 2)
{
if((nYear%4==0 && nYear%100!=0) || (nYear%400==0)) // 是闰年
nDays = 29;
else nDays = 28;
}
else
{
// 是小月
if(nMonth==4 || nMonth==6 || nMonth==9 || nMonth==11)
nDays = 30;
else nDays = 31; // 是大月
}
if(nDays != 0)
{
int x, nIndex;
nIndex = SendMessage(hDayWnd, CB_GETCURSEL, 0, 0); // 保存原先的选项
SendMessage(hDayWnd, CB_RESETCONTENT, 0, 0);
for(x=1; x<=nDays; x++)
{
sprintf(szText, "%02d", x);
SendMessage(hDayWnd, CB_ADDSTRING, 0, (LPARAM)szText);
}
SendMessage(hDayWnd, CB_SETCURSEL, nIndex, 0);
}
return;
}
// 初始化主窗口滚动条
// SIZE size:当前窗口的大小
// BOOL bFlag:为TRUE,则初始化水平滚动条,为FALSE,则初始化垂直滚动条
void InitScrollBar(SIZE size, BOOL bFlag)
{
SCROLLINFO si;
int nPos = 0, nMax = 0, nScrollBar = 0, nPage;
if(bFlag) // 是水平滚动条
{
nScrollBar = SB_HORZ;
nMax = g_sInfoTextSize.cx;
nPage = size.cx;
}
else // 是垂直滚动条
{
nScrollBar = SB_VERT;
nMax = g_sInfoTextSize.cy;
nPage = size.cy;
}
memset(&si, 0, sizeof(SCROLLINFO));
// 得到当前滚动条的位置
nPos = GetScrollPos(g_hMainWnd, nScrollBar);
si.cbSize = sizeof(SCROLLINFO); // 此结构体(SCROLLINFO)的大小
si.fMask = SIF_ALL; // 滚动条用来干什么?设置为SIF_ALL,则滚动条具备所有滚动功能
si.nMin = 0; // 滚动条可以拖放到的最小值,通常就直接设置为0
si.nMax = nMax; // 滚动条可以拖放到的最大值
si.nPage = nPage; // 翻一页可以滚动多少个像素?
si.nPos = min(nPos, si.nMax); // 滚动条当前新位置
// 设置滚动条
SetScrollInfo(g_hMainWnd, nScrollBar, &si, TRUE);
}
// 【删除学生】对话框回调函数
LRESULT CALLBACK DeleteDlgProc(HWND hDlgWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
CheckRadioButton(hDlgWnd, IDC_RADIO_NUMBER, IDC_RADIO_NAME, IDC_RADIO_NUMBER);
if(lParam) // lParam的值为TRUE,表示此对话框当前的功能是删除
{
HWND hCtrlWnd = NULL;
SetWindowText(hDlgWnd, "删除一个学生");
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_RADIO_NUMBER);
SetWindowText(hCtrlWnd, "按照学号删除");
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_RADIO_NAME);
SetWindowText(hCtrlWnd, "按照姓名删除");
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_TRIP);
SetWindowText(hCtrlWnd, "输入需要删除的学生(&E):");
}
else // lParam的值为FALSE,表示当前此对话框的功能是查找,为“修改学生信息”功能服务
{
// 此时,必须修改一些控件上面显示的文本,让它变得更加友好
HWND hCtrlWnd = NULL;
SetWindowText(hDlgWnd, "查询一个学生");
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_RADIO_NUMBER);
SetWindowText(hCtrlWnd, "按照学号查找");
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_RADIO_NAME);
SetWindowText(hCtrlWnd, "按照姓名查找");
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_TRIP);
SetWindowText(hCtrlWnd, "输入需要修改的学生(&M):");
hCtrlWnd = GetDlgItem(hDlgWnd, IDOK);
SetWindowText(hCtrlWnd, "查找(&S)");
}
return TRUE;
case WM_COMMAND:
switch((LOWORD(wParam)))
{
case IDOK:
TCHAR szText[MAX_STRING];
int nRet;
HWND hCtrlWnd;
LPSTUDENT_INFO lpInfo;
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_COMBO_INFO);
GetWindowText(hCtrlWnd, szText, MAX_STRING); // 得到用户输入的查找信息
// 得到【按姓名查找】还是【按学号查找】
nRet = IsDlgButtonChecked(hDlgWnd, IDC_RADIO_NUMBER);
lpInfo = SearchLink(szText, (nRet==BST_CHECKED));
if(!lpInfo)
{
MessageBox(hDlgWnd, "不存在的学生姓名/学号!", "错误", MB_OK | MB_ICONERROR);
break;
}
hCtrlWnd = GetDlgItem(hDlgWnd, IDOK);
GetWindowText(hCtrlWnd, szText, MAX_STRING);
// 判断当前是“查找”还是“删除”
// 如果当前功能是“查找”,则【确定】按钮上面显示的文本是“查找”
// 这里直接根据此按钮上显示的文本作出判断
if(!strcmp(szText, "确定(&O)"))
{
nRet = MessageBox(hDlgWnd, "是否一定要删除此学生?", "提示", MB_YESNO | MB_ICONQUESTION);
if(nRet != IDYES) break;
EndDialog(hDlgWnd, (int)lpInfo);
}
else if(!strcmp(szText, "查找(&S)")) // 当前功能是查找,为“修改学生信息”功能服务
{
LPSTUDENT_INFO lpTmp = NULL, lpNext = NULL;
// 弹出【修改学生信息】对话框
nRet = DialogBoxParam(g_hAppInst, MAKEINTRESOURCE(IDD_NEWSTU_DLG), hDlgWnd, (DLGPROC)NewStuDlgProc,(LPARAM)lpInfo);
if(nRet==IDCANCEL || nRet == 0) break;
lpTmp = (LPSTUDENT_INFO)nRet;
lpNext = lpInfo->m_lpNext; // 保存后置指针
// 将修改后的信息应用到链表节点中
memcpy(lpInfo, lpTmp, sizeof(STUDENT_INFO));
lpInfo->m_lpNext = lpNext; // 恢复后置指针
free(lpTmp);
SetSaveFlag(FALSE);
InvalidateRect(g_hMainWnd, NULL, TRUE);
}
return TRUE;
case IDCANCEL:
EndDialog(hDlgWnd, IDCANCEL);
return TRUE;
default: break;
}
break;
}
return FALSE;
}
// 【关于】对话框回调函数
LRESULT CALLBACK AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
// 得到一个新学生的信息
LPSTUDENT_INFO GetNewStudentInfo(HWND hDlgWnd, LPSTUDENT_INFO lpOrgStu)
{
LPSTUDENT_INFO lpInfo, lpTmp;
TCHAR szText[MAX_STRING] = "\0";
HWND hCtrlWnd = NULL;
lpInfo = (LPSTUDENT_INFO)malloc(sizeof(STUDENT_INFO));
memset(lpInfo, '\0', sizeof(STUDENT_INFO));
// 得到学号
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_NUMBER);
GetWindowText(hCtrlWnd, szText, MAX_STRING);
if(!strlen(szText))
{
MessageBox(hDlgWnd, "请正确输入学号!", "错误", MB_OK | MB_ICONERROR);
free(lpInfo);
return NULL;
}
lpTmp = SearchLink(szText, TRUE);
// lpTmp不为NULL,则表明此学号已经存在
// lpTmp==lpOrgStu,则表明当前所作的操作是修改学生信息而不是新增学生
// 修改学生信息,不允许将学生学号修改为其它已经存在的学生学号
if(lpTmp && lpTmp!=lpOrgStu)
{
MessageBox(hDlgWnd, "该学号已经存在!", "错误", MB_OK | MB_ICONERROR);
free(lpInfo);
return NULL;
}
strncpy(lpInfo->m_szNumber, szText, 8);
// 得到姓名
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_NAME);
GetWindowText(hCtrlWnd, szText, MAX_STRING);
if(!strlen(szText))
{
MessageBox(hDlgWnd, "请正确输入姓名!", "错误", MB_OK | MB_ICONERROR);
free(lpInfo);
return NULL;
}
lpTmp = SearchLink(szText, FALSE);
// 同理于上面的学号检验,但是当发现同名情况,不是给出错误提示,而是给出警告提示
// 链表的主键是学号,而不是姓名,当不推荐出现同名情况,所以发现同名情况仅仅给出警告
if(lpTmp && lpTmp!=lpOrgStu)
{
int nRet = 0;
nRet = MessageBox(hDlgWnd, "该姓名的学生已经存在!是否一定要添加此学生?",
"提示", MB_YESNO | MB_ICONINFORMATION);
if(nRet == IDNO)
{
free(lpInfo);
return NULL;
}
}
strncpy(lpInfo->m_szName, szText, 8);
// 得到性别
lpInfo->m_bSex = (IsDlgButtonChecked(hDlgWnd, IDC_RADIO_MALE) == BST_CHECKED);
// 得到出生年月
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_COMBO_YEAR);
GetWindowText(hCtrlWnd, szText, MAX_STRING); // 得到年
lpInfo->m_dtBirthday.m_nYear = atoi(szText);
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_COMBO_MONTH);
GetWindowText(hCtrlWnd, szText, MAX_STRING); // 得到月
lpInfo->m_dtBirthday.m_nMonth = atoi(szText);
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_COMBO_DAY);
GetWindowText(hCtrlWnd, szText, MAX_STRING); // 得到日
lpInfo->m_dtBirthday.m_nDay = atoi(szText);
// 得到班级号
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_CLASS);
GetWindowText(hCtrlWnd, szText, MAX_STRING);
strncpy(lpInfo->m_szClass, szText, 8);
// 得到联系电话
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_TEL);
GetWindowText(hCtrlWnd, szText, MAX_STRING);
if(strlen(szText))
{
strncpy(lpInfo->m_szTelephone, szText, 10);
}
// 得到家庭住址
hCtrlWnd = GetDlgItem(hDlgWnd, IDC_EDIT_ADDRESS);
GetWindowText(hCtrlWnd, szText, MAX_STRING);
if(strlen(szText))
{
strncpy(lpInfo->m_szAddress, szText, 50);
}
return lpInfo;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -