呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

《随机分队软件》源码(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 程序展示

《随机出题软件》:

文件结构:

使用演示:

《随机分队软件》:

文件结构:

使用演示:

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

##原创声明 **转载请注明:[呓语](http://www.yangyingming.com) » [《随机分队软件》源码(Windows API)](http://www.yangyingming.com/article/161)**