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文件
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 }
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头文件
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); //获得指定题库的题目数目
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文件
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