《随机出题软件》&《随机分队软件》源码(Windows API)

1 引言 


1.1 编写目的:

为了对院级活动《最强大脑》提供软件支持,同时为了练习使用windows API。

1.2 项目背景:

来自计算机学院学生会信息部指派的任务,规定时间完成软件的编写。

1.3 参考资料: 

● 《windows程序设计》、网络资料
● 文档格式来自 http://blog.csdn.net/qjfpjie/article/details/7604834 由详细设计说明书改编

2 总体设计 


2.1 需求概述 

《随机出题软件》:分程序和题库,题库为3、5、7分题库。程序界面需提供这三种题的按钮,需要具有从题库中随机抽取题目、显示题目、显示答案以及倒计时功能。

《随机分队软件》:随机分好队伍。分别实现30人选5人,10人选5人。选出来的是编号。

3 程序描述 


 《随机出题软件》:

题库文件“1.txt、2.txt、3.txt”,答案文件分别对应“a1.txt、a2.txt、a3.txt”,放在程序根目录下。

题库中存题目的格式应该是"#12 李白字什么?",其中题号和题目描述不能连在一起。

题目描述中不能出现‘#’字符,否则误认为后面是题号。

3.1 逐个模块给出以下说明: 

● 功能 

《随机出题软件》:

随机抽取题库中题目、显示题目、显示答案、倒计时、声效提示、自动更新题库大小。

《随机分队软件》:

30选5、10选5、显示分队结果。

● 性能 

《随机出题软件》:

题库如果过大,软件会卡死,显示的题目不能太长,所以要规范好题库文件。

3.2 算法:

《随机出题软件》:

核心算法为调用rand()及srand()实现随机出题功能,另无高深算法。

● 存储分配 

利用txt文件存储,而没使用数据库,存储以及管理数据较为麻烦。

4 程序展示

《随机出题软件》:

文件结构:

《随机出题软件》&《随机分队软件》源码(Windows API)_第1张图片

使用演示:

《随机出题软件》&《随机分队软件》源码(Windows API)_第2张图片

《随机出题软件》&《随机分队软件》源码(Windows API)_第3张图片

《随机出题软件》&《随机分队软件》源码(Windows API)_第4张图片

《随机出题软件》&《随机分队软件》源码(Windows API)_第5张图片

《随机分队软件》:

文件结构:

《随机出题软件》&《随机分队软件》源码(Windows API)_第6张图片

使用演示:

《随机出题软件》&《随机分队软件》源码(Windows API)_第7张图片

《随机出题软件》&《随机分队软件》源码(Windows API)_第8张图片

《随机出题软件》&《随机分队软件》源码(Windows API)_第9张图片

《随机出题软件》&《随机分队软件》源码(Windows API)_第10张图片

5 源代码


目录: 

《随机出题软件》myRandom.cpp
《随机出题软件》win1.cpp
《随机出题软件》myRandom.h
《随机出题软件》varset.h
《随机出题软件》win2.cpp

源代码下载地址(包含题库):

http://pan.baidu.com/s/1kTI81nx

部分代码展示:

《随机出题软件》:

 - 主要的cpp文件

