📄 dlgwndproc.c
字号:
#include <stdio.h>
#include <windows.h>
#include "resource.h"
#include "OutFile.h"
#include <stdlib.h>
#include <string.h>
#include "DlgWndProc.h"
#define WINNAME "学生管理系统"
int flag;
stuNode *SearNoInfo;//定义一个查找信息的指针变量
HWND hEditWnd;//用来保存获得控件的名柄
stuNode *pHead=NULL,*pHead1=NULL;
char str[100];
stuNode *ReInfo;
//欢迎界面对话框回调函数
LRESULT CALLBACK DlgProc_Welcome(HWND hDlgWnd,//对话框句柄
UINT message,//消息参数
WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
HWND hTopWnd;
RECT rc,Drc;
HWND hWnd;
switch (message)
{
case WM_INITDIALOG://对话框初始消息
hTopWnd = GetDesktopWindow();//返回桌面窗口的句柄
//该函数返回指定窗口的边框矩形的尺寸。
//参数:接收窗口的左上角和右下角的屏幕坐标。
GetWindowRect(hTopWnd,&rc);
GetWindowRect(hDlgWnd,&Drc);
//该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸
SetWindowPos(hDlgWnd,HWND_TOP,(rc.right - Drc.right + Drc.left)/2,(rc.bottom - Drc.bottom + Drc.top )/2,Drc.right -Drc.left,Drc.bottom - Drc.top,SWP_SHOWWINDOW);
hdc = GetDC(hDlgWnd);
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(0,255,0));
ReleaseDC(hDlgWnd,hdc);
return 1;
case WM_CLOSE :
EndDialog(hDlgWnd,0);
ShowWindow(hWnd,SW_SHOWMAXIMIZED);//设置窗口显示状态.(激活窗口并将其最大化)
break;
case WM_LBUTTONDOWN:
//将一个消息放入到窗口创建的线程消息队列里
PostMessage(hDlgWnd,WM_CLOSE,0,0);
break;
case WM_RBUTTONDOWN:
PostMessage(hDlgWnd,WM_CLOSE,0,0);
break;
default:
break;
}
return 0;
}
//按性别查找学生信息的窗口回调函数
LRESULT CALLBACK WndDlgSearSexProc(HWND hDlgWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int wNotifyCode = HIWORD(wParam);
int wID = LOWORD(wParam);
HWND hwndCtl = (HWND) lParam;
char SearSex;//定义一个接受性别的字符变量
switch(message)
{
case WM_CLOSE:
EndDialog(hDlgWnd,0);
break;
case WM_COMMAND:
switch(wID)
{
case IDOK:
SearNoInfo=NULL;//给查找信息指针变量赋初值
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT_SEARSEX);
GetWindowText(hEditWnd,str,100);//将窗口标题文本拷贝到一个缓存区
if(str==""||str==NULL)//如果接受的字符为空
{
MessageBox(GetParent(hDlgWnd),"请输入姓名!",WINNAME,MB_OK);
break;
}
if(strcmp(str,"男")==0)
SearSex='m';
else
SearSex='f';
SearNoInfo=Read();
SearNoInfo=SearchBySex(SearNoInfo,SearSex);
if(SearNoInfo!=NULL)
flag=1;
InvalidateRect(GetParent(hDlgWnd),NULL,TRUE);
EndDialog(hDlgWnd,0);
break;
case IDCANCEL:
EndDialog(hDlgWnd,0);
break;
}
break;
}
return 0;
}
//按姓名查找学生信息的窗口回调函数
LRESULT CALLBACK WndDlgSearNameProc(HWND hDlgWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int wNotifyCode = HIWORD(wParam);
int wID = LOWORD(wParam);
HWND hwndCtl = (HWND) lParam;
switch(message)
{
case WM_CLOSE:
EndDialog(hDlgWnd,0);
break;
case WM_COMMAND:
switch(wID)
{
case IDCANCEL:
EndDialog(hDlgWnd,0);
break;
case IDOK:
SearNoInfo=NULL;
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT_SEARNAME);
GetWindowText(hEditWnd,str,100);
if(str==""||str==NULL)
{
MessageBox(GetParent(hDlgWnd),"请输入姓名!",WINNAME,MB_OK);
break;
}
SearNoInfo=Read();
SearNoInfo=SearchByName(SearNoInfo,str);
if(SearNoInfo!=NULL)
flag=1;
InvalidateRect(GetParent(hDlgWnd),NULL,TRUE);
EndDialog(hDlgWnd,0);
break;
}
break;
}
return 0;
}
//按学号查找学生信息的窗口回调函数
LRESULT CALLBACK WndDlgSearNoProc(HWND hDlgWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int wNotifyCode = HIWORD(wParam);
int wID = LOWORD(wParam);
HWND hwndCtl = (HWND) lParam;
switch(message)
{
case WM_CLOSE:
EndDialog(hDlgWnd,0);
break;
case WM_COMMAND:
switch(wID)
{
case IDCANCEL:
EndDialog(hDlgWnd,0);
break;
case IDOK:
{
int stuNo;
ReInfo=NULL;
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT_SEARNO);
GetWindowText(hEditWnd,str,100);
if(str==""||str==NULL)
{
MessageBox(GetParent(hDlgWnd),"请输入学号!",WINNAME,MB_OK);
break;
}
stuNo=atoi(str);
pHead1=Read();
ReInfo=SearchByNo(pHead1,stuNo);
if(ReInfo!=NULL)
{
flag=1;
SearNoInfo=ReInfo;
SearNoInfo->next=NULL;
InvalidateRect(GetParent(hDlgWnd),NULL,TRUE);
}
else
MessageBox(GetParent(hDlgWnd),"不存在该学号的学生信息!",WINNAME,MB_OK);
}
EndDialog(hDlgWnd,0);
break;
}
break;
}
return 0;
}
//修改学生信息
LRESULT CALLBACK WndDlgModProc(HWND hDlgWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int wNotifyCode = HIWORD(wParam);
int wID = LOWORD(wParam);
HWND hwndCtl = (HWND) lParam;
int stuNo,i;
char str[100];
pHead1=Read();
switch(message)
{
case WM_INITDIALOG:
{
HWND hComboWnd;//指定被发送的消息
hComboWnd=GetDlgItem(hDlgWnd,IDC_COMBO_SEX);
//SendMessage函数将指定的消息发送到一个窗口
i=SendMessage(hComboWnd,CB_ADDSTRING,0,(LPARAM)"男");
i=SendMessage(hComboWnd,CB_ADDSTRING,0,(LPARAM)"女");
}
break;
case WM_CLOSE:
EndDialog(hDlgWnd,0);
break;
case WM_COMMAND:
switch(wID)
{
case IDSETOUT:
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT5),TRUE);
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT6),TRUE);
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT7),TRUE);
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT8),TRUE);
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT9),TRUE);
EnableWindow(GetDlgItem(hDlgWnd,IDOK),TRUE);
EnableWindow(GetDlgItem(hDlgWnd,IDSETOUT),FALSE);
break;
case IDOK://当按下回车键时,分别获得各控件的值
{
stuInfo *NewStu=NULL;
NewStu=(stuInfo *)malloc(sizeof(stuInfo));
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT2);
GetWindowText(hEditWnd,str,100);
NewStu->stuNo=atoi(str);
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT3);
GetWindowText(hEditWnd,str,100);
for(i=0;i<30;i++) //数组接受字符
NewStu->stuName[i]=str[i];
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT4);
GetWindowText(hEditWnd,str,100);
if(strcmp(str,"男")==0)
NewStu->stuSex='m';
else
NewStu->stuSex='f';
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT5);
GetWindowText(hEditWnd,str,100);
for(i=0;i<100;i++)
NewStu->stuAddress[i]=str[i];
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT6);
GetWindowText(hEditWnd,str,100);
NewStu->stuScore.gw=atof(str);
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT7);
GetWindowText(hEditWnd,str,100);
NewStu->stuScore.sj=atof(str);
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT8);
GetWindowText(hEditWnd,str,100);
NewStu->stuScore.rx=atof(str);
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT9);
GetWindowText(hEditWnd,str,100);
NewStu->stuScore.hhx=atof(str);
ReInfo=SearchByNo(pHead1,NewStu->stuNo);
if(ReInfo!=NULL)//如果查找成功
{
pHead1=stuModify(pHead1,NewStu);
SaveTwo(pHead1);
InvalidateRect(GetParent(hDlgWnd),NULL,TRUE);
Output(GetDC(GetParent(hDlgWnd)),pHead1);
}//修改完以后,重新设置各控件的状态
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT5),FALSE);
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT6),FALSE);
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT7),FALSE);
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT8),FALSE);
EnableWindow(GetDlgItem(hDlgWnd,IDC_EDIT9),FALSE);
EnableWindow(GetDlgItem(hDlgWnd,IDOK),FALSE);
EnableWindow(GetDlgItem(hDlgWnd,IDSETOUT),FALSE);
MessageBox(GetParent(hDlgWnd),"修改成功!",WINNAME,MB_OK);
}
EndDialog(hDlgWnd,0);
break;
case IDCANCEL:
EndDialog(hDlgWnd,0);
break;
case IDSEARCH:
{
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT1);//获得编辑框中输入的学号
GetWindowText(hEditWnd,str,100);
if(str==""||str==NULL)
{
MessageBox(GetParent(hDlgWnd),"请输入学号!",WINNAME,MB_OK);
break;
}
stuNo=atoi(str);
ReInfo=SearchByNo(pHead1,stuNo);
if(ReInfo!=NULL)
{
_itoa(ReInfo->stu->stuNo,str,10);
//显示所要修改学生的信息
//SetWindowText函数改变指定窗口标题栏文本的内容
//学号
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT2),str);
//姓名
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT3),ReInfo->stu->stuName);
//年龄
sprintf(str,"%c",ReInfo->stu->stuSex);
if(strcmp(str,"m")==0)
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT4),"男");
else
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT4),"女");
//所属单位
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT5),ReInfo->stu->stuAddress);
//国文
sprintf(str,"%.1f",ReInfo->stu->stuScore.gw);
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT6),str);
//史记
sprintf(str,"%.1f",ReInfo->stu->stuScore.sj);
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT7),str);
//儒学
sprintf(str,"%.1f",ReInfo->stu->stuScore.rx);
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT8),str);
//厚黑学
sprintf(str,"%.1f",ReInfo->stu->stuScore.hhx);
SetWindowText(GetDlgItem(hDlgWnd,IDC_EDIT9),str);
EnableWindow(GetDlgItem(hDlgWnd,IDSETOUT),TRUE);
}
else
MessageBox(GetParent(hDlgWnd),"不存在该学号的学生信息!",WINNAME,MB_OK);
}
break;
}
break;
}
return 0;
}
//增加学生窗口的回调函数
LRESULT CALLBACK WndDlgAddProc(HWND hDlgWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int wNotifyCode = HIWORD(wParam);
int wID = LOWORD(wParam);
HWND hwndCtl = (HWND) lParam;
switch (message)
{
case WM_INITDIALOG:
{
int i;
HWND hComboWnd;
hComboWnd=GetDlgItem(hDlgWnd,IDC_COMBO_SEX);
i=SendMessage(hComboWnd,CB_ADDSTRING,0,(LPARAM)"男");
i=SendMessage(hComboWnd,CB_ADDSTRING,0,(LPARAM)"女");
}
break;
case WM_CLOSE:
EndDialog(hDlgWnd,0);
break;
case WM_COMMAND:
switch(wID)
{
case IDCANCEL:
EndDialog(hDlgWnd,0);
break;
case IDC_BUTTON_ADDOK:
{
int i,flag=8;
stuInfo *stuAddInfo;
stuNode *pHead1=NULL,*pHead2=NULL;
char str[8][100];
stuAddInfo=(stuInfo *)malloc(sizeof(stuInfo));
//学号
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT2);
GetWindowText(hEditWnd,str[0],100);
//姓名
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT3);
GetWindowText(hEditWnd,str[1],100);
//性别
hEditWnd=GetDlgItem(hDlgWnd,IDC_COMBO_SEX);
GetWindowText(hEditWnd,str[2],100);
//所属单位
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT5);
GetWindowText(hEditWnd,str[3],100);
//国文成绩
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT6);
GetWindowText(hEditWnd,str[4],100);
//史记成绩
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT7);
GetWindowText(hEditWnd,str[5],100);
//儒学成绩
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT8);
GetWindowText(hEditWnd,str[6],100);
//厚黑学成绩
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT9);
GetWindowText(hEditWnd,str[7],100);
//判断所有内容是否都已经输入
for(i=0;i<8;i++)
if(str[i][0]==NULL|| str[i][0]=="")
flag=flag-1;
if(flag>=0 && flag<8)
MessageBox(hDlgWnd,"所有项目都必须输入!",WINNAME,MB_OK);
else
{
stuAddInfo->stuNo=atoi(str[0]);//得到学号
pHead1=Read();//读取文件内数据后判断是否已经存在该学号信息
ReInfo=SearchByNo(pHead1,stuAddInfo->stuNo);//调用按学号查找函数
if(ReInfo!=NULL)
{
MessageBox(hDlgWnd,"存在该学生学号,请重新输入学号!",WINNAME,MB_OK);
break;
}
//得到姓名
for(i=0;i<30;i++)
stuAddInfo->stuName[i]=str[1][i];
//得到性别
if(strcmp(str[2],"男")==0)
stuAddInfo->stuSex='m';
else
stuAddInfo->stuSex='f';
//得到所属单位
for(i=0;i<100;i++)
stuAddInfo->stuAddress[i]=str[3][i];
//得到各科成绩
stuAddInfo->stuScore.gw=atof(str[4]);
stuAddInfo->stuScore.sj=atof(str[5]);
stuAddInfo->stuScore.rx=atof(str[6]);
stuAddInfo->stuScore.hhx=atof(str[7]);
pHead2=addstu(pHead2,stuAddInfo);//插入学生信息到链表中
if(MessageBox(hDlgWnd,"是否将数据的信息保存的文件中?",WINNAME,MB_OKCANCEL)==IDOK)
{
Save(pHead2);//保存到文件中
}
pHead2=Read();//重新读取文件中的内容
InvalidateRect(GetParent(hDlgWnd),NULL,TRUE);
Output(GetDC(GetParent(hDlgWnd)),pHead2);//并显示
}
EndDialog(hDlgWnd,0);
}
break;
}
}
return 0;
}
//删除学生信息窗口的回调函数
LRESULT CALLBACK WndDlgDelProc(HWND hDlgWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int wNotifyCode = HIWORD(wParam);
int wID = LOWORD(wParam);
HWND hwndCtl = (HWND) lParam;
switch(message)
{
case WM_CLOSE:
EndDialog(hDlgWnd,0);
break;
case WM_COMMAND:
switch(wID)
{
case ID_DEL_OK:
{
hEditWnd=GetDlgItem(hDlgWnd,IDC_EDIT_DELNO);
GetWindowText(hEditWnd,str,100);
pHead1=Read();
ReInfo=SearchByNo(pHead1,atoi(str));
if(ReInfo!=NULL)
{
if(MessageBox(hDlgWnd,"是否删除该学生信息?",WINNAME,MB_OKCANCEL)==IDOK)
{
pHead1=DelStu(pHead1,atoi(str));
SaveTwo(pHead1);
}
pHead1=Read();
InvalidateRect(GetParent(hDlgWnd),NULL,TRUE);
Output(GetDC(GetParent(hDlgWnd)),pHead1);
}
else
MessageBox(hDlgWnd,"不存在该学生信息!",WINNAME,MB_OK);
}
EndDialog(hDlgWnd,0);
break;
case IDCANCEL:
EndDialog(hDlgWnd,0);
break;
}
break;
}
return 0;
}
//关于窗口的回调函数
LRESULT CALLBACK WndDlgAboutProc(HWND hDlgWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int wNotifyCode = HIWORD(wParam);
int wID = LOWORD(wParam);
HWND hwndCtl = (HWND) lParam;
switch(message)
{
case WM_CLOSE :
EndDialog(hDlgWnd,0);
break;
case WM_COMMAND:
switch(wID)
{
case IDOK:
EndDialog(hDlgWnd,0);
break;
case ID_ABOUT_OK:
EndDialog(hDlgWnd,0);
break;
}
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -