文档库

最新最全的文档下载
当前位置:文档库 > MFC实验报告

MFC实验报告

一、程序所用到的课内外知识点:

1.控件在不同时间显示不同的名称 (2)

2.添加位图(以显示扑克牌的背景为例) (2)

3.添加对话框背景图片 (2)

4.随机显示扑克牌 (3)

5.添加音乐 (4)

6.在静态文本中显示文字 (5)

7.倒计时 (5)

8.文本框显示文字 (6)

9.文本框显示多行文字 (6)

二、程序的步骤:

1.创建对话框,添加控件 (7)

2.修改控件ID 标识符 (7)

3.为控件添加变量 (8)

4.为各个控件添加消息映射 (8)

5.添加扑克牌 (13)

6.用于计算的代码 (14)

三、完善程序:

1.添加背景图 (29)

2.添加音乐 (30)

3.计算正确后弹出图片 (31)

4.按钮修改 (33)

四、存在问题及解决办法:

1.添加位图时的问题 (34)

2.添加音乐时的问题 (34)

3.倒计时、弹出对话框控制 (34)

4.文本框显示多行文字 (35)

7、弹出图片 (35)

五、程序效果展示:

1、程序效果展示 (37)

六、总结:

1.总结 (40)

七、参考文献:

1.参考文献 (41)

一、程序所用到的课内外知识点

1、控件在不同的时间显示不同的名称

GetDlgItem(IDC_BUTTON5)->SetWindowText("重新开始");

getDlgItem()括号里面是控件的ID号,后面的引号里面是改变后的名称。

2、添加位图

1)首先要下载将要添加的图片,本游戏是添加的.bmp格式的位图,所以如果想要添加.bmp

的图片可以先在“photoshop”里修改一下。

2)在VC6.0 的“插入”中选择资源(或者直接按下Ctrl+R),点击点击“引

用”,选择插入类型为“所有文件”,选择好要添加的图片,点击“引用”系统会自动为添加的图片对应一个ID号,如果图片超过256色的会有提示,不管他(那图片不能被修改但是可以被显示出来)

3)选择要添加到的控件属性在“样式”中点击位图,如图:

MFC实验报告

4)在susuanDlg.h文件中添加class CSusuanDlg : public CDialog的公有变量:

HBITMAP m_hBackGround;

CButton *m_Button; // 扑克牌按钮显示扑克牌

CBitmap BackGroundBitmap; //背景

5)在susuanDlg.cpp.中添加

m_Button=(CButton*)GetDlgItem(IDC_BUTTON1);//获得控件

m_hBackGround=::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP15)) ;//IDB_BITMAP15是图片的ID

m_Button->SetBitmap(m_hBackGround);

3、添加对话框的背景

1)按照添加位图的1),2)两步做。

2)在对话框中选择图片控件画出图片的显示范围。

3)打开控件属性在类型中点击选择“位图”,在图像中选择图像的ID。

MFC实验报告

MFC实验报告

4)打开其他控件的属性点上透明

4、随机显示扑克牌

此处以本程序为例:

1)在class CSusuanDlg : public CDialog中添加公有变量

int card[13];

CButton *m_Button[4]; // 扑克牌按钮显示4张扑克牌

CBitmap Bitmap[13];

2)在BOOL CSusuanDlg::OnInitDialog()中添加

BOOL CSusuanDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

m_Button[0]=(CButton*)GetDlgItem(IDC_BUTTON1);

m_Button[1]=(CButton*)GetDlgItem(IDC_BUTTON2);

m_Button[2]=(CButton*)GetDlgItem(IDC_BUTTON3);

m_Button[3]=(CButton*)GetDlgItem(IDC_BUTTON4);

Bitmap[0].LoadBitmap(IDB_BITMAP2);

Bitmap[1].LoadBitmap(IDB_BITMAP3);

Bitmap[2].LoadBitmap(IDB_BITMAP4);

Bitmap[3].LoadBitmap(IDB_BITMAP5);

Bitmap[4].LoadBitmap(IDB_BITMAP6);

Bitmap[5].LoadBitmap(IDB_BITMAP7);

Bitmap[6].LoadBitmap(IDB_BITMAP8);

Bitmap[7].LoadBitmap(IDB_BITMAP9);

Bitmap[8].LoadBitmap(IDB_BITMAP10);

Bitmap[9].LoadBitmap(IDB_BITMAP11);

Bitmap[10].LoadBitmap(IDB_BITMAP12);

Bitmap[11].LoadBitmap(IDB_BITMAP13);

Bitmap[12].LoadBitmap(IDB_BITMAP14);

…………

}

ID号是对应的图片

此处Button5是程序对应的开始按钮

void CSusuanDlg::OnButton5()

{ // TODO: Add your control notification handler code here

SetTimer(1,1000,NULL);

SpendTime=0;

int j;srand(time(NULL));

for(int a=0;a<13;a++)

{

card[a]=rand()%13;

}

for(int i=1;i<5;i++)

{

j=card[i];

m_Button[i-1]->SetBitmap(HBITMAP(Bitmap[j]));

}

GetDlgItem(IDC_BUTTON5)->SetWindowText("重新开始");//为上面说到的一个控件显示不同

名称

}

5、添加音乐

目前播放wav声音, 可以将音乐转为wav格式的

1)添加头文件

#include

#pragma comment(lib, "winmm.lib")

2)如果将声音集成到程序中, 需要在添加资源中, 添加您的音乐, 导入程序然后用播放音乐

函数:

PlaySound(MAKEINTRESOURCE(IDR_WAVE**), GetModuleHandle(NULL),

SND_RESOURCE);//IDR_WAVE**是导入资源后的ID号(导入资源按照导入图片的步骤)PlaySound函数的声明为:

BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);

参数pszSound是指定了要播放声音的字符串,该参数可以是WAVE文件的名字,或是WAV 资源的名字,或是内存中声音数据的指针,或是在系统注册表WIN.INI中定义的系统事件声音。如果该参数为NULL则停止正在播放的声音。参数hmod是应用程序的实例句柄,当播放WAV 资源时要用到该参数,否则它必须为NULL。参数fdwSound是标志的组合,如下表所示。若成功则函数返回TRUE,否则返回FALSE。

播放标志以及含义:

SND_APPLICATION

用应用程序指定的关联来播放声音。

SND_ALIAS

pszSound参数指定了注册表或WIN.INI中的系统事件的别名。

SND_ALIAS_ID

pszSound参数指定了预定义的声音标识符。

SND_ASYNC

用异步方式播放声音,PlaySound函数在开始播放后立即返回。

SND_FILENAME

pszSound参数指定了WAVE文件名。

SND_LOOP

重复播放声音,必须与SND_ASYNC标志一块使用。

SND_MEMORY

播放载入到内存中的声音,此时pszSound是指向声音数据的指针。

SND_NODEFAULT

不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。

SND_NOSTOP

PlaySound不打断原来的声音播出并立即返回FALSE。

SND_NOWAIT

如果驱动程序正忙则函数就不播放声音并立即返回。

SND_PURGE

停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。

SND_RESOURCE

pszSound参数是WAVE资源的标识符,这时要用到hmod参数。

SND_SYNC

同步播放声音,在播放完后PlaySound函数才返回。

当然播放音乐的代码可以按照意愿放到不同的响应中,或者按照时间来响应。

6、在静态文本中显示文字

GetDlgItem(IDC_STATIC1)->SetWindowText(“”)

前面的IDC_STATIC!为静态文本的ID号,在””中添加要显示的文字。

7、倒计时

1)为susuanDlg类添加公有变量int SpendTime

2)按Ctrl+W为CSusuanDlg添加WM_TIMER映射并添加代码:

void CSusuanDlg::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

int TimerCount;

SpendTime++;

TimerCount=60-SpendTime;

if (TimerCount!=-1)

{

CString SSpendTime;

SSpendTime.Format("%d",TimerCount);

GetDlgItem(IDC_STATIC1)->SetWindowText("倒计时:"+SSpendTime+"秒");

}

else

{ KillTimer(1);

TimerCount=-1;

MessageBox("时间到啦!");

}

}

GetDlgItem(IDC_STATIC1)->SetWindowText("倒计时:"+SSpendTime+"秒");为前面讲到的在静态文本中显示倒计时。效果如图:

MFC实验报告

8、文本框显示文字

1)为文本框添加变量

2)为变量赋值

3)Updatedata(false)

9、文本框显示多行文字

打开文本框属性并按图选择

MFC实验报告

效果如图

MFC实验报告

二、程序的步骤:

1、创建对话框,添加控件如图:

MFC实验报告

2、修改控件ID标识符

1)上面四个位图BUTTON按钮为:

IDC_BUTTON1 位图透明

IDC_BUTTON2 位图透明

IDC_BUTTON3 位图透明

IDC_BUTTON4 位图透明

2)四个位图BUTTON下面对应的文本框分别为:

IDC_EDIT4 透明

IDC_EDIT5 透明

IDC_EDIT6 透明

IDC_EDIT7 透明

3)用于显示时间的静态文本为IDC_STATIC1,其他的按照上图修改标题ID不改

4)“开始”为IDC_BUTTON5 透明

5)“计算”为IDOK 透明

6)“显示结果”为IDC_BUTTON7 透明

7)“退出”为IDCANCEL 透明

8)“输入表达式下面”的文本框为IDC_EDIT1 透明

9)“结果显示下面”的文本框为IDC_EDIT1_Resualt 透明

10)“确定”“退出”下面的文本框为IDC_EDIT8 透明

11)“可选的答案”下面的文本框为IDC_EDIT1_Hints 透明

3、为控件添加变量

MFC实验报告

4、为各个控件添加消息映射

1)为“说明”添加BN_CLICKED消息映射

void CSusuanDlg::OnButton6()

{

MessageBox(" 要求用户利用扑克牌显示的数字,\n 通过加减乘除,以最快的速度得出24(可以使用括号),\n 10 J Q K A做1,然后在文本框中写好表达式,\n 接着单击“计算”按钮。"); }

2)为“开始”添加BN_CLICKED消息映射

void CSusuanDlg::OnButton5()

{

// TODO: Add your control notification handler code here

SetTimer(1,1000,NULL);

SpendTime=0;

int j;

srand(time(NULL));

for(int a=0;a<13;a++)

{

card[a]=rand()%13;

}

for(int i=1;i<5;i++)

{

j=card[i];

m_Button[i-1]->SetBitmap(HBITMAP(Bitmap[j]));

}

UpdateData(true);

if (card[1]<9)

{num1=card[1]+49; n umber[0]=card[1]+1;} //显示在文本框中

Else //当为10 J Q K 时显示’1’

{ num1='1'; number[0]=1;}

if (card[2]<9) //如上

{num2=card[2]+49; n umber[1]=card[2]+1;}

Else

{ num2='1'; number[1]=1;}

if (card[3]<9)

{num3=card[3]+49; number[2]=card[3]+1;}

else

{num3='1'; number[2]=1;}

if (card[4]<9)

{num4=card[4]+49; number[3]=card[4]+1;}

else

{ num4='1'; number[3]=1;}

UpdateData(false);

m_Button[0]->SetBitmap(HBITMAP(Bitmap[card[1]]));

GetDlgItem(IDC_BUTTON5)->SetWindowText("重新开始");

}

3)为“计算”添加BN_CLICKED的消息映射

void CSusuanDlg::OnOK()

{

// TODO: Add extra validation here

int i,t,n,kill,line3;;

deepth=0;

float value;//x_data;

UpdateData(true);

n=strlen(Function);

if(n==0)

{

Hints=_T("");

tips="输入您的结果再按“计算”按钮!如需提示请按确定";

UpdateData(false);

}

else

{

for(i=0;i

{s[i]=Function[i];

}

s[i]='\0';

i=0;

stk1=initoptr();

stk2=initopnd();

push1(';');

store();

value=pop2();

kill=4;

for(i=0;i<4;i++)

for(deepth=0;deepth

{

if(number[i]==individ[deepth])

{

kill--;

for(line3=deepth;line3

individ[line3]=individ[line3+1];

break;

}

}

if(kill==0)

{

t=(int)value;

Result=t;

if(Result!=24)

tips="好遗憾!你错了,需要提示么?";

else

{ tips="答题正确!还有其他的方法,你要看么?";

Function=_T("24");

}

}

else

{

tips="计算式中数据与要求不符,请核对!如需帮助请按确定";

}

Hints=_T("");

Function=_T("");

UpdateData(false);

}

}

4)为“显示结果”添加BN_CLICKED消息映射

void CSusuanDlg::OnButton7()

{

// TODO: Add your control notification handler code here

KillTimer(1); //倒计时结束

yunsuan *head1,*head2,*head3,*head4,*head5;

Hints=_T(" ");

tips=_T(" ");

UpdateData(false);//num4=0;

head1=creat();

head2=creat();

head3=creat();

head4=creat();

head5=creat();

int i,j,k,l,n,m,r,save[4];

double data[4]={1,1,1,1},tem1,tem2,tem3,abc=1111;

char sign[5]="+-*/";

for(i=0;i<4;i++)

{

save[i]=(int)number[i];

data[i]=(int)number[i];

}

for(i=0;i<4;i++)

for(j=0;j<4;j++)

if(j!=i)

{

for(k=0;k<4;k++)

if(k!=i&&k!=j)

{

for(l=0;l<4;l++)

if(l!=i&&l!=j&&l!=k)

{

for(n=0;n<4;n++)

for(m=0;m<4;m++)

for(r=0;r<4;r++)

{

tem1=fun(data[i],data[j],n);

tem2=fun(tem1,data[k],m);

tem3=fun(tem2,data[l],r);

if(tem3==24.0)

add(head1,save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l],1);

else if(tem3==-24.0)

{

if(sign[n]=='*'||sign[n]=='/') add(head2,save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l],2);

}

else if(tem3==1.0/24.0)

add(head3,save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l],3);

else if(tem3==-1.0/24.0)

{

if(sign[l]=='-');

else

add(head4,save[l],sign[r],save[k],sign[m],save[i],sign[n],save[j],4);

}

else

{

tem1=fun(data[i],data[j],n);

tem2=fun(data[k],data[l],r);

tem3=fun(tem1,tem2,m);

if(tem3==24.0)

add(head5,save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l],5);

}

}

}

}

}

trans(head1,1);

trans(head2,2);

trans(head3,3);

trans(head4,4);

trans(head5,5);

outdata *q;

q=str->next;

if(q==NULL)

tips="没有答案!这是组比较特殊的数字!";

UpdateData(false);

while(q!=NULL)

{

q->str;

i=0;

while(q->str[i]!=' ')

{

Hints+=q->str[i];

i++;

}

if(i==14)

{

Hints+=' ';

Hints+=' ';

Hints+=' ';

}

else

if(i==15)

{

Hints+=' ';

Hints+=' ';

}

else

if(i==16)

Hints+=' ';

q=q->next;

}

UpdateData(false);

}

5、添加扑克牌class CSusuanDlg : public CDialog

{

public:

HBITMAP m_hBackGround;

int card[13];

CButton *m_Button[4]; // 扑克牌按钮显示4张扑克牌CBitmap BackGroundBitmap;

CBitmap Bitmap[13];

}

在.cpp文件中

BOOL CSusuanDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

m_Button[0]=(CButton*)GetDlgItem(IDC_BUTTON1);

m_Button[1]=(CButton*)GetDlgItem(IDC_BUTTON2);

m_Button[2]=(CButton*)GetDlgItem(IDC_BUTTON3);

m_Button[3]=(CButton*)GetDlgItem(IDC_BUTTON4);

Bitmap[0].LoadBitmap(IDB_BITMAP2);

Bitmap[1].LoadBitmap(IDB_BITMAP3);

Bitmap[2].LoadBitmap(IDB_BITMAP4);

Bitmap[3].LoadBitmap(IDB_BITMAP5);

Bitmap[4].LoadBitmap(IDB_BITMAP6);

Bitmap[5].LoadBitmap(IDB_BITMAP7);

Bitmap[6].LoadBitmap(IDB_BITMAP8);

Bitmap[7].LoadBitmap(IDB_BITMAP9);

Bitmap[8].LoadBitmap(IDB_BITMAP10);

Bitmap[9].LoadBitmap(IDB_BITMAP11);

Bitmap[10].LoadBitmap(IDB_BITMAP12);

Bitmap[11].LoadBitmap(IDB_BITMAP13);

Bitmap[12].LoadBitmap(IDB_BITMAP14);

m_hBackGround=::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP15 ));

for (int i=1;i<5;i++)

{

m_Button[i-1]->SetBitmap(m_hBackGround);

}

}

显示图片在“开始”的BN_CLICKED消息映射中

6、用于计算的代码

#include "stdlib.h"

#define maxsize 20

char s [100];

#define m_ImageList

#include // 此两个为添加音乐的头文件

#pragma comment(lib, "winmm.lib") //

int kindchoose=0;

float number[4];

float individ[4];

int deepth;

CString Function[maxsize];

typedef struct

{

char ch[maxsize];

int top;

}optr;

typedef struct

{

float num[maxsize];

int top;

}opnd;

typedef struct set

{

int number1;

char mark1;

int number2;

char mark2;

int number3;

char mark3;

int number4;

struct set *next;

}yunsuan;

yunsuan *set1,*set2,*set3,*set4,*set5; typedef struct data

{

char str[maxsize];

struct data *next;

}outdata;

outdata *str;

yunsuan *creat()//产生链表

{

yunsuan *head;

head=(yunsuan *) malloc (sizeof (yunsuan));

head->mark1='0';

head->mark2='0';

head->mark3='0';

head->next=NULL;

head->number1=0;

head->number2=0;

head->number3=0;

head->number4=0;

return head;

}

char s1[maxsize];

optr stk1;

opnd stk2;

optr initoptr()

{

optr s;

s.top=-1;

return s;

}

opnd initopnd()

{

opnd s;

s.top=-1;

return s;

}

void push1(char c)

{

stk1.top=stk1.top+1;

stk1.ch[stk1.top]=c; }

void push2(float x)

{

stk2.top=stk2.top+1;

stk2.num[stk2.top]=x; }

char pop1()

{

char c;

if(stk1.top<0)

{

return 0;

}

c=stk1.ch[stk1.top];

stk1.top--;

return c;

}

float pop2()

{

float x;

if(stk2.top<0)

{

return 0;

}

x=stk2.num[stk2.top];

stk2.top--;

return x;

}

void store()

{

char mark;

int i=0;

float value,x,y,z;

while(s[i]!='\0')

{

if(s[i]>'0'&&s[i]<'10')

{

if(s[i+1]=='0')

{

value=10;

push2(value);

i=i+2;

individ[deepth]=value;

deepth++;

}

else

{

value=(float)(s[i]-'0');

push2(value);

i++;

individ[deepth]=value;

deepth++;

}

}

else

{

if(s[i]=='(')

{

push1(s[i]);

i++;

}

if(s[i]=='+'||s[i]=='-')

{

mark=pop1();

if(mark=='('||mark==';')

{

push1(mark);

push1(s[i]);

i++;

}

else

{

x=pop2();

y=pop2();

switch(mark)

{

case '+':z=y+x;break;

case '-':z=y-x;break;

case'*':z=y*x;break;

case '/':z=y/x;break;

default:break;

}

push2(z);

}

}

else

if(s[i]=='*'||s[i]=='/')

{

mark=pop1();

if(mark=='('||mark=='+'||mark=='-'||mark==';')

{

push1(mark);

push1(s[i]);

i++;

}

else

{

x=pop2();

y=pop2();

switch(mark)

{

case'*':z=y*x;break;

case '/':z=y/x;break;

default:break;

}

push2(z);

}

}

else

if(s[i]==')')

{

mark=pop1();

while(mark!='(')

{

x=pop2();

y=pop2();

switch(mark)

{

case '+':z=y+x;break;

case '-':z=y-x;break;

case'*':z=y*x;break;

case '/':z=y/x;break;

default:break;

}

push2(z);

mark=pop1();

}

//c=pop1();

i++;

}

}

}

mark=pop1();

while(mark!=';')

{

x=pop2();

y=pop2();

switch(mark)

{

case '+':z=y+x;break;

case '-':z=y-x;break;

case'*':z=y*x;break;

case '/':z=y/x;break;

default:break;

}

push2(z);

mark=pop1();

}

}

double fun(double a1,double a2,int b)

{

switch(b)

{