返回列表 发帖

【教学视频】《C语言也能干大事》第七节:自己动手写音乐贺卡、计算器

《C语言也能干大事》已经录制第二版,不推荐初学者学习这里的旧版,因此请到下面的地址( http://www.rupeng.com/forum/forum-52-1.html )学习第二版。

在线观看视频(非清晰在线版):


清晰版下载:
如鹏下载站1:点击下载
如鹏电骡(verycd)下载站:http://www.verycd.com/topics/2800166/


本节课代码工程下载:
音乐贺卡: MusicCard.rar (263.41 KB)
计算器2.0版: CALCV2.rar (18.91 KB)

板书:

今天内容:作业点评,给女友的音乐贺卡(exe嵌入音乐,涉及到c编程中全局变量的处理),“自己动手写计算器2.0版”。如果时间允许会讲“自己动手写小时钟”,涉及到的知识点是:定时器的使用,涉及到的C知识就是函数指针(回调函数)的应用。

吃糖葫芦:既有红果、又有橘子瓣,数有多少个红果?我是个盲人,从一头开始吃,遇到酸味的就是红果。
jason作业点评:
依次显示系统中所有的盘符
case IDC_BTNLIST:

TCHAR str[256];


DWORD d2=GetLogicalDrives();


Getlist(str,d2);


SetDlgItemText(hwnd,IDC_EDTLIST,str);



break;

//函数实现部分
void Getlist(TCHAR *p,DWORD n)
{

int a=65;
//'A'
ASCII

int i=0;


while(n>0)


{


if(n&1)


{


*p=char(a);


p++;


}


n=n>>1;


a++;


*p=0;


}

}
jason写的非常好,改进意见把“int a=65”替换成“int a= 'A';”,这样就不用写死65这个“神秘数字”了。
我的参考答案,思路和jason的非常类似:

DWORD ds = GetLogicalDrives();


int counter=0;


while(ds>0)


{


if(ds&1)


{


char ch = 'A'+counter;


char chs[2] = {ch,'\0'};


MessageBox(NULL,chs,"",MB_OK);


}


counter++;


ds=ds>>1;


}


怎么播放嵌入式的音乐。给女友的音乐贺卡
插入WAVE类型的资源,给资源一个名字,比如IDW_MUSIC然后在Main_OnInitDialog方法里调用:
PlaySound(TEXT("IDW_MUSIC"),appInstance,SND_RESOURCE|SND_ASYNC| SND_LOOP);
其中SND_RESOURCE掩码位表示音乐文件资源是嵌入式资源
mian.cpp的头部加上全局变量声明:
HINSTANCE appInstance;
main.h中加入
extern HINSTANCE appInstance;
在工程的WinMain所在的代码中加入:
appInstance = hInstance;
.c文件中声明全局变量,在.h中使用extern来“导出”变量。
大的项目中不可能只有一个文件,因此这是一个比较重要的地方。
一个c文件里不能直接调用另一个C文件里的全局变量
我简单提醒一下,你再对照课本。比如A.c里定义了一个全局便来那个,如果B.c要调用,首先要在A.hextern这个变量,然后在B.cinclude A.h
全局变量也成为外部变量,他是在函数外部定义的变量,不属于哪个函数,他属于整个源程序文件,其作用域是整个源程序。
晕了
原来的控制台程序就1个文件,没发现那么多问题,现在的Dialog程序一弄都是一堆,大批的问题就来了


2、得到HINSTANCE的两种方式
1)像上面讲的一样:可以在WinMain中使用全局变量保存实例句柄,在main.c中声明:
HINSTANCE appInstance;
         main.h中声明:
extern HINSTANCE appInstance;
         然后在WinMain中:
appInstance = hInstance;
2)用GetWindowLong从窗口句柄取得执行实体句柄:
HINSTANCE ai = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);

做任何事情都不可能只有一条路,不要你学过一条路,看别人走另外一条路你就糊涂了,作选择的权利是人最应该珍惜的权利,应该根据实际情况选择不同的路。就像是不是要考研之类的选择一样,没人比你自己更清楚应该怎么办。
下面就来实现“自己动手写计算器2.0版”,允许选择运算符号。
ComboBox的操作
1)添加项:
填入Combo最简单的方法是借助CB_ADDSTRING消息:
SendDlgItemMessage (hwnd,IDC_CBO1, CB_ADDSTRING, 0, (LPARAM) szString) ;

(2) 确定目前选项的索引:iIndex = SendDlgItemMessage (hwnd,IDC_CBO1, CB_GETCURSEL, 0, 0) ;如果没有项目被选中,那么从函数中传回的iIndex值为CB_ERR。额外知识,不讲,自学(不想变成填鸭式教育,课上只讲思想性的东西,会给大家学习资料,希望大家培养自学能力)
3)删除项:
在指定索引值的同时使用LB_DELETESTRING参数,这就可以从清单方块中删除字符串:
SendDlgItemMessage (hwnd,IDC_CBO1, LB_DELETESTRING, iIndex, 0) ;
4)取得有多少项:
iCount = SendDlgItemMessage (hwnd,IDC_CBO1, LB_GETCOUNT, 0, 0) ;(5)选定某一项SendDlgItemMessage (hwnd,IDC_CBO1, LB_SETCURSEL, iIndex, 0) ;将iParam设定为-1则取消所有选择
实现四则运算器:
1)首先在对话框初始化的时候向ComboBox加入内容:

SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_ADDSTRING,0,(LPARAM)TEXT("+"));


SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_ADDSTRING,0,(LPARAM)TEXT("-"));


SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_ADDSTRING,0,(LPARAM)TEXT("*"));


SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_ADDSTRING,0,(LPARAM)TEXT("/"));

2Calc函数的实现:
void Calc(HWND hwnd)
{

TCHAR cNumber1[256],cNumber2[256];


GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR));


GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR));


int iIndex = SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_GETCURSEL,0,0);


int i1 = atoi(cNumber1);


int i2 = atoi(cNumber2);


int iResult;


BOOL bError = FALSE;


switch(iIndex)


{


case 0:


iResult = i1+i2;


break;


case 1:


iResult = i1-i2;


break;


case 2:


iResult = i1*i2;


break;


case 3:


if(0==i2)


{


MessageBox(hwnd,TEXT("
被除数不能是0"),TEXT("错误"),MB_OK|MB_ICONERROR);

bError = TRUE;


}


else


{


iResult = i1/i2;


}


break;


default:


MessageBox(hwnd,TEXT("
操作符选择错误"),TEXT("错误"),MB_OK|MB_ICONERROR);

bError = TRUE;


break;


}


if(FALSE==bError)


{


TCHAR cResult[256];


itoa(iResult,cResult,10);


SetDlgItemText(hwnd,IDC_EDTRESULT,cResult);


}

}

课后作业:实现实际值到二进制的转换

我的答案,10转2进制稍微投机了点,呵呵

  1. void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  2. {
  3.     switch(id)
  4.     {
  5.         case IDC_BTN1:
  6.          Calc(hwnd);
  7.          break;
  8.         case IDC_BTNTOBINARY:
  9.          TCHAR binary[33] = {'0'};
  10.          Transform(hwnd,binary);
  11.          
  12.          SetDlgItemText(hwnd,IDC_EDTNUM4,binary);
  13.           break;
  14.     }
  15. }


  16. 活学活用,反正10转2进制就是原封不动的把内存里的信息复制过来,这样的话放着位比较这么好东西不用还搞那么复杂的计算干啥~呵呵
复制代码
  1. void Transform(HWND hwnd,TCHAR* binary)
  2. {
  3. int i = 1;
  4. int k = 0;
  5. TCHAR j[256];
  6. int NombreDUtilisater;
  7. GetDlgItemText(hwnd,IDC_EDTNUM3,j,sizeof(j)/sizeof(TCHAR));
  8. NombreDUtilisater = atoi(j);
  9. do
  10. {
  11.   if(NombreDUtilisater & i)
  12.   {
  13.    binary[k] = '1';
  14.   }
  15.   else
  16.   {
  17.    binary[k] = '0';
  18.   }
  19.   k++;
  20. }while(i = i<<1);
  21. strrev(binary);
  22. }
复制代码
1

评分人数

TOP

原帖由 diablox0147 于 2009-7-22 05:21 发表
我的答案,10转2进制稍微投机了点,呵呵
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTN1:
         Calc(hwnd);
         break;
...

嗯嗯,位运算更直接。。
void cov(HWND hwnd)
{
TCHAR Num1[BUF], Num2[LEN + 1];//
GetDlgItemText(hwnd, IDC_EDTNUM3, Num1, sizeof(Num1) / sizeof(char));
int dec = atoi(Num1);

for(int i = LEN - 1; i >= 0 ; i--)
{
     Num2 = (dec & 01) + '0';//位号上的数字复制给数组元素;
  dec >>=  1;//取位号上的数字(也就是0 或者 1);
  
  }
  Num2[LEN] = '\0';
SetDlgItemText(hwnd, IDC_EDTNUM4, Num2);
}
1

评分人数

TOP

重新做了一遍音乐贺卡,修正了一个BUG,就是在点击停止播放时没有效果,因为那个playsound函数参数有误;
因附件太大无法上传,发个截图看看。

#include <windows.h>
#include <windowsx.h>
#include "main.h"
#include "dialogs.h"
#include "resource.h"
#include "rsrc.inc"
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //BEGIN MESSAGE CRACK
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
        HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
        //END MESSAGE CRACK
    }
    return FALSE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnInitDialog
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    // Set app icons
    HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
    SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
    SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
   
    //
    // Add initializing code here
    //
   
    return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
HINSTANCE appInstance =(HINSTANCE) GetWindowLong(hwnd,GWL_HINSTANCE);
    switch(id)
    {
        case IDC_BTN1:
            PlaySound(TEXT("IDW_MUSIC"),appInstance,SND_RESOURCE|SND_ASYNC|SND_LOOP);
        break;
        case IDC_BTN2:
            PlaySound(NULL,NULL,SND_FILENAME|SND_ASYNC);
        break;
        default:break;
    }
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnClose
void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}
musiccard2.jpg
1

评分人数

TOP

今天一口气看了三集,不过还是把作业完成了。
CAL2.jpg
2.jpg

CALV2.rar (19.03 KB)

MUSICCARD.rar (1.3 MB)

1

评分人数

TOP

十进制转二进制 作业

  1.   TCHAR cNumber[256];
  2.    GetDlgItemText(hwnd,IDC_EDT_NUMBER,cNumber,sizeof(cNumber)/sizeof(TCHAR));
  3.    int iNumber = atoi(cNumber);
  4.    /****从EDIT框取值到iNumber****/

  5.    TCHAR cResult[256];
  6.    itoa(iNumber,cResult,2);    /***转换时所用基数选2(二进制)***/
  7.    SetDlgItemText(hwnd,IDC_EDT_RESULT,cResult);
复制代码


感觉偷懒了啊 哈哈,附上一个学C时候的递归算法:

  1. void NumberToBinary(int Number)
  2. {
  3.       if(0==Number)      //如果形参为0则停止递归
  4.       {
  5.             return;
  6.       }
  7.       else
  8.       {
  9.             NumberToBinary(hwnd,Number/2);     // 递归除2
  10.             printf("%c",‘0’+Number%2);                 // 0+0=0;0+1=1; 依次打印
  11.       }
  12. }

  13. void main()
  14. {
  15.       int a;
  16.       scanf("%d",&a);
  17.       NumberToBinary(a);
  18. }
复制代码

TOP

第1到八节课都下载下来了,唯独这么没速度,难道过期删除了?杨老师能不能再补一下?想要清晰版的,谢谢

TOP

没有删除。稍等片刻再重试一下,最近纳米盘一直不稳定,估计和经济危机有关系。

TOP

这集确实存在下载问题,挂了好几天了一动不动,唯独这集下不了,

TOP

有速度了,没下的朋友抓紧

TOP

我更新了一下,你再试一下,或者找其他已经下载了的同学共享一下。

TOP

看完第7节补做的作业

//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    TCHAR cBinary[256];
    GetDlgItemText(hwnd,IDC_EDT4,cBinary,sizeof(cBinary)/sizeof(TCHAR));
    int nn,iBinary;
    nn=atoi(cBinary);
    switch(id)
    {
         case IDC_BTN1:
         Jisuan(hwnd);
         break;
         case IDC_BTN2:
         printBinary(hwnd,nn);
         SetDlgItemText(hwnd,IDC_EDT5,strResult);
         break;
         default:
         break;
    }
}
//==========================================转换10进制的函数
void printBinary(HWND hwnd,int n)
{
if(n>1)
{
printBinary(hwnd,n/2);
}
int cN=n%2;
TCHAR cS[256];
itoa(cN,cS,10);
strcat(strResult,cS);
}
TCHAR strResult[256]={""};//定义为全局变量
自我感觉代码写的有点混乱

TOP

vc插入音乐

在vc里添加音乐文件为什么不能播放呢
全局变量已经声明了。
在Cfree里已经可以播放了,在VC里还是不能播放不知那里不对了。
请老师指教。
01.JPG
02.JPG

TOP

原帖由 wanghepeng10 于 2009-4-4 13:29 发表
在vc里添加音乐文件为什么不能播放呢
全局变量已经声明了。
在Cfree里已经可以播放了,在VC里还是不能播放不知那里不对了。
请老师指教。


参考此贴:http://www.rupeng.com/forum/thread-1254-1-1.html

TOP

作业:单位转换,进制转换...

$7.rar (17.75 KB)

TOP

交作业

这一章把4、5、6的全部复习了一遍,终于可以稍微顺畅的使用这些知识了,谢谢杨老师!

运行截图

未命名.JPG

CALCV2.rar (18.06 KB)

程序源码

TOP

修改后的作业

看到635260101,我也增加了相应的多进制转换功能,请杨老师检查。

运行截图