myRandom.cpp

 1 #include "myRandom.h"
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <windows.h>
 5 
 6 extern int QT_1,QT_2,QT_3;  7 
 8 int random(int qt)    //传入题库号和该题库使用记录,然后随机输出该题库中的一个题的题号
 9 {  10     int num;  11     switch(qt){  12         case 1:num = rand() % QT_1 + 1;break;   //产生指定题库的随机题号
 13         case 2:num = rand() % QT_2 + 1;break;  14         case 3:num = rand() % QT_3 + 1;break;  15         default:num=0;  16  }  17     return num;  18 }  19 
 20 
 21 int print_qt(int qt,int num,char question[])   //将指定题库(qt)中指定题号(num)的题的内容输出出来
 22 {  23     int len = 0;  24     //将“qt.txt”放到字符数组filename中,根据qt的不同可改变
 25     char filename[20];  26     int t=qt,i=0;  27     while(t/10){    //将题库号qt输入进filename中
 28         filename[i++]=t/10+'0';  29         t/=10;  30  }  31     filename[i++]=t+'0';  32     char* p = filename;  33     strcpy(p+i,".txt"); //将.txt补上  34     //cout<<filename<<endl;  35 
 36     //用filename代表的文件作输入重定向
 37     if(freopen(filename,"r",stdin)==NULL){  38         MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:1"),TEXT("ERROR"),MB_ICONERROR);  39         //fprintf(stderr,"打开%d.txt文件错误!\n",qt);
 40  fflush(stdin);  41         if(freopen("CON","r",stdin)==NULL);  42         return 0;  43  }  44     char c;  45     int n=0;  46     while((c=getchar())!=EOF){  47         if(c=='#'){     //遇到'#'检测后面数字是否为指定题号
 48             scanf("%d",&n);  49             if(n==num)  //找到该题
 50                 break;  51  }  52  }  53     if(c==EOF){        //没有找到该题号
 54         MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:2"),TEXT("ERROR"),MB_ICONERROR);  55         return 0;  56  }  57     if(!n){  58         MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:3"),TEXT("ERROR"),MB_ICONERROR);  59         //fprintf(stderr,"没有在题库中找到当前随机号码的题目,请debug程序找出错误。\n");
 60  fflush(stdin);  61         if(freopen("CON","r",stdin)==NULL);  62         // fprintf(stderr,"重定向控制台错误!\n");
 63         return 0;  64  }  65     else{  66         //找到该题,输出内容
 67         while((c=getchar())=='#' || c=='\n');    //前面若有 # 或者 回车,直接忽略
 68         if(c==EOF)  69             return len;  70         do{  71             question[len++] = c;  72         }while((c=getchar())!='#' && c!=EOF);  73         question[len] = '\0';  74  fflush(stdin);  75         if(freopen("CON","r",stdin)==NULL);  76         // fprintf(stderr,"重定向控制台错误!\n");
 77         return len;  78  }  79     //return len;
 80 }  81 
 82 int getAnswer(int TK,int QUESTION,char answer[1000])  83 {  84     int len = 0;    //answer长度  85     //将“qt.txt”放到字符数组filename中,根据qt的不同可改变
 86     char filename[20];  87     filename[0] = 'a';  88     int t=TK,i=1;  89     while(t/10){    //将题库号qt输入进filename中
 90         filename[i++]=t/10+'0';  91         t/=10;  92  }  93     filename[i++]=t+'0';  94     char* p = filename;  95     strcpy(p+i,".txt"); //将.txt补上  96     //cout<<filename<<endl;  97 
 98     //用filename代表的文件作输入重定向
 99     if(freopen(filename,"r",stdin)==NULL){ 100         MessageBox(NULL,TEXT("提取答案过程中产生错误! 错误号:1"),TEXT("ERROR"),MB_ICONERROR); 101         //fprintf(stderr,"打开%d.txt文件错误!\n",qt);
102  fflush(stdin); 103         if(freopen("CON","r",stdin)==NULL); 104             //fprintf(stderr,"重定向控制台错误!\n");
105         return 0; 106  } 107     char c; 108     int n=0; 109     while((c=getchar())!=EOF){ 110         if(c=='#'){     //遇到'#'检测后面数字是否为指定题号
111             scanf("%d",&n); 112             if(n==QUESTION)  //找到该题
113                 break; 114  } 115  } 116     if(c==EOF){        //没有找到该题号
117         MessageBox(NULL,TEXT("提取答案过程中产生错误! 错误号:2"),TEXT("ERROR"),MB_ICONERROR); 118         return 0; 119  } 120     if(!n){ 121         MessageBox(NULL,TEXT("提取答案过程中产生错误! 错误号:3"),TEXT("ERROR"),MB_ICONERROR); 122         //fprintf(stderr,"没有在题库中找到当前随机号码的题目,请debug程序找出错误。\n");
123  fflush(stdin); 124         if(freopen("CON","r",stdin)==NULL); 125         // fprintf(stderr,"重定向控制台错误!\n");
126         return 0; 127  } 128     else{ 129         //找到该题,输出内容
130         while((c=getchar())=='#' || c=='\n');    //前面若有 # 或者 回车,直接忽略
131         if(c==EOF) 132             return len; 133         do{ 134             answer[len++] = c; 135         }while((c=getchar())!='#' && c!=EOF); 136         answer[len] = '\0'; 137  fflush(stdin); 138         if(freopen("CON","r",stdin)==NULL); 139         // fprintf(stderr,"重定向控制台错误!\n");
140         return len; 141  } 142 } 143 int FindQtNum(int qt) 144 { 145     int num=0; 146     
147     int len = 0; 148     //将“qt.txt”放到字符数组filename中,根据qt的不同可改变
149     char filename[20]; 150     int t=qt,i=0; 151     while(t/10){    //将题库号qt输入进filename中
152         filename[i++]=t/10+'0'; 153         t/=10; 154  } 155     filename[i++]=t+'0'; 156     char* p = filename; 157     strcpy(p+i,".txt"); //将.txt补上 158 
159     //用filename代表的文件作输入重定向
160     if(freopen(filename,"r",stdin)==NULL){ 161         MessageBox(NULL,TEXT("查找题库大小过程中产生错误! 错误号:1"),TEXT("ERROR"),MB_ICONERROR); 162         //fprintf(stderr,"打开%d.txt文件错误!\n",qt);
163  fflush(stdin); 164         if(freopen("CON","r",stdin)==NULL); 165             //fprintf(stderr,"重定向控制台错误!\n");
166         return 0; 167  } 168     char c; 169     int n=0; 170     while((c=getchar())!=EOF){ 171         if(c=='#'){     //遇到'#'检测后面数字是否为指定题号
172             num++; 173  } 174  } 175 
176     return num; 177 }

 win1.cpp

 1 // win1.cpp : Defines the entry point for the application.  2 //  3 #include <windows.h>
 4 #include <mmsystem.h>
 5 #include <ctime>
 6 #include "resource.h"
 7 #include "myRandom.h"
 8 #include "varset.h"        //各类相关变量设置
 9 #include "stdafx.h"
 10 #define LASTTIME    30
 11 #pragma comment(lib, "WINMM.LIB")
 12 
 13 extern int QT_1 = 0,QT_2 = 0,QT_3 = 0;    //每个题库中题目,初始化为0
 14 
 15 bool isuse1[1001] = {0};        //题目使用记录 //抽到的题赋true,初始化为false
 16 bool isuse2[1001] = {0};        //题目使用记录
 17 bool isuse3[1001] = {0};        //题目使用记录
 18 
 19 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  20 BOOL CALLBACK AboutProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);  21 BOOL CALLBACK AboutProc4(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);  22 
 23 int APIENTRY WinMain(HINSTANCE hInstance,  24  HINSTANCE hPrevInstance,  25  LPSTR lpCmdLine,  26                      int nCmdShow)  27 {  28      // TODO: Place code here.
 29     static TCHAR szmywndName[] = TEXT("Win1");  30  HWND hwnd;  31  MSG msg;  32 
 33     //给全局变量赋值
 34     hInst = hInstance;  35     //设置父窗口位置和尺寸
 36     int width = GetSystemMetrics ( SM_CXSCREEN );  37     int height= GetSystemMetrics ( SM_CYSCREEN );  38     CCW_X = width / 10 * 3;  39     CCW_Y = height / 3;  40     CCW_WIDTH = width / 10 * 4;  41     CCW_HEIGHT = height / 10 * 4;  42     //设置按钮尺寸
 43     CBN_WIDTH = int(CCW_WIDTH / 10.0 * 2);  44     CBN_HEIGHT = int(CCW_HEIGHT / 6.0);  45     //设置静态文本框尺寸
 46     CSTA_WIDTH = int(CCW_WIDTH /10.0 * 8);  47     CSTA_HEIGHT = int(CCW_HEIGHT /100.0 * 60);  48 
 49  WNDCLASS mywnd;  50     mywnd.cbClsExtra = 0;  51     mywnd.cbWndExtra = 0;  52     mywnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //背景
 53     mywnd.hCursor = LoadCursor(NULL,IDC_ARROW);        //光标  54     //mywnd.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_ICON1)); //图标
 55     mywnd.hIcon = (HICON)LoadImage(NULL,"icon2.ico",IMAGE_ICON,0,0,LR_LOADFROMFILE);  56     mywnd.hInstance = hInstance;                    //设置句柄
 57     mywnd.lpfnWndProc = WndProc;                    //设置窗口过程
 58     mywnd.lpszClassName = szmywndName;                //设置窗口类名字
 59     mywnd.lpszMenuName = NULL;                        //设置菜单名字
 60     mywnd.style = CS_HREDRAW | CS_VREDRAW;            //设置窗口风格  61     //LoadImage(NULL,"D:\\win1\\icon.png",IMAGE_ICON,0,0,LR_LOADFROMFILE);
 62 
 63     if(!RegisterClass(&mywnd)){        //注册窗口类
 64         MessageBox(NULL,TEXT("This program requires Windows NT!"),szmywndName,MB_ICONERROR);  65         return 0;  66  }  67 
 68     //创建窗口
 69     hwnd = CreateWindow(szmywndName,  70                         TEXT("自动抽题程序 --- freecode"),  71                         WS_OVERLAPPEDWINDOW^WS_THICKFRAME ^ WS_MAXIMIZEBOX ,  72  CCW_X,  73  CCW_Y,  74  CCW_WIDTH,  75  CCW_HEIGHT,  76  NULL,  77  NULL,  78  hInstance,  79  NULL);  80     mainhwnd = hwnd;    //给全局变量赋值
 81 
 82     ShowWindow(hwnd,nCmdShow);        //显示窗口
 83     UpdateWindow(hwnd);                //升级窗口
 84 
 85     while(GetMessage(&msg,NULL,0,0)){    //消息循环
 86         TranslateMessage(&msg);  87         DispatchMessage(&msg);  88  }  89 
 90     return msg.wParam;  91 }  92 
 93 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)  94 {  95  HWND hwndButton1,hwndButton2,hwndButton3;  96  HDC hdc;  97  PAINTSTRUCT ps;  98  RECT rect;  99     int wmId,wmEvent; 100  HFONT hFont; 101 
102     switch(message){ 103     case WM_CREATE: 104         //hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
105 
106         srand((unsigned)time(0));   //设置产生随机数的种子 107         //memset(isuse1,0,sizeof(isuse1)); //不知道为什么不能使用 108         //memset(isuse2,0,sizeof(isuse2)); 109         //memset(isuse3,0,sizeof(isuse3)); 110 
111         //查找每个题库中题目数量
112         QT_1 = FindQtNum(1); 113         QT_2 = FindQtNum(2); 114         QT_3 = FindQtNum(3); 115 
116         //创建 按钮(3分题)
117         hwndButton1   =  CreateWindow(TEXT("button"), 118                                     TEXT("3分题"), 119                                     WS_TABSTOP | WS_CHILD | WS_VISIBLE , 120                                     int(CCW_WIDTH / 10.0 * 1),int(CCW_HEIGHT / 6.0 * 3),CBN_WIDTH,CBN_HEIGHT, 121  hwnd, 122                                     (HMENU)1, 123  hInst, 124  NULL); 125         //设置字体
126  LOGFONT LogFont; 127         ::memset(&LogFont, 0, sizeof(LOGFONT)); 128         lstrcpy(LogFont.lfFaceName, "隶书"); 129           LogFont.lfWeight = 100; 130         LogFont.lfHeight = 30;//-44; // 字体大小
131         LogFont.lfCharSet = 134; 132         LogFont.lfOutPrecision = 3; 133         LogFont.lfClipPrecision = 2; 134         LogFont.lfOrientation = 45; 135         LogFont.lfQuality = 1; 136         LogFont.lfPitchAndFamily = 2; 137 
138         // 创建字体
139         hFont = CreateFontIndirect(&LogFont); 140         // 设置控件字体
141         SendMessage(hwndButton1, WM_SETFONT, (WPARAM)hFont, 0); 142 
143         //创建 按钮(5分题)
144         hwndButton2   =  CreateWindow(TEXT("button"), 145                                     TEXT("5分题"), 146                                     WS_TABSTOP | WS_CHILD | WS_VISIBLE , 147                                     int(CCW_WIDTH / 10.0 * 3.8),int(CCW_HEIGHT / 6.0 * 3),CBN_WIDTH,CBN_HEIGHT, 148  hwnd, 149                                     (HMENU)2, 150  hInst, 151  NULL); 152         // 设置控件字体
153         SendMessage(hwndButton2, WM_SETFONT, (WPARAM)hFont, 0); 154 
155 
156         //创建 按钮(7分题)
157         hwndButton3   =  CreateWindow(TEXT("button"), 158                                     TEXT("7分题"), 159                                     WS_TABSTOP | WS_CHILD | WS_VISIBLE , 160                                     int(CCW_WIDTH / 10.0 * 6.6),int(CCW_HEIGHT / 6.0 * 3),CBN_WIDTH,CBN_HEIGHT, 161  hwnd, 162                                     (HMENU)3, 163  hInst, 164  NULL); 165         // 设置控件字体
166         SendMessage(hwndButton3, WM_SETFONT, (WPARAM)hFont, 0); 167 
168 
169         return 0; 170     case WM_COMMAND: 171         wmId    = LOWORD(wParam); 172         wmEvent = HIWORD(wParam); 173         switch(wmId){ 174             case 1:        //单击3分题按钮,开始在3分题库里,抽题
175                 /* 非模态 176  hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,AboutProc); 177  if(hdlg) 178  { 179  //显示对话框 180  ShowWindow(hdlg, SW_NORMAL); 181  } 182                 */
183 
184                 TK = 1; 185  DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,AboutProc); 186 
187                 //hdlg = FindWindow(MAKEINTRESOURCE(IDD_DIALOG1),NULL); //获得对话框句柄
188                 break; 189 
190 
191             case 2:        //单击5分题按钮,开始在3分题库里,抽题
192                 TK = 2; 193  DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,AboutProc); 194                 break; 195 
196 
197             case 3:        //单击7分题按钮,开始在3分题库里,抽题
198                 TK = 3; 199  DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,AboutProc); 200                 break; 201             default: 202                 break; 203  } 204         return 0; 205     case WM_PAINT: 206         hdc = BeginPaint(hwnd,&ps);    //获得句柄
207         
208         GetClientRect(hwnd,&rect);    //获得客户区尺寸
209         rect.bottom -= CBN_HEIGHT * 2; 210         //显示文字
211         hFont = CreateFont( 212                         70,0,    //高度20, 宽取0表示由系统选择最佳值
213                         0, 0,    //文本倾斜,与字体倾斜都为0
214                         FW_HEAVY,    //粗体
215                         0,0,0,        //非斜体,无下划线,无中划线
216                         GB2312_CHARSET,    //字符集
217  OUT_DEFAULT_PRECIS, 218  CLIP_DEFAULT_PRECIS, 219                         DEFAULT_QUALITY,        //一系列的默认值
220                         DEFAULT_PITCH | FF_DONTCARE, 221                         "楷体"    //字体名称
222  ); 223         SetTextColor(hdc, RGB(0, 255, 0));    //设置文本为绿色
224  SelectObject(hdc, hFont); 225 
226         DrawText(hdc,TEXT("抽 题 环 节"),-1,&rect, 227             DT_SINGLELINE | DT_CENTER | DT_VCENTER); 228         
229         EndPaint(hwnd,&ps); 230  ReleaseDC(hwnd,hdc); 231         return 0; 232     case WM_DESTROY: 233         PostQuitMessage(0); 234         return 0; 235  } 236     return DefWindowProc(hwnd,message,wParam,lParam); 237 } 238 BOOL CALLBACK AboutProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)    //题目显示窗口
239 { 240     int t; 241     int            qtsum;        //题目总数
242     bool*        isu;        //存储访问数组
243     char        question[1010];        //题目描述
244     int            qtnum;        //随机产生的题号
245     HWND        hwndStatic,hwndStatic3;    //存储静态文本框句柄
246  HFONT hFont; 247 
248     switch (message){ 249         case WM_INITDIALOG : 250             //PlaySound("d:\\win1\\last2.wav", NULL, SND_FILENAME | SND_ASYNC);
251             PlaySound(".\\素材\\last2.wav", NULL, SND_FILENAME | SND_ASYNC); 252             SetTimer(hDlg, 1, 1000, NULL);    //设置一个1s定时器
253             num = LASTTIME; 254             SetDlgItemInt(hDlg, IDC_STATIC3, num--, FALSE); 255 
256             //设置 IDC_STATIC3 倒计时字体
257  LOGFONT LogFont; 258             ::memset(&LogFont, 0, sizeof(LOGFONT)); 259             lstrcpy(LogFont.lfFaceName, "华文新魏"); 260               LogFont.lfWeight = 600; 261             LogFont.lfHeight = 80;//-44; // 字体大小
262             LogFont.lfCharSet = 134; 263             LogFont.lfOutPrecision = 3; 264             LogFont.lfClipPrecision = 2; 265             LogFont.lfOrientation = 45; 266             LogFont.lfQuality = 1; 267             LogFont.lfPitchAndFamily = 2; 268 
269             // 创建字体
270             hFont = CreateFontIndirect(&LogFont); 271 
272             // 取得控件句柄
273             hwndStatic3 = GetDlgItem(hDlg, IDC_STATIC3); 274             // 设置控件字体
275             SendMessage(hwndStatic3, WM_SETFONT, (WPARAM)hFont, 0); 276             /* 不知道为什么不能用 277  hdc3 = GetDC(hwndStatic3); 278  SetTextColor(hdc3,RGB(0,128,128));//设置字体颜色 279             */
280 
281             //选择题库
282             switch(TK){ 283             case 1: 284                 qtsum = QT_1; 285                 isu = isuse1; 286                 break; 287             case 2: 288                 qtsum = QT_2; 289                 isu = isuse2; 290                 break; 291             case 3: 292                 qtsum = QT_3; 293                 isu = isuse3; 294                 break; 295             default: 296                 break; 297  } 298             for(t=1;t<=qtsum;t++)    //检测题目中有没有没使用过的题
299                 if(!isu[t]) 300                     break; 301             if(t>qtsum){ 302                 EndDialog (hDlg, 0) ; 303                 MessageBox(NULL,TEXT("该题库中的题已全部抽完!"),TEXT("ERROR"),MB_ICONERROR); 304                 break; 305  } 306             while(1){ 307                 qtnum = random(TK);    //在TK题库里抽题。
308                 if(!isu[qtnum]){    //出到没被使用过的题
309                     isu[qtnum] = true; 310                     break; 311  } 312  } 313 
314             QUESTION = qtnum; 315             
316             hwndStatic = GetDlgItem(hDlg,IDC_STATIC1); 317 
318             if(print_qt(TK,qtnum,question)){    //抽题成功,题目放在question字符数组里(抽题失败的话函数中有警示代码,并返回0,无需理会)
319  SetWindowText(hwndStatic, question); 320  } 321             else return false; 322             
323             return TRUE ; 324         case WM_COMMAND : 325             switch (LOWORD (wParam)){ 326                 case IDOK : //答案
327                     EndDialog (hDlg, 0) ; 328                     PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC); 329  DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), mainhwnd,AboutProc4); 330                     break; 331                 case IDCANCEL : 332                     PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC); 333                     EndDialog (hDlg, 0) ; 334                     return TRUE ; 335  } 336             break; 337         case WM_TIMER: 338             if(num>5){ 339                 SetDlgItemInt(hDlg, IDC_STATIC3, num--, FALSE); 340  } 341             else if(num==5){ 342                 PlaySound(".\\素材\\last1.wav", NULL, SND_FILENAME | SND_ASYNC); 343                 SetDlgItemInt(hDlg, IDC_STATIC3, num--, FALSE); 344  } 345             else if(0<=num && num<5){ 346                 PlaySound(".\\素材\\last1.wav", NULL, SND_FILENAME | SND_ASYNC); 347                 SetDlgItemInt(hDlg, IDC_STATIC3, num--, FALSE); 348  } 349             else{ 350                 PlaySound(".\\素材\\ao.wav", NULL, SND_FILENAME | SND_ASYNC); 351                 hwndStatic3 = GetDlgItem(hDlg, IDC_STATIC3); 352                 SetWindowText(hwndStatic3, ""); 353                 KillTimer(hDlg, 1); 354                 MessageBox(hDlg,TEXT(" 对不起,您没有时间了!^_^"),TEXT(""),MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL); 355  } 356         default:break; 357  } 358     return FALSE ; 359 } 360 
361 BOOL CALLBACK AboutProc4(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)    //答案显示窗口
362 { 363     HWND        hwndStatic;    //存储静态文本框句柄
364     char        answer[1000];    //存储答案
365 
366     switch (message){ 367         case WM_INITDIALOG : 368             hwndStatic = GetDlgItem(hDlg,IDC_STATIC2); 369             //根据题库和题号获取答案
370             if(getAnswer(TK,QUESTION,answer)){    //获取答案成功,答案放在answer字符数组里(抽题失败的话函数中有警示代码,并返回0,无需理会)
371  SetWindowText(hwndStatic, answer); 372  } 373             return TRUE ; 374         case WM_COMMAND : 375             switch (LOWORD (wParam)){ 376                 case IDOK : 377                     break; 378                 case IDCANCEL : 379                     EndDialog (hDlg, 0) ; 380                     return TRUE ; 381  } 382             break; 383         default:break; 384  } 385     return FALSE ; 386 }

 - 主要的header头文件

