《随机出题软件》&《随机分队软件》源码(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
#include "myRandom.h"
#include <stdio.h>
#include <string.h>
#include <windows.h> extern int QT_1,QT_2,QT_3; int random(int qt) //传入题库号和该题库使用记录,然后随机输出该题库中的一个题的题号
{
int num;
switch(qt){
case :num = rand() % QT_1 + ;break; //产生指定题库的随机题号
case :num = rand() % QT_2 + ;break;
case :num = rand() % QT_3 + ;break;
default:num=;
}
return num;
} int print_qt(int qt,int num,char question[]) //将指定题库(qt)中指定题号(num)的题的内容输出出来
{
int len = ;
//将“qt.txt”放到字符数组filename中,根据qt的不同可改变
char filename[];
int t=qt,i=;
while(t/){ //将题库号qt输入进filename中
filename[i++]=t/+'';
t/=;
}
filename[i++]=t+'';
char* p = filename;
strcpy(p+i,".txt"); //将.txt补上
//cout<<filename<<endl; //用filename代表的文件作输入重定向
if(freopen(filename,"r",stdin)==NULL){
MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:1"),TEXT("ERROR"),MB_ICONERROR);
//fprintf(stderr,"打开%d.txt文件错误!\n",qt);
fflush(stdin);
if(freopen("CON","r",stdin)==NULL);
return ;
}
char c;
int n=;
while((c=getchar())!=EOF){
if(c=='#'){ //遇到'#'检测后面数字是否为指定题号
scanf("%d",&n);
if(n==num) //找到该题
break;
}
}
if(c==EOF){ //没有找到该题号
MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:2"),TEXT("ERROR"),MB_ICONERROR);
return ;
}
if(!n){
MessageBox(NULL,TEXT("抽题过程中产生错误! 错误号:3"),TEXT("ERROR"),MB_ICONERROR);
//fprintf(stderr,"没有在题库中找到当前随机号码的题目,请debug程序找出错误。\n");
fflush(stdin);
if(freopen("CON","r",stdin)==NULL);
// fprintf(stderr,"重定向控制台错误!\n");
return ;
}
else{
//找到该题,输出内容
while((c=getchar())=='#' || c=='\n'); //前面若有 # 或者 回车,直接忽略
if(c==EOF)
return len;
do{
question[len++] = c;
}while((c=getchar())!='#' && c!=EOF);
question[len] = '\0';
fflush(stdin);
if(freopen("CON","r",stdin)==NULL);
// fprintf(stderr,"重定向控制台错误!\n");
return len;
}
//return len;
} int getAnswer(int TK,int QUESTION,char answer[])
{
int len = ; //answer长度
//将“qt.txt”放到字符数组filename中,根据qt的不同可改变
char filename[];
filename[] = 'a';
int t=TK,i=;
while(t/){ //将题库号qt输入进filename中
filename[i++]=t/+'';
t/=;
}
filename[i++]=t+'';
char* p = filename;
strcpy(p+i,".txt"); //将.txt补上
//cout<<filename<<endl; //用filename代表的文件作输入重定向
if(freopen(filename,"r",stdin)==NULL){
MessageBox(NULL,TEXT("提取答案过程中产生错误! 错误号:1"),TEXT("ERROR"),MB_ICONERROR);
//fprintf(stderr,"打开%d.txt文件错误!\n",qt);
fflush(stdin);
if(freopen("CON","r",stdin)==NULL);
//fprintf(stderr,"重定向控制台错误!\n");
return ;
}
char c;
int n=;
while((c=getchar())!=EOF){
if(c=='#'){ //遇到'#'检测后面数字是否为指定题号
scanf("%d",&n);
if(n==QUESTION) //找到该题
break;
}
}
if(c==EOF){ //没有找到该题号
MessageBox(NULL,TEXT("提取答案过程中产生错误! 错误号:2"),TEXT("ERROR"),MB_ICONERROR);
return ;
}
if(!n){
MessageBox(NULL,TEXT("提取答案过程中产生错误! 错误号:3"),TEXT("ERROR"),MB_ICONERROR);
//fprintf(stderr,"没有在题库中找到当前随机号码的题目,请debug程序找出错误。\n");
fflush(stdin);
if(freopen("CON","r",stdin)==NULL);
// fprintf(stderr,"重定向控制台错误!\n");
return ;
}
else{
//找到该题,输出内容
while((c=getchar())=='#' || c=='\n'); //前面若有 # 或者 回车,直接忽略
if(c==EOF)
return len;
do{
answer[len++] = c;
}while((c=getchar())!='#' && c!=EOF);
answer[len] = '\0';
fflush(stdin);
if(freopen("CON","r",stdin)==NULL);
// fprintf(stderr,"重定向控制台错误!\n");
return len;
}
}
int FindQtNum(int qt)
{
int num=; int len = ;
//将“qt.txt”放到字符数组filename中,根据qt的不同可改变
char filename[];
int t=qt,i=;
while(t/){ //将题库号qt输入进filename中
filename[i++]=t/+'';
t/=;
}
filename[i++]=t+'';
char* p = filename;
strcpy(p+i,".txt"); //将.txt补上 //用filename代表的文件作输入重定向
if(freopen(filename,"r",stdin)==NULL){
MessageBox(NULL,TEXT("查找题库大小过程中产生错误! 错误号:1"),TEXT("ERROR"),MB_ICONERROR);
//fprintf(stderr,"打开%d.txt文件错误!\n",qt);
fflush(stdin);
if(freopen("CON","r",stdin)==NULL);
//fprintf(stderr,"重定向控制台错误!\n");
return ;
}
char c;
int n=;
while((c=getchar())!=EOF){
if(c=='#'){ //遇到'#'检测后面数字是否为指定题号
num++;
}
} return num;
}
win1.cpp
// win1.cpp : Defines the entry point for the application.
//
#include <windows.h>
#include <mmsystem.h>
#include <ctime>
#include "resource.h"
#include "myRandom.h"
#include "varset.h" //各类相关变量设置
#include "stdafx.h"
#define LASTTIME 30
#pragma comment(lib, "WINMM.LIB") extern int QT_1 = ,QT_2 = ,QT_3 = ; //每个题库中题目,初始化为0 bool isuse1[] = {}; //题目使用记录 //抽到的题赋true,初始化为false
bool isuse2[] = {}; //题目使用记录
bool isuse3[] = {}; //题目使用记录 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK AboutProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);
BOOL CALLBACK AboutProc4(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
static TCHAR szmywndName[] = TEXT("Win1");
HWND hwnd;
MSG msg; //给全局变量赋值
hInst = hInstance;
//设置父窗口位置和尺寸
int width = GetSystemMetrics ( SM_CXSCREEN );
int height= GetSystemMetrics ( SM_CYSCREEN );
CCW_X = width / * ;
CCW_Y = height / ;
CCW_WIDTH = width / * ;
CCW_HEIGHT = height / * ;
//设置按钮尺寸
CBN_WIDTH = int(CCW_WIDTH / 10.0 * );
CBN_HEIGHT = int(CCW_HEIGHT / 6.0);
//设置静态文本框尺寸
CSTA_WIDTH = int(CCW_WIDTH /10.0 * );
CSTA_HEIGHT = int(CCW_HEIGHT /100.0 * ); WNDCLASS mywnd;
mywnd.cbClsExtra = ;
mywnd.cbWndExtra = ;
mywnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景
mywnd.hCursor = LoadCursor(NULL,IDC_ARROW); //光标
//mywnd.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_ICON1)); //图标
mywnd.hIcon = (HICON)LoadImage(NULL,"icon2.ico",IMAGE_ICON,,,LR_LOADFROMFILE);
mywnd.hInstance = hInstance; //设置句柄
mywnd.lpfnWndProc = WndProc; //设置窗口过程
mywnd.lpszClassName = szmywndName; //设置窗口类名字
mywnd.lpszMenuName = NULL; //设置菜单名字
mywnd.style = CS_HREDRAW | CS_VREDRAW; //设置窗口风格
//LoadImage(NULL,"D:\\win1\\icon.png",IMAGE_ICON,0,0,LR_LOADFROMFILE); if(!RegisterClass(&mywnd)){ //注册窗口类
MessageBox(NULL,TEXT("This program requires Windows NT!"),szmywndName,MB_ICONERROR);
return ;
} //创建窗口
hwnd = CreateWindow(szmywndName,
TEXT("自动抽题程序 --- freecode"),
WS_OVERLAPPEDWINDOW^WS_THICKFRAME ^ WS_MAXIMIZEBOX ,
CCW_X,
CCW_Y,
CCW_WIDTH,
CCW_HEIGHT,
NULL,
NULL,
hInstance,
NULL);
mainhwnd = hwnd; //给全局变量赋值 ShowWindow(hwnd,nCmdShow); //显示窗口
UpdateWindow(hwnd); //升级窗口 while(GetMessage(&msg,NULL,,)){ //消息循环
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HWND hwndButton1,hwndButton2,hwndButton3;
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
int wmId,wmEvent;
HFONT hFont; switch(message){
case WM_CREATE:
//hInstance = ((LPCREATESTRUCT) lParam)->hInstance ; srand((unsigned)time()); //设置产生随机数的种子
//memset(isuse1,0,sizeof(isuse1)); //不知道为什么不能使用
//memset(isuse2,0,sizeof(isuse2));
//memset(isuse3,0,sizeof(isuse3)); //查找每个题库中题目数量
QT_1 = FindQtNum();
QT_2 = FindQtNum();
QT_3 = FindQtNum(); //创建 按钮(3分题)
hwndButton1 = CreateWindow(TEXT("button"),
TEXT("3分题"),
WS_TABSTOP | WS_CHILD | WS_VISIBLE ,
int(CCW_WIDTH / 10.0 * ),int(CCW_HEIGHT / 6.0 * ),CBN_WIDTH,CBN_HEIGHT,
hwnd,
(HMENU),
hInst,
NULL);
//设置字体
LOGFONT LogFont;
::memset(&LogFont, , sizeof(LOGFONT));
lstrcpy(LogFont.lfFaceName, "隶书");
LogFont.lfWeight = ;
LogFont.lfHeight = ;//-44; // 字体大小
LogFont.lfCharSet = ;
LogFont.lfOutPrecision = ;
LogFont.lfClipPrecision = ;
LogFont.lfOrientation = ;
LogFont.lfQuality = ;
LogFont.lfPitchAndFamily = ; // 创建字体
hFont = CreateFontIndirect(&LogFont);
// 设置控件字体
SendMessage(hwndButton1, WM_SETFONT, (WPARAM)hFont, ); //创建 按钮(5分题)
hwndButton2 = CreateWindow(TEXT("button"),
TEXT("5分题"),
WS_TABSTOP | WS_CHILD | WS_VISIBLE ,
int(CCW_WIDTH / 10.0 * 3.8),int(CCW_HEIGHT / 6.0 * ),CBN_WIDTH,CBN_HEIGHT,
hwnd,
(HMENU),
hInst,
NULL);
// 设置控件字体
SendMessage(hwndButton2, WM_SETFONT, (WPARAM)hFont, ); //创建 按钮(7分题)
hwndButton3 = CreateWindow(TEXT("button"),
TEXT("7分题"),
WS_TABSTOP | WS_CHILD | WS_VISIBLE ,
int(CCW_WIDTH / 10.0 * 6.6),int(CCW_HEIGHT / 6.0 * ),CBN_WIDTH,CBN_HEIGHT,
hwnd,
(HMENU),
hInst,
NULL);
// 设置控件字体
SendMessage(hwndButton3, WM_SETFONT, (WPARAM)hFont, ); return ;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch(wmId){
case : //单击3分题按钮,开始在3分题库里,抽题
/* 非模态
hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,AboutProc);
if(hdlg)
{
//显示对话框
ShowWindow(hdlg, SW_NORMAL);
}
*/ TK = ;
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,AboutProc); //hdlg = FindWindow(MAKEINTRESOURCE(IDD_DIALOG1),NULL); //获得对话框句柄
break; case : //单击5分题按钮,开始在3分题库里,抽题
TK = ;
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,AboutProc);
break; case : //单击7分题按钮,开始在3分题库里,抽题
TK = ;
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,AboutProc);
break;
default:
break;
}
return ;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps); //获得句柄 GetClientRect(hwnd,&rect); //获得客户区尺寸
rect.bottom -= CBN_HEIGHT * ;
//显示文字
hFont = CreateFont(
,, //高度20, 宽取0表示由系统选择最佳值
, , //文本倾斜,与字体倾斜都为0
FW_HEAVY, //粗体
,,, //非斜体,无下划线,无中划线
GB2312_CHARSET, //字符集
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, //一系列的默认值
DEFAULT_PITCH | FF_DONTCARE,
"楷体" //字体名称
);
SetTextColor(hdc, RGB(, , )); //设置文本为绿色
SelectObject(hdc, hFont); DrawText(hdc,TEXT("抽 题 环 节"),-,&rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd,&ps);
ReleaseDC(hwnd,hdc);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
BOOL CALLBACK AboutProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) //题目显示窗口
{
int t;
int qtsum; //题目总数
bool* isu; //存储访问数组
char question[]; //题目描述
int qtnum; //随机产生的题号
HWND hwndStatic,hwndStatic3; //存储静态文本框句柄
HFONT hFont; switch (message){
case WM_INITDIALOG :
//PlaySound("d:\\win1\\last2.wav", NULL, SND_FILENAME | SND_ASYNC);
PlaySound(".\\素材\\last2.wav", NULL, SND_FILENAME | SND_ASYNC);
SetTimer(hDlg, , , NULL); //设置一个1s定时器
num = LASTTIME;
SetDlgItemInt(hDlg, IDC_STATIC3, num--, FALSE); //设置 IDC_STATIC3 倒计时字体
LOGFONT LogFont;
::memset(&LogFont, , sizeof(LOGFONT));
lstrcpy(LogFont.lfFaceName, "华文新魏");
LogFont.lfWeight = ;
LogFont.lfHeight = ;//-44; // 字体大小
LogFont.lfCharSet = ;
LogFont.lfOutPrecision = ;
LogFont.lfClipPrecision = ;
LogFont.lfOrientation = ;
LogFont.lfQuality = ;
LogFont.lfPitchAndFamily = ; // 创建字体
hFont = CreateFontIndirect(&LogFont); // 取得控件句柄
hwndStatic3 = GetDlgItem(hDlg, IDC_STATIC3);
// 设置控件字体
SendMessage(hwndStatic3, WM_SETFONT, (WPARAM)hFont, );
/* 不知道为什么不能用
hdc3 = GetDC(hwndStatic3);
SetTextColor(hdc3,RGB(0,128,128));//设置字体颜色
*/ //选择题库
switch(TK){
case :
qtsum = QT_1;
isu = isuse1;
break;
case :
qtsum = QT_2;
isu = isuse2;
break;
case :
qtsum = QT_3;
isu = isuse3;
break;
default:
break;
}
for(t=;t<=qtsum;t++) //检测题目中有没有没使用过的题
if(!isu[t])
break;
if(t>qtsum){
EndDialog (hDlg, ) ;
MessageBox(NULL,TEXT("该题库中的题已全部抽完!"),TEXT("ERROR"),MB_ICONERROR);
break;
}
while(){
qtnum = random(TK); //在TK题库里抽题。
if(!isu[qtnum]){ //出到没被使用过的题
isu[qtnum] = true;
break;
}
} QUESTION = qtnum; hwndStatic = GetDlgItem(hDlg,IDC_STATIC1); if(print_qt(TK,qtnum,question)){ //抽题成功,题目放在question字符数组里(抽题失败的话函数中有警示代码,并返回0,无需理会)
SetWindowText(hwndStatic, question);
}
else return false; return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam)){
case IDOK : //答案
EndDialog (hDlg, ) ;
PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC);
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG2), mainhwnd,AboutProc4);
break;
case IDCANCEL :
PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC);
EndDialog (hDlg, ) ;
return TRUE ;
}
break;
case WM_TIMER:
if(num>){
SetDlgItemInt(hDlg, IDC_STATIC3, num--, FALSE);
}
else if(num==){
PlaySound(".\\素材\\last1.wav", NULL, SND_FILENAME | SND_ASYNC);
SetDlgItemInt(hDlg, IDC_STATIC3, num--, FALSE);
}
else if(<=num && num<){
PlaySound(".\\素材\\last1.wav", NULL, SND_FILENAME | SND_ASYNC);
SetDlgItemInt(hDlg, IDC_STATIC3, num--, FALSE);
}
else{
PlaySound(".\\素材\\ao.wav", NULL, SND_FILENAME | SND_ASYNC);
hwndStatic3 = GetDlgItem(hDlg, IDC_STATIC3);
SetWindowText(hwndStatic3, "囧");
KillTimer(hDlg, );
MessageBox(hDlg,TEXT(" 对不起,您没有时间了!^_^"),TEXT(" 囧 "),MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL);
}
default:break;
}
return FALSE ;
} BOOL CALLBACK AboutProc4(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) //答案显示窗口
{
HWND hwndStatic; //存储静态文本框句柄
char answer[]; //存储答案 switch (message){
case WM_INITDIALOG :
hwndStatic = GetDlgItem(hDlg,IDC_STATIC2);
//根据题库和题号获取答案
if(getAnswer(TK,QUESTION,answer)){ //获取答案成功,答案放在answer字符数组里(抽题失败的话函数中有警示代码,并返回0,无需理会)
SetWindowText(hwndStatic, answer);
}
return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam)){
case IDOK :
break;
case IDCANCEL :
EndDialog (hDlg, ) ;
return TRUE ;
}
break;
default:break;
}
return FALSE ;
}
- 主要的header头文件
myRandom.h
#include <ctime>
#include <stdlib.h>
#include <stdio.h>
#include <string.h> //#define QT_1 275 //题库1的大小(题数)
//#define QT_2 170 //题库2的大小
//#define QT_3 190 //题库3的大小 int random(int qt); //传入题库号,然后随机输出该题库中的一个题的题号
int print_qt(int qt,int num,char question[]); //将指定题库(qt)中指定题号(num)的题的内容输出出来。
int getAnswer(int TK,int QUESTION,char answer[]); //在制定答案库中获取答案
int FindQtNum(int qt); //获得指定题库的题目数目
varset.h
#ifndef __MYHEADER__
#define __MYHEADER__ //存储窗口句柄的全局变量
HINSTANCE hInst;
HWND mainhwnd;
//设置父窗口位置和尺寸
int CCW_X;
int CCW_Y;
int CCW_WIDTH;
int CCW_HEIGHT;
//设置按钮尺寸
int CBN_WIDTH;
int CBN_HEIGHT;
//设置静态文本框尺寸
int CSTA_WIDTH;
int CSTA_HEIGHT;
//题目
int TK; //题库
int QUESTION; //随机产生的题号
//倒计时
int num; #endif __MYHEADER__
《随机分队软件》:
- 主要的cpp文件
win2.cpp
// win1.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <windows.h>
#include <ctime>
#include <stdlib.h>
#include <string.h>
#include "resource.h" #define SUM 30 //全部的人数 必须 SUM%TEAMNUM==0
#define TEAMNUM 5 //每队人数
#define CCW_X 600
#define CCW_Y 300
#define CCW_WIDTH 260
#define CCW_HEIGHT 120
#define CBN_WIDTH 260
#define CBN_HEIGHT 92 HINSTANCE hInst;
bool allnum[SUM+] = {}; //全部编号
char team[]; //抽中的编号
int teamnum; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK AboutProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
static TCHAR szmywndName[] = TEXT("Win2");
HWND hwnd;
MSG msg; hInst = hInstance; //全局变量赋值 WNDCLASS mywnd;
mywnd.cbClsExtra = ;
mywnd.cbWndExtra = ;
mywnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景
mywnd.hCursor = LoadCursor(NULL,IDC_ARROW); //光标
//mywnd.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_ICON1)); //图标
mywnd.hIcon = (HICON)LoadImage(NULL,"icon2.ico",IMAGE_ICON,,,LR_LOADFROMFILE);
mywnd.hInstance = hInstance; //设置句柄
mywnd.lpfnWndProc = WndProc; //设置窗口过程
mywnd.lpszClassName = szmywndName; //设置窗口类名字
mywnd.lpszMenuName = NULL; //设置菜单名字
mywnd.style = CS_HREDRAW | CS_VREDRAW; //设置窗口风格 if(!RegisterClass(&mywnd)){ //注册窗口类
MessageBox(NULL,TEXT("This program requires Windows NT!"),szmywndName,MB_ICONERROR);
return ;
} //创建窗口
hwnd = CreateWindow(szmywndName,
TEXT("自动分队程序"),
//WS_OVERLAPPEDWINDOW ,
WS_OVERLAPPEDWINDOW^WS_CAPTION^WS_THICKFRAME^WS_MAXIMIZEBOX,
CCW_X,
CCW_Y,
CCW_WIDTH,
CCW_HEIGHT,
NULL,
NULL,
hInstance,
NULL); ShowWindow(hwnd,nCmdShow); //显示窗口
UpdateWindow(hwnd); //升级窗口 while(GetMessage(&msg,NULL,,)){ //消息循环
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HWND hwndButton1;
HDC hdc;
PAINTSTRUCT ps;
int wmId,wmEvent;
int num;
int sel[TEAMNUM+] = {};
int i,j,t,p,length;
char* str;
HFONT hFont; switch(message){
case WM_CREATE:
//创建按钮
teamnum=;
srand((unsigned)time());
hwndButton1 = CreateWindow(TEXT("button"),
TEXT("点我开始分队"),
WS_TABSTOP | WS_CHILD | WS_VISIBLE ,
//int( (CCW_WIDTH-CBN_WIDTH-10)/2.0 ),int(CCW_HEIGHT / 6.0 *1.5),CBN_WIDTH,CBN_HEIGHT,
,,CBN_WIDTH,CBN_HEIGHT,
hwnd,
(HMENU),
hInst,
NULL);
//设置字体
LOGFONT LogFont;
::memset(&LogFont, , sizeof(LOGFONT));
lstrcpy(LogFont.lfFaceName, "隶书");
LogFont.lfWeight = ;
LogFont.lfHeight = ;//-44; // 字体大小
LogFont.lfCharSet = ;
LogFont.lfOutPrecision = ;
LogFont.lfClipPrecision = ;
LogFont.lfOrientation = ;
LogFont.lfQuality = ;
LogFont.lfPitchAndFamily = ; // 创建字体
hFont = CreateFontIndirect(&LogFont);
// 设置控件字体
SendMessage(hwndButton1, WM_SETFONT, (WPARAM)hFont, );
return ;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch(wmId){
case :
teamnum++; for(i=;i<=SUM;i++) //判断有没有编号可以分配了
if(!allnum[i])
break;
if(i>SUM){
MessageBox(NULL,TEXT("已没有编号可分配,请重新开始"),TEXT("ERROR"),MB_ICONERROR);
break;
} for(i=;i<=TEAMNUM;i++){ //从剩下的编号中随机抽取5个编号
while(){
num = rand()%SUM + ;
if(!allnum[num]) //没被使用
break;
}
allnum[num]=true;
sel[i]=num;
} p=; //team[]字符数组的伪指针
//先将确定的是第几队放入数组中 switch(teamnum){
case :
str = "第一队:";break;
case :
str = "第二队:";break;
case :
str = "第三队:";break;
case :
str = "第四队:";break;
case :
str = "第五队:";break;
case :
str = "第六队:";break;
default:
MessageBox(NULL,TEXT("对不起,没有那么多队伍分配"),TEXT("ERROR"),MB_ICONERROR);
break;
}
strcpy(team,str);
p+=; for(i=;i<=TEAMNUM;i++){ //将选出来的5个编号放到字符串数组中
if(sel[i]==)
break;
if(i!=) //数字之间放置逗号
team[p++]=',';
t = sel[i];
length=;
while(t){
length++;
t/=;
}
t = sel[i];
for(j=p+length-;j>=p;j--){ //将每一位数字放入
team[j]=t%+'';
t/=;
}
p+=length;
}
team[p]='\0';
//MessageBox(NULL,TEXT(team),TEXT("ERROR"),MB_ICONERROR);
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,AboutProc);
break;
default:break;
}
return ;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps); //获得句柄
EndPaint(hwnd,&ps);
ReleaseDC(hwnd,hdc);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd,message,wParam,lParam);
} BOOL CALLBACK AboutProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) //三分题的题目显示窗口
{
HWND hwndStatic; switch (message){
case WM_INITDIALOG :
hwndStatic = GetDlgItem(hDlg,IDC_STATIC1);
SetWindowText(hwndStatic, team);
return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam)){
case IDOK :
break;
case IDCANCEL :
EndDialog (hDlg, ) ;
return TRUE ;
}
break;
default:break;
}
return FALSE ;
}
Freecode : www.cnblogs.com/yym2013
《随机出题软件》&《随机分队软件》源码(Windows API)的更多相关文章
- 手机自动化测试:Appium源码之API(2)
手机自动化测试:Appium源码之API(2) TouchAction AppiumDriver的辅助类,主要针对手势操作,比如滑动.长按.拖动等.TouchAction的原理是讲一系列的动作放在 ...
- 手机自动化测试:Appium源码之api(1)
手机自动化测试:Appium源码之api(1) AppiumDriver getAppStrings() 默认系统语言对应的Strings.xml文件内的数据. driver.getAppStri ...
- koahub软件市场微信编辑器源码,可下载
管理过公众平台的小伙伴都知道,公众平台最重要的是图文的编辑和发布,由于微信公众平台的图文编辑页面比较简陋,功能和样式的比较少,所以一般都是使用专业的微信图文编辑器,koahub软件市场里有一款专门编辑 ...
- RedHat系列软件管理(第二版) --源码包安装
RedHat系列软件管理 --源码包安装 源码包特点: 拥有广泛的平台支持性,可以装在所有的类UNIX操作系统上,不用考虑CPU架构. 灵活性,可以在安装过程中指定特有的选项. 定制度非常高,可以自己 ...
- 对于学习apache软件基金会顶级项目源码的一点思路(转)
ASF的开源项目,为软件行业贡献了太多好的产品和软件思维.学习ASF的项目源码能很大的提升自身的能力.程序运行在服务器上的流程:执行启动脚本(start.sh) -> 指向程序的主方法 -> ...
- Nginx优化之基本安全优化 (隐藏Nginx软件版本号信息,更改源码隐藏Nginx软件名及版本号,更改Nginx服务的默认用户)
一,隐藏Nginx软件版本号信息 查看版本号 curl -I 192.168.0.220 HTTP/1.1 200 OK Server: nginx/1.6.2 #这里清晰的暴露了Web版本号(1.6 ...
- Linux 软件安装卸载 (源码、rpm)
Linux下软件的安装主要有两种不同的形式.第一种安装为源码安装,文件名为xxx.tar.gz压缩包为主;以第一种方式发行的软件多为以源码形式发送的.第二种方式则是另一种安装文件名为xxx.i386. ...
- 【程序包管理】Linux软件管理之src源码安装编译
在很多时候我们需要自定义软件的特性,这时就需要用到源码安装.那么,网上有很多编译源码的工具,那么,我们怎么知道别人使用的是什么工具呢.其实我也不知道(*^▽^*). 那么本篇博客主要是写C代码的源码安 ...
- Spark笔记--使用Maven编译Spark源码(windows)
1. 官网下载源码 source code,地址: http://spark.apache.org/downloads.html 2. 使用maven编译: 注意在编译之前,需要设置java堆大小以及 ...
- odoo10源码 windows环境安装
odoo10-windows开发环境(源码安装) 安装node 下载地址 http://nodejs.cn/download/ 安装教程https://www.cnblogs.com/zhouyu20 ...
随机推荐
- std::nothrow
std::nothrow 1.在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL. 若不使用std::nothrow,则分配失败时程序直接抛出异常. 2.使用方式: ...
- 编译VLC for IOS
之前接触VLC是因为Winrt的项目,后来似乎ARM版本的始终搞不定(没有针对于ARM-COFF的GCC编译器),vlc for winrt的项目好久没有更新了,自己也没有深入研究.有一天跟同事聊,他 ...
- 〖Qt编程〗Qt编程中的各种数据类型的相互转换
char * 与 const char *的转换 char *ch1=”hello11″; const char *ch2=”hello22″; ch2 = ch1;//不报错,但有警告 ch1 = ...
- 恢复阿里云RDS云数据库MySQL的备份文件到自建数据库
云数据库MySQL版使用开源软件Percona Xtrabackup对数据库进行备份,所以您可以使用该软件将云数据库MySQL的备份文件恢复到自建数据库中,本文将介绍详细的操作步骤. 关于云数据库My ...
- Mybatis 中延时加载
1 为了处理N+1 问题,Mybatis 引入了延时加载功能,意义是一开始并不取出关联数据,只有当使用时,才发送sql语句去取. mybatis中两个全局设置 lazyLoadingEnabled 和 ...
- 逆向project第005篇:跨越CM4验证机制的鸿沟(下)
一.前言 本文是逆向分析CM4系列的最后一篇,我会将该游戏的序列号验证机制分析完成,进而编写出注冊码生成器. 二.分析第二个验证循环 延续上一篇文章的内容,来到例如以下代码处: 图1 上述代码并没有特 ...
- Linux安装Scala步骤
1.到官方下载tgz的安装包. http://www.scala-lang.org/download/ 注意:在最下面的Other Resources中 2.下载后将压缩包放在/usr/local目录 ...
- 简明 Vim 练级攻略(转,有些动态图不能显示,请看转载处)
vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...
- angular学习疑问总结
服务里返回的数据是不是只能传给控制器,而不能传给指令呢?如果是的话那么指令只能通过配置scope属性来访问控制器里的数据
- UIViewController的生命周期及iOS程序执行顺序 和ios6 处理内存警告
当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序1. alloc 创建对象,分配空间2.init (initWithN ...