未命名.JPG

CALCV2.rar (13.78 KB)

程序源码

TOP

作业

8CFCBDBC-CC3E-42D3-ABF4-0C8D7C645A4E.jpg
2009-6-1 14:57

学的很慢..用递归实现的二十和十二转换,转到其他进制步骤应该类似吧,在C-free里运行数值有偏差,在tc数值正确不知是怎么回事..

计算器v2.rar (26.14 KB)

TOP

`看的时候没空 今天有空 就把作业完成了 大家指教!


void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_BTN1:
JISUAN(hwnd);
break;

case IDC_BTN2:
ZHUANHUAN(hwnd);
break;
default:break;
}

}
void ZHUANHUAN(HWND hwnd)
{
TCHAR s4[256],s5[256];
GetDlgItemText(hwnd,IDC_EDT4,s4,sizeof(s4)/sizeof(TCHAR));
int i5=atoi(s4);
itoa(i5,s5,2);
SetDlgItemText(hwnd,IDC_EDT5,s5);

}
void JISUAN(HWND hwnd)
{
TCHAR s1[256],s2[256],s3[256];
GetDlgItemText(hwnd,IDC_EDT1,s1,sizeof(s1)/sizeof(TCHAR));
GetDlgItemText(hwnd,IDC_EDT2,s2,sizeof(s2)/sizeof(TCHAR));
int i1,i2,i3,i4;
i1=atoi(s1);
i2=atoi(s2);
i3=SendDlgItemMessage(hwnd,IDC_CBO1,CB_GETCURSEL,0,0);
switch(i3)
{
case 0:
{
i4=i1+i2;
}
break;

case 1:
{
i4=i1-i2;
}
break;

case 2:
{
i4=i1*i2;
}
break;

case 3:
{
if(0==i2)
{
MessageBox(hwnd,TEXT("被除数不能为0"),TEXT("提示"),MB_OK|MB_ICONHAND);
return;
}
i4=i1/i2;
}
break;
default:
MessageBox(hwnd,TEXT("请选择运算符!"),TEXT("提示"),MB_OK|MB_ICONHAND);
break;
}

itoa(i4,s3,10);
SetDlgItemText(hwnd,IDC_EDT3,s3);
}

界面

1112.jpg

TOP

未命名.jpg
2009-6-30 00:43

7.rar (24.34 KB)

TOP

大家有没有遇到 写的计算器 中总是显示 第二个输入数字的情况?????

TOP

郁闷了 一下午了  
才发现了 原来是 读取数字的时候太懒了 ,复制了 上一句代码,该参数 没有改全。  哎

TOP

//////////////////////////////小计算器 部分代码////

#include <windows.h>
#include <windowsx.h>
#include "main.h"
#include "dialogs.h"
#include "resource.h"
#include "rsrc.inc"
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //BEGIN MESSAGE CRACK
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
        HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
        //END MESSAGE CRACK
    }
    return FALSE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnInitDialog
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    // Set app icons
    HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
    SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
    SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
    //////////////////////////////////////////
//
    SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_ADDSTRING,0,(LPARAM)TEXT("+"));
SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_ADDSTRING,0,(LPARAM)TEXT("-"));
SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_ADDSTRING,0,(LPARAM)TEXT("*"));
SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_ADDSTRING,0,(LPARAM)TEXT("/"));
SendDlgItemMessage(hwnd,IDC_CBOZHUANHUAN,CB_ADDSTRING,0,(LPARAM)TEXT("2进制"));
SendDlgItemMessage(hwnd,IDC_CBOZHUANHUAN,CB_ADDSTRING,0,(LPARAM)TEXT("8进制"));
SendDlgItemMessage(hwnd,IDC_CBOZHUANHUAN,CB_ADDSTRING,0,(LPARAM)TEXT("10进制"));
SendDlgItemMessage(hwnd,IDC_CBOZHUANHUAN,CB_ADDSTRING,0,(LPARAM)TEXT("16进制"));
    //
    // Add initializing code here
    //
   
    return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTNEQUALS:
         Calc(hwnd);
        break;
        case IDC_BTNQUIT:
         EndDialog(hwnd,0);
        break;
        case IDC_BTNCHANGE:
         CHANGE(hwnd);
        break;
        default:break;
    }
}
//////////////////////////////////
//计算
void Calc(HWND hwnd)
{
BOOL bERROR = FALSE;  //定义布尔值,判断出错位
TCHAR cNumber1[256],cNumber2[256];
if( GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR))==0,
  GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR))==0)
{
  MessageBox(NULL,TEXT("请写全运算数!"),TEXT("错误"),MB_OK|MB_ICONWARNING);
  bERROR = TRUE;
}
int iIndex = SendDlgItemMessage(hwnd,IDC_CBOOPERATOR,CB_GETCURSEL,0,0);
float f1 = atof(cNumber1);
float f2 = atof(cNumber2);
float fResult;

switch(iIndex)
{
  case 0:
   fResult = f1+f2;
  break;
  case 1:
   fResult = f1-f2;
  break;
  case 2:
   fResult = f1*f2;
  break;
  case 3:
   if(f2!=0)
   {
    fResult = f1/f2;
   }
   else
   {
    MessageBox(NULL,TEXT("被除数不能为零!"),TEXT("警告"),MB_OK|MB_ICONWARNING);
    bERROR = TRUE;
   }
  break;
  default:
   MessageBox(NULL,TEXT("请选择运算符!"),TEXT("错误"),MB_OK|MB_ICONERROR);
   bERROR = TRUE;
  break;
}
if(FALSE==bERROR)
{
  TCHAR cResult[256];
  gcvt(fResult,8,cResult); //功 能: 把浮点数转换成字符串
  SetDlgItemText(hwnd,IDC_EDTRESULT,cResult);
}

}
//////////////////////////////////////////
//转换函数
void CHANGE(HWND hwnd)
{
BOOL bERROR = FALSE;
TCHAR cNumber3[256],cNumber4[256];
int iIndex2 =  SendDlgItemMessage(hwnd,IDC_CBOZHUANHUAN,CB_GETCURSEL,0,0);
if(GetDlgItemText(hwnd,IDC_EDTNUM3,cNumber3,sizeof(cNumber3)/sizeof(TCHAR))==0)  //返回GetDlgItemText函数值并判断用户是否写入字符
{
  MessageBox(NULL,TEXT("请选择待转换数!"),TEXT("提示"),MB_OK|MB_ICONWARNING);
  bERROR = TRUE;
}
int i3 = atoi(cNumber3);

switch(iIndex2)
{
  case 0:
   itoa(i3,cNumber4,2);
  break;
  case 1:
   itoa(i3,cNumber4,8);
  break;
  case 2:
   itoa(i3,cNumber4,10);
  break;
  case 3:
   itoa(i3,cNumber4,16);
  break;
  default:
   MessageBox(NULL,TEXT("请选择转换进制!"),TEXT("错误"),MB_OK|MB_ICONERROR);
   bERROR = TRUE;
  break;
}
if(FALSE ==bERROR)
{
  SetDlgItemText(hwnd,IDC_EDTRESULTB,cNumber4);
}
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnClose
void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}

CALC_V2.0.rar (26.81 KB)

CALC_V2.0

TOP

交上作业

  1. BOOL Main_OnInitDialog/*initialize 当初始化的意思*/(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  2. {
  3.     // Set app icons
  4.     HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
  5.     SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
  6.     SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
  7.     SendDlgItemMessage(hwnd,IDC_CBOOPERATER,CB_ADDSTRING/*加字符串了说明*/,0,(LPARAM)TEXT("+"));
  8.     /*这句加这里是在对话框初始化的时候发字符串给COMBOBOX最合适 了*/
  9.     SendDlgItemMessage(hwnd,IDC_CBOOPERATER,CB_ADDSTRING,0,(LPARAM)TEXT("-"));
  10.     SendDlgItemMessage(hwnd,IDC_CBOOPERATER,CB_ADDSTRING,0,(LPARAM)TEXT("*"));
  11.     SendDlgItemMessage(hwnd,IDC_CBOOPERATER,CB_ADDSTRING,0,(LPARAM)TEXT("/"));
  12.     //
  13.     // Add initializing code here
  14.     //
  15.    
  16.     return TRUE;
  17. }
复制代码
  1. //  Main_OnCommand
  2. void Calc(HWND hwnd);
  3. void binary(HWND hwnd);
  4. void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  5. {
  6.     switch(id)
  7.     {
  8.         case IDC_BTNADD:
  9.                Calc(hwnd);
  10.         break;
  11.         case IDC_BTNTWO:
  12.                binary(hwnd);
  13.          break;
  14.         default:break;
  15.     }

  16. }
  17. void binary(HWND hwnd)
  18. {
  19.        TCHAR cbinary[NLength];
  20.        GetDlgItemText(hwnd,IDC_EDTJIN1,cbinary,sizeof(cbinary)/sizeof(TCHAR));
  21.        int ct=atoi(cbinary);
  22.        itoa(ct,cbinary,2);
  23.        SetDlgItemText(hwnd,IDC_EDTJIN2,cbinary);
  24. }
  25. void Calc(HWND hwnd)
  26. {
  27.        BOOL error = false;
  28.        TCHAR cNumber1[NLength],cNumber2[NLength];
  29.        GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR));//获得EDT里的TEXT内容
  30.        GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR));
  31.        double number1 = atof(cNumber1);
  32.        double number2 = atof(cNumber2);//将字符串形式转化为float 型
  33.        double sum = 0;
  34.        int iIndex = SendDlgItemMessage(hwnd,IDC_CBOOPERATER,CB_GETCURSEL,0,0);//从COMBOBOX里获得点击的哪个第一个是0,第二个是1...
  35.        switch(iIndex)
  36.        {
  37.               case 0:
  38.                      sum = number1 + number2;
  39.                     
  40.               break;
  41.               case 1:
  42.                      sum = number1 - number2;
  43.                     
  44.               break;
  45.               case 2:
  46.                      sum = number1 * number2;
  47.                     
  48.               break;
  49.               case 3:
  50.                   if(number2==0)
  51.                   {
  52.                             MessageBox(hwnd,"被除数不能为0","错误",MB_OK);
  53.                             error = true;
  54.                      }
  55.                      else
  56.                      {
  57.                             sum = number1 / number2;//注意number2不能为0
  58.                      }
  59.                     
  60.               break;
  61.               default:
  62.                     MessageBox(hwnd,TEXT("输入错误"),TEXT("错误"),MB_OK|MB_ICONERROR);
  63.               break;
  64.                      
  65.        }
  66.        if(error == false)
  67.        {
  68.               TCHAR SUM[NLength*2];
  69.               gcvt(sum,10,SUM);//将双精度数转化为字符串形式
  70.               SetDlgItemText(hwnd,IDC_EDTSUM,SUM);//将答案写到 EDTSUM里
  71.        }
  72.       
  73. }
复制代码

21.jpg
2009-7-20 10:43

CALC2.0.rar (9.44 KB)
坚持就是胜利~~~~~

TOP

音乐贺卡作业,这里我用声明


  1. BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  2. {
  3.     // Set app icons
  4.     HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
  5.     SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
  6.     SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
  7.     //HINSTANCE ai = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
  8.    
  9.     PlaySound(TEXT("IDR_MUSIC"),ai,SND_RESOURCE|SND_ASYNC);
  10.    
  11.     //
  12.     // Add initializing code here
  13.     //
  14.    
  15.     return TRUE;
  16. }
  17. ////////////////////////////////////////////////////////////////////////////////
  18. //  Main_OnCommand
  19. void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  20. {
  21.     switch(id)
  22.     {
  23.    
  24.         case IDC_BTNSTOP:
  25.          PlaySound(NULL,NULL,0);
  26.          
  27.          
  28.         break;
  29.         case IDC_BTN22:
  30.          PlaySound(TEXT("IDR_MUSIC"),ai,SND_RESOURCE|SND_ASYNC);
  31.          
  32.         break;
  33.         
  34.         
  35.         
  36.         default:break;
  37.     }
  38. }
复制代码
12.jpg
2009-7-20 19:37
坚持就是胜利~~~~~

TOP

#include <windows.h>
#include <windowsx.h>
#include "main.h"
#include "dialogs.h"
#include "resource.h"
#include "rsrc.inc"
bool denghao=false;
int fuhao=0,fuhao2=0,dengyu=0;
   TCHAR Number1[256],Number2[256];
void shuzi(HWND hwnd,TCHAR a[256])
{
TCHAR kong[256]="";
if(fuhao!=0)
{  
   GetDlgItemText(hwnd,IDC_EDT1,Number1,sizeof(Number1)/sizeof(TCHAR));
       SetDlgItemText(hwnd,IDC_EDT1,"");
       fuhao=0;
}
if(dengyu!=0)
{
SetDlgItemText(hwnd,IDC_EDT1,"");
dengyu=0;
}
TCHAR d[256];
   GetDlgItemText(hwnd,IDC_EDT1,d,sizeof(d)/sizeof(TCHAR));
   if(d[31]=='\0')
      {if(d[0]=='0'&&d[1]!='.')
   {
   SetDlgItemText(hwnd,IDC_EDT1,kong);
   GetDlgItemText(hwnd,IDC_EDT1,d,sizeof(d)/sizeof(TCHAR));
   }
   lstrcat(d,a);
   SetDlgItemText(hwnd,IDC_EDT1,d);}
}
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //BEGIN MESSAGE CRACK
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
        HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
        //END MESSAGE CRACK
    }
    return FALSE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnInitDialog
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    // Set app icons
    HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
    SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
    SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
   
    //
    // Add initializing code here
    //
   
    return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{

    switch(id)
    {
case IDC_BTN0:
   if(fuhao!=0)
{  
   GetDlgItemText(hwnd,IDC_EDT1,Number1,sizeof(Number1)/sizeof(TCHAR));
       SetDlgItemText(hwnd,IDC_EDT1,"");
       fuhao=0;
}
  if(dengyu!=0)
{
SetDlgItemText(hwnd,IDC_EDT1,"");
dengyu=0;
}
TCHAR a[256];
GetDlgItemText(hwnd,IDC_EDT1,a,sizeof(a)/sizeof(TCHAR));
if (a[1]!='\0'|a[0]!='0')
{
   lstrcat(a,"0");
}
SetDlgItemText(hwnd,IDC_EDT1,a);
    break;
    case IDC_BTN1:   //按钮1
shuzi(hwnd,"1");
   break;
   case IDC_BTN2:
   shuzi(hwnd,"2");
   break;
   case IDC_BTN3:
   shuzi(hwnd,"3");
   break;
   case IDC_BTN4:
   shuzi(hwnd,"4");
   break;
case   IDC_BTN5:
  shuzi(hwnd,"5");
break;
    case   IDC_BTN6:
   
shuzi(hwnd,"6");
break;
    case   IDC_BTN7:
   
shuzi(hwnd,"7");
break;
   case   IDC_BTN8:
shuzi(hwnd,"8");
break;
   case   IDC_BTN9:
shuzi(hwnd,"9");
break;
case IDC_BTN13:
if(fuhao!=0)
{  
   GetDlgItemText(hwnd,IDC_EDT1,Number1,sizeof(Number1)/sizeof(TCHAR));
       SetDlgItemText(hwnd,IDC_EDT1,"0");
       fuhao=0;
}
   TCHAR c[256];
   int j;
   j=0;
   int i;
   GetDlgItemText(hwnd,IDC_EDT1,c,sizeof(c)/sizeof(TCHAR));
   for(i=0;i<32;i++)
   {
  if(c=='.')
     j=1;
   }
   if(j!=1)
   {
   lstrcat(c,".");
   }
   SetDlgItemText(hwnd,IDC_EDT1,c);
   break;
   case IDC_BTN16:      //+
      fuhao=fuhao2=1;
      denghao=true;
   break;
   case IDC_BTN17:      //-
   fuhao=fuhao2=2;
   denghao=true;
   break;
    case IDC_BTN18:  
   denghao=true; //*
   fuhao=fuhao2=3;
   break;
  case IDC_BTN11:  
  denghao=true;     // 除
fuhao=fuhao2=4;
    break;
   case IDC_BTN12:
      if(denghao)
      {
   if(fuhao!=0)
{  
   GetDlgItemText(hwnd,IDC_EDT1,Number1,sizeof(Number1)/sizeof(TCHAR));
}
      if(dengyu!=0)
     {  
     GetDlgItemText(hwnd,IDC_EDT1,Number1,sizeof(Number1)/sizeof(TCHAR));
     dengyu=0;
  }
  else
      GetDlgItemText(hwnd,IDC_EDT1,Number2,sizeof(Number2)/sizeof(TCHAR));
  long double x,y,z;
     TCHAR f[256];
      x=atof(Number1);
      y=atof(Number2);
   switch(fuhao2)
      {
     case 1:
  z=x+y;
  break;
        case 2:
        z=x-y;
  break;
        case 3:
  z=x*y;
  break;
        case 4:
  z=x/y;
   break;
   }
  gcvt(z,16,f);
  SetDlgItemText(hwnd,IDC_EDT1,f);
   dengyu=1;
      }
   break;
case IDC_BTN10:
SetDlgItemText(hwnd,IDC_EDT1,"0");
ZeroMemory(Number2,sizeof(Number2)/sizeof(TCHAR));
ZeroMemory(Number1,sizeof(Number1)/sizeof(TCHAR));
denghao=false;
dengyu=0;
fuhao=fuhao2=0;
break;    俺的计算器额  点评下下额

TOP

我想问一下:

在“给女友的音乐贺卡”的程序里使用了PlaySound,但为什么 没有 #include <mmsystem.h> 也能播放wav呢?谢谢

TOP

t2.JPG
2009-8-19 11:49

2.0版计算器
摘录。。。
  1. void SetResult(HWND hDlg, HWND hCtrl, WORD idCtrl)
  2. {
  3.     TCHAR num1[256], num2[256], num3[256];
  4.     int n1 = 0, n2 = 0, n3 = 0;
  5.     GetDlgItemText(hDlg, IDC_EDTNUM1, num1, 255);
  6.     GetDlgItemText(hDlg, IDC_EDTNUM2, num2, 255);
  7.     int nOperator = SendDlgItemMessage(hDlg, IDC_CBOPERATOR, CB_GETCURSEL, 0, 0);
  8.     n1 = atoi(num1);
  9.     n2 = atoi(num2);
  10.     switch (nOperator)
  11.     {
  12.     case 0:  //选择“加”的场合
  13.         n3 = n1 + n2;
  14.         break;
  15.     case 1:  //选择“减”的场合
  16.         n3 = n1 - n2;
  17.         break;
  18.     case 2:  //选择“乘”的场合
  19.         n3 = n1 * n2;
  20.         break;
  21.     case 3:  //选择“除”的场合
  22.         if (n2 == 0)
  23.         {
  24.             MessageBox(hDlg, TEXT("除数不能是 0 !"), TEXT("错误"), MB_OK|MB_ICONERROR);
  25.             n3 = 0;
  26.             break;
  27.         }
  28.         n3 = n1 / n2;
  29.         break;
  30.     }
  31.     itoa(n3, num3, 10);
  32.     SetDlgItemText(hDlg, IDC_EDTRESULT, num3);
  33. }
复制代码
源代码:
Win32API.rar (5.26 KB)

[ 本帖最后由 辉之环 于 2009-8-19 11:51 编辑 ]

TOP

计算器v2作业


#include <windows.h>
#include <windowsx.h>
#include "main.h"
#include "dialogs.h"
#include "resource.h"
#include "rsrc.inc"
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //BEGIN MESSAGE CRACK
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
        HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
        //END MESSAGE CRACK
    }
    return FALSE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnInitDialog
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    // Set app icons
    HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
    SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
    SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
    SendDlgItemMessage(hwnd,IDC_CBOOPEATOR,CB_ADDSTRING,0,(LPARAM)TEXT("+"));
    SendDlgItemMessage(hwnd,IDC_CBOOPEATOR,CB_ADDSTRING,0,(LPARAM)TEXT("-"));
    SendDlgItemMessage(hwnd,IDC_CBOOPEATOR,CB_ADDSTRING,0,(LPARAM)TEXT("*"));
    SendDlgItemMessage(hwnd,IDC_CBOOPEATOR,CB_ADDSTRING,0,(LPARAM)TEXT("/"));
   
    //
    // Add initializing code here
    //
   
    return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
       case IDC_BTNEQUAL:
         calc(hwnd);
       break;
       case IDC_BTNCHANGE:
         changebinary(hwnd);
       break;
    default :
       break;
    }
}
void calc(HWND hwnd)
{
TCHAR cNUMBER1[256],cNUMBER2[256];
GetDlgItemText(hwnd,IDC_EDTNUM1,cNUMBER1,sizeof(cNUMBER1)/sizeof(TCHAR));
GetDlgItemText(hwnd,IDC_EDTNUM2,cNUMBER2,sizeof(cNUMBER2)/sizeof(TCHAR));
int i1=atoi(cNUMBER1);
int i2=atoi(cNUMBER2);
int iIndex=SendDlgItemMessage(hwnd,IDC_CBOOPEATOR,CB_GETCURSEL,0,0);
int iResult;
BOOL bError=FALSE;
switch (iIndex)
{
  case 0:
   iResult=i1+i2;
  break;
  case 1:
   iResult=i1-i2;
  break;
  case 2:
   iResult=i1*i2;
  break;
  case 3:
   if(0==i2)
   {
    MessageBox(hwnd,TEXT("被除数不能等于0"),TEXT("错误"),MB_OK|MB_ICONERROR);
    bError=TRUE;
   }
   else
   {
    iResult=i1/i2;
   }
  break;
  default:
   MessageBox(hwnd,TEXT("操作符选择错误!"),TEXT("错误"),MB_OK|MB_ICONERROR);
   bError=TRUE;
  break;
}

if(FALSE==bError)
{
  TCHAR cResult[256];
  itoa(iResult,cResult,10);
  SetDlgItemText(hwnd,IDC_EDTRESULT,cResult);
}
}

void changebinary(HWND hwnd)
{
TCHAR cN1[256];
GetDlgItemText(hwnd,IDC_EDT1,cN1,sizeof(cN1)/sizeof(TCHAR));
int i=atoi(cN1);
TCHAR cN2[256];
itoa(i,cN2,2);
SetDlgItemText(hwnd,IDC_EDT2,cN2);
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnClose
void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}

CLACV2.rar (8.22 KB)

TOP

先交贺卡的作业 明天再做计算器



////////////////////////////////////////////////////////////////////////////////
//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTNSTART:
               HINSTANCE appInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
               PlaySound(TEXT("IDW_MYMUSIC"),appInstance,SND_RESOURCE|SND_ASYNC|SND_LOOP);
        break;
        case IDC_BTNSTOP:
              PlaySound(NULL,NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
        break;
        default:break;
    }
}
////////////////////////////////////////////////////////////////////////////////
早安少女组。.jpg

TOP

返回列表