myRandom.h

 1 #include <ctime>
 2 #include <stdlib.h>
 3 #include <stdio.h>
 4 #include <string.h>
 5 
 6 //#define QT_1 275 //题库1的大小(题数)  7 //#define QT_2 170 //题库2的大小  8 //#define QT_3 190 //题库3的大小
 9 
10 int random(int qt);  //传入题库号,然后随机输出该题库中的一个题的题号
11 int print_qt(int qt,int num,char question[]);  //将指定题库(qt)中指定题号(num)的题的内容输出出来。
12 int getAnswer(int TK,int QUESTION,char answer[1000]);    //在制定答案库中获取答案
13 int FindQtNum(int qt);    //获得指定题库的题目数目

 varset.h

 1 #ifndef __MYHEADER__
 2 #define __MYHEADER__
 3 
 4 //存储窗口句柄的全局变量
 5 HINSTANCE hInst;
 6 HWND mainhwnd;
 7 //设置父窗口位置和尺寸
 8 int CCW_X;            
 9 int CCW_Y;
10 int CCW_WIDTH;
11 int CCW_HEIGHT;
12 //设置按钮尺寸
13 int CBN_WIDTH;
14 int CBN_HEIGHT;
15 //设置静态文本框尺寸
16 int CSTA_WIDTH;
17 int CSTA_HEIGHT;
18 //题目
19 int TK;        //题库
20 int QUESTION;    //随机产生的题号
21 //倒计时
22 int num;
23 
24 #endif __MYHEADER__

 《随机分队软件》:

 - 主要的cpp文件

