⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 student.cpp

📁 这个个系统是学生管理系统。利用SDK做界面
💻 CPP
📖 第 1 页 / 共 4 页
字号:
                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 + -