win2.cpp

 1 // win1.cpp : Defines the entry point for the application.  2 //  3 #include "stdafx.h"
 4 #include <windows.h>
 5 #include <ctime>
 6 #include <stdlib.h>
 7 #include <string.h>
 8 #include "resource.h"
 9 
 10 #define SUM 30        //全部的人数 必须 SUM%TEAMNUM==0
 11 #define TEAMNUM 5    //每队人数
 12 #define CCW_X 600
 13 #define CCW_Y 300
 14 #define CCW_WIDTH  260
 15 #define CCW_HEIGHT 120
 16 #define CBN_WIDTH  260
 17 #define CBN_HEIGHT 92
 18 
 19 HINSTANCE hInst;  20 bool        allnum[SUM+1] = {0};    //全部编号
 21 char        team[1000];    //抽中的编号
 22 int teamnum;  23 
 24 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  25 BOOL CALLBACK AboutProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);  26 
 27 int APIENTRY WinMain(HINSTANCE hInstance,  28  HINSTANCE hPrevInstance,  29  LPSTR lpCmdLine,  30                      int nCmdShow)  31 {  32      // TODO: Place code here.
 33     static TCHAR szmywndName[] = TEXT("Win2");  34  HWND hwnd;  35  MSG msg;  36 
 37     hInst = hInstance;    //全局变量赋值
 38 
 39  WNDCLASS mywnd;  40     mywnd.cbClsExtra = 0;  41     mywnd.cbWndExtra = 0;  42     mywnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //背景
 43     mywnd.hCursor = LoadCursor(NULL,IDC_ARROW);        //光标  44     //mywnd.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_ICON1)); //图标
 45     mywnd.hIcon = (HICON)LoadImage(NULL,"icon2.ico",IMAGE_ICON,0,0,LR_LOADFROMFILE);  46     mywnd.hInstance = hInstance;                    //设置句柄
 47     mywnd.lpfnWndProc = WndProc;                    //设置窗口过程
 48     mywnd.lpszClassName = szmywndName;                //设置窗口类名字
 49     mywnd.lpszMenuName = NULL;                        //设置菜单名字
 50     mywnd.style = CS_HREDRAW | CS_VREDRAW;            //设置窗口风格
 51 
 52     if(!RegisterClass(&mywnd)){        //注册窗口类
 53         MessageBox(NULL,TEXT("This program requires Windows NT!"),szmywndName,MB_ICONERROR);  54         return 0;  55  }  56 
 57     //创建窗口
 58     hwnd = CreateWindow(szmywndName,  59                         TEXT("自动分队程序"),  60                         //WS_OVERLAPPEDWINDOW ,
 61                         WS_OVERLAPPEDWINDOW^WS_CAPTION^WS_THICKFRAME^WS_MAXIMIZEBOX,  62  CCW_X,  63  CCW_Y,  64  CCW_WIDTH,  65  CCW_HEIGHT,  66  NULL,  67  NULL,  68  hInstance,  69  NULL);  70 
 71     ShowWindow(hwnd,nCmdShow);        //显示窗口
 72     UpdateWindow(hwnd);                //升级窗口
 73 
 74     while(GetMessage(&msg,NULL,0,0)){    //消息循环
 75         TranslateMessage(&msg);  76         DispatchMessage(&msg);  77  }  78 
 79     return msg.wParam;  80 }  81 
 82 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)  83 {  84  HWND hwndButton1;  85  HDC hdc;  86  PAINTSTRUCT ps;  87     int wmId,wmEvent;  88     int num;  89     int            sel[TEAMNUM+1] = {0};  90     int i,j,t,p,length;  91     char* str;  92  HFONT hFont;  93 
 94     switch(message){  95     case WM_CREATE:  96         //创建按钮
 97         teamnum=0;  98         srand((unsigned)time(0));  99         hwndButton1   =  CreateWindow(TEXT("button"), 100                                     TEXT("点我开始分队"), 101                                     WS_TABSTOP | WS_CHILD | WS_VISIBLE , 102                                     //int( (CCW_WIDTH-CBN_WIDTH-10)/2.0 ),int(CCW_HEIGHT / 6.0 *1.5),CBN_WIDTH,CBN_HEIGHT,
103                                     0,0,CBN_WIDTH,CBN_HEIGHT, 104  hwnd, 105                                     (HMENU)1, 106  hInst, 107  NULL); 108         //设置字体
109  LOGFONT LogFont; 110         ::memset(&LogFont, 0, sizeof(LOGFONT)); 111         lstrcpy(LogFont.lfFaceName, "隶书"); 112           LogFont.lfWeight = 100; 113         LogFont.lfHeight = 35;//-44; // 字体大小
114         LogFont.lfCharSet = 134; 115         LogFont.lfOutPrecision = 3; 116         LogFont.lfClipPrecision = 2; 117         LogFont.lfOrientation = 45; 118         LogFont.lfQuality = 1; 119         LogFont.lfPitchAndFamily = 2; 120 
121         // 创建字体
122         hFont = CreateFontIndirect(&LogFont); 123         // 设置控件字体
124         SendMessage(hwndButton1, WM_SETFONT, (WPARAM)hFont, 0); 125         return 0; 126     case WM_COMMAND: 127         wmId    = LOWORD(wParam); 128         wmEvent = HIWORD(wParam); 129         switch(wmId){ 130             case 1: 131                 teamnum++; 132 
133                 for(i=1;i<=SUM;i++)    //判断有没有编号可以分配了
134                     if(!allnum[i]) 135                         break; 136                 if(i>SUM){ 137                     MessageBox(NULL,TEXT("已没有编号可分配,请重新开始"),TEXT("ERROR"),MB_ICONERROR); 138                     break; 139  } 140 
141                 for(i=1;i<=TEAMNUM;i++){    //从剩下的编号中随机抽取5个编号
142                     while(1){ 143                         num = rand()%SUM + 1; 144                         if(!allnum[num])    //没被使用
145                             break; 146  } 147                     allnum[num]=true; 148                     sel[i]=num; 149  } 150 
151                 p=0;    //team[]字符数组的伪指针 152                 //先将确定的是第几队放入数组中
153                 
154                 switch(teamnum){ 155                     case 1: 156                         str = "第一队:";break; 157                     case 2: 158                         str = "第二队:";break; 159                     case 3: 160                         str = "第三队:";break; 161                     case 4: 162                         str = "第四队:";break; 163                     case 5: 164                         str = "第五队:";break; 165                     case 6: 166                         str = "第六队:";break; 167                     default: 168                         MessageBox(NULL,TEXT("对不起,没有那么多队伍分配"),TEXT("ERROR"),MB_ICONERROR); 169                         break; 170  } 171  strcpy(team,str); 172                 p+=7; 173 
174                 for(i=1;i<=TEAMNUM;i++){    //将选出来的5个编号放到字符串数组中
175                     if(sel[i]==0) 176                         break; 177                     if(i!=1)    //数字之间放置逗号
178                         team[p++]=','; 179                     t = sel[i]; 180                     length=0; 181                     while(t){ 182                         length++; 183                         t/=10; 184  } 185                     t = sel[i]; 186                     for(j=p+length-1;j>=p;j--){    //将每一位数字放入
187                         team[j]=t%10+'0'; 188                         t/=10; 189  } 190                     p+=length; 191  } 192                 team[p]='\0'; 193                 //MessageBox(NULL,TEXT(team),TEXT("ERROR"),MB_ICONERROR);
194  DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,AboutProc); 195                 break; 196             default:break; 197  } 198         return 0; 199     case WM_PAINT: 200         hdc = BeginPaint(hwnd,&ps);    //获得句柄
201         EndPaint(hwnd,&ps); 202  ReleaseDC(hwnd,hdc); 203         return 0; 204     case WM_DESTROY: 205         PostQuitMessage(0); 206         return 0; 207  } 208     return DefWindowProc(hwnd,message,wParam,lParam); 209 } 210 
211 BOOL CALLBACK AboutProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)    //三分题的题目显示窗口
212 { 213  HWND hwndStatic; 214 
215     switch (message){ 216         case WM_INITDIALOG : 217             hwndStatic = GetDlgItem(hDlg,IDC_STATIC1); 218  SetWindowText(hwndStatic, team); 219             return TRUE ; 220         case WM_COMMAND : 221             switch (LOWORD (wParam)){ 222                 case IDOK : 223                     break; 224                 case IDCANCEL : 225                     EndDialog (hDlg, 0) ; 226                     return TRUE ; 227  } 228             break; 229         default:break; 230  } 231     return FALSE ; 232 }

 

Freecode : www.cnblogs.com/yym2013

你可能感兴趣的:(windows)