返回列表 发帖

【教学视频】《C语言也能干大事》第三节:文件对话框

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

教学视频录像(在线非清晰版):



如鹏电骡(verycd)下载站:http://www.verycd.com/topics/2800166/

板书:
1、作业点评:CALF的程序满足了所有要求,而且对do...whileswitch...caseC语言的语法用的很好,注意了很多细节问题。因此给100分。
2同学问题:怎么给程序添加图标
把一个ico图标放到工程下;使用ResEd在工程下新建一个资源文件(工程),然后点击【工程】→【资源】,添加一个ICON类型的资源,
文件名选择刚才的ico图标,然后保存这个资源文件,保证这个资源的ID为最小(一般设置为0就可以)。在C-Free里的OtherFiles中点右键,选择“添加文件到文件夹”,将rc文件加入,重新编译即可。

注意:有的同学反应添加图标以后程序还是没有图标,有可能是操作不当,有可能是工具的Bug。因此如果没有效果的话不要在这里浪费太多时间,因为这并不是关键点,不要在这浪费太多时间。

3结构体及指针(这部分内容具体请参考C语言的教材)
struct MyStruct
{

int f1;


int f2;

}//最常用的定义结构体的方式。
typedef int MYInt; //使用typedef定义类型别名
typedef MyStruct JSJ321Struct; //结构体别名的声明
typedef MyStruct *PMyStruct;//PMyStructMyStruct指针的声明。
typedef struct MyStruct
{

int f1;


int f2;

} JSJ321Struct;//MyStruct的定义和定义MyStruct的别名为JSJ321Struct结合到了一起。

typedef struct MyStruct
{

int f1;


int f2;

} *PMyStruct;//MyStruct的定义和定义MyStruct的指针别名PMyStruct的定义结合到了一起。

typedef struct MyStruct
{

int f1;


int f2;

} JSJ321Struct ,*PMyStruct;// MyStruct的定义和定义MyStruct的别名为JSJ321Struct以及定义MyStruct的指针别名PMyStruct的定义结合到了一起。
4最普通的结构体声明。
MyStruct s1;
5、给结构体所有字段置零
复习一下C语言中memset以及结构体的应用。C语言中声明一个结构体变量之后,在使用这个变量之前要首先用memset来把各个位清零。使用C语言内置的函数memset来完成:
memset(&s1,sizeof(s1),0);
在这里我们使用ZeroMemory“函数”,ZeroMemory其实并不是函数,看一下ZeroMemory的定义:
#define ZeroMemory RtlZeroMemoryZeroMemory其实编译的时候会宏展开为RtlZeroMemory
#define RtlZeroMemory(d,l) RtlFillMemory((d),(l),0)// RtlZeroMemory又是RtlFillMemory的一个宏定义,而且是带参数的宏定义。
#define RtlFillMemory(d,l,f) memset((d), (f), (l))
// RtlFillMemory
其实是memset的宏定义

ZeroMemory其实就是memset,纸老虎而已,不是一个全新的函数。
6、打开文件对话框的使用

OPENFILENAME ofn;


char szFile[MAX_PATH];


ZeroMemory(&ofn,sizeof(ofn));


ofn.lStructSize = sizeof(ofn);


ofn.lpstrFile = szFile;


ofn.lpstrFile[0] = TEXT('\0');


ofn.nMaxFile = sizeof(szFile);


ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0");


ofn.nFilterIndex = 1;


ofn.lpstrFileTitle = NULL;


ofn.nMaxFileTitle = 0;


ofn.lpstrInitialDir = NULL;


ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;


if (GetOpenFileName(&ofn))


{


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


}

         下面将对这段代码作解释:
1)、ZeroMemory的含义见上边
2char szFile[MAX_PATH];//定义一个长度为MAX_PATHchar数组。
MAX_PATH是系统定义的一个宏,260Windows操作系统文件路径的最大长度。
3ofn.lpstrFile = szFile;
//szFile
是一个字符数组,那么szFile这个名字就代表这个字符数组的首地址
这是一个指针的应用,把接收选择文件名的数组的地址传递到GetOpenFileName函数中。
4ofn.lpstrFile[0] = TEXT('\0');效果等价于ZeroMemory(szFile,sizeof(szFile)/sizeof(char));
5文件类型过滤器
*.*就表示所有文件
*.txt就表示所有文本文件
abc*.*就表示所有以abc开头的文件
abc*.txt就表示所有以abc开头的文本文件(txt
ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0");用“\0”分割出几个段,每两段是一组过滤器,每组的第一个段代表过滤器的显示的值,而第二段表示真正的过滤器
6ofn.nFilterIndex = 2;默认选择第几个过滤器,是1开始的,不是0.这也是试验出来的。
7windows的一个惯例:结构体的指针类型别名一般是LP+结构体的名字
GetOpenFileName(&ofn)而不是GetOpenFileName(ofn),因为GetOpenFileName函数要的是OPENFILENAME的指针
8)只要用户还没关闭对话框,那么GetOpenFileName函数是停住的,同步模式的PlaySound以及getcharscanf是一样的。
用户关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表示用户选择了文件,如果等于FALSE就表示用户选择了【取消】按钮

感觉这个第三节粗粗听了一遍后没什么感觉的微。。。呵呵,还是不怎么懂。。。看来还要听过的说。。。
未来的世界:方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要!

TOP

看了这段视频,加上上一个视频,有想做一个音乐播放器的冲动了,谢谢老师了

TOP

#include <windows.h>
#include <mmsystem.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
  OPENFILENAME ofn;
  char szFile[MAX_PATH];
  ZeroMemory(&ofn,sizeof(ofn));
  ofn.lStructSize = sizeof(ofn);
  ofn.lpstrFile = szFile;
  ofn.lpstrFile[0] = TEXT('\0');
  ofn.nMaxFile = sizeof(szFile);
  ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0");
  ofn.nFilterIndex = 1;
  ofn.lpstrFileTitle = NULL;
  ofn.nMaxFileTitle = 0;
  ofn.lpstrInitialDir = NULL;
  ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  if (GetOpenFileName(&ofn))
  {
   PlaySound(szFile,NULL,SND_FILENAME|SND_SYNC);
   MessageBox(NULL,"安确定,停止","",MB_OK);
  }
      return 0 ;

}




安这节课的方法,写了上面代码,但为什么当我用SND_SYNC模式播放时,程序播放20秒就会停止;这个模式不是要播放完才向后执行吗?
但用SND_ASYNC模式播放时,只要不安确定就能全部播放?
谢谢老师

TOP

看来老师最进很忙啊!都没时间回答我的问题

TOP

参考这篇文章:
http://www.rupeng.com/forum/thread-1328-1-2.html

工作确实比较忙,所以希望大家通过互助的方式来解决问题,而不要只是把问题发给我。我只来解答同学们互助解决不了的问题。

TOP

讲得真好,有点明白了
提醒自己   08年6月30日开始自学C

TOP

sk

觉得很不错。

TOP

#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    /* TODO: Place code here.*/
   int Res = MessageBox(NULL,TEXT(""),TEXT(""),MB_YESNO);
   if(Res == IDYES){
    OPENFILENAME ofn;
    char szFile[MAX_PATH];
    ZeroMemory(&ofn,sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile= szFile;
    ofn.lpstrFile[0] = TEXT('\0');
    ofn.nMaxFile= sizeof(ofn);
    ofn.lpstrFilter= TEXT("ALL\0*.*\0Text\0*.Txt\0");
    ofn.nFilterIndex= 1;
    ofn.lpstrFileTitle= NULL;
    ofn.nMaxFileTitle= 0;
    ofn.lpstrFileTitle = NULL;
    ofn.Flags= OFN_EXPLORER|OFN_PATHMUSTEXIST |OFN_FILEMUSTEXIST;
    if (GetOpenFileName(&ofn))
    {
        MessageBox(NULL,szFile,"",MB_OK);
    }
   }
    return 0;
}

TOP

windows 7 下怎么不能播放声音

#include <windows.h>
#include <mmsystem.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    OPENFILENAME ofn;

char szFile[MAX_PATH];

ZeroMemory(&ofn,sizeof(ofn));

ofn.lStructSize = sizeof(ofn);

ofn.lpstrFile = szFile;


ofn.lpstrFile[0] = TEXT('\0');

ofn.nMaxFile = sizeof(szFile);

ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.TXT\0Jpg\0*.jpg\0exe\0*.exe\0");

ofn.nFilterIndex = 4;

ofn.lpstrFileTitle = NULL;

ofn.nMaxFileTitle = 0;

ofn.lpstrInitialDir = NULL;

ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;


if (GetOpenFileName(&ofn))

{

MessageBox(NULL,szFile,"",MB_OK);
PlaySound(TEXT("D\\windows\\media\\windows开机.wav"),NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);

MessageBox(NULL,TEXT("这是保存文件的路径的一个程序!"),TEXT("你好"),MB_OKCANCEL|MB_ICONHAND|MB_DEFBUTTON1);

}
       
    return 0 ;
}

TOP

4ofn.lpstrFile[0] = TEXT('\0');效果等价于ZeroMemory(szFile,sizeof(szFile)/sizeof(char));
-------------------------------------------------------------------------------
ZeroMemory(szFile,sizeof(szFile)/sizeof(char)这个能不能帮忙分析一下,谢谢杨老师
不太懂这个

TOP

原帖由 xinxin99 于 2009-5-31 00:53 发表
(4)ofn.lpstrFile[0] = TEXT('\0');效果等价于ZeroMemory(szFile,sizeof(szFile)/sizeof(char));
-------------------------------------------------------------------------------
ZeroMemory(szFile,sizeof( ...

我再第一节、第二节的时候讲过。ZeroMemory就是memset的一个宏调用,就是把第一个参数指向的地址后指定长度(第二个参数)的内存置为“0”

TOP

杨老师,我跟着您的课看了下ZeroMemory -> RtlZeroMemory -> RtlZeroMemory(d,l) -> RtlFillMemory((d),(l),0) -> RtlFillMemory(d,l,f)-> memset((d), (f), (l))
这里可以看到ZeroMemory其实就是把memset的第二个和第三个形参换个位置,并且把memset的第二个形参默认定义为了0  
我又看了一下memset 它的定义是memset (void*, int, size_t)
我想了一下。如果向ZeroMemory 一样可以改变C语言里本身就有的函数那么应该很方便。所以我就想把C语言里strcat();//连接两个字符串
把它的两个形参用#define交换一下位置。那么就构造了一个与strcat();功能相反的函数了。
然后我就简单编了个程序。在TC下运行,(因为在C-FREE下虽然无错,但老弹出个警告,连正常strcat()都无法正确显示结果了)
代码如下:
#include<stdio.h>
#include<string.h>
#define repfun(b,a) strcat((a),(b))
main()
{char *a="abc",*b="xyz",*c=NULL,*d=NULL;
printf("*a=");puts(a);
printf("\n*b=");puts(b);
c=strcat(a,b);
printf("\n*c=");puts(c);
d=repfun(a,b);
printf("\n*d=");puts(d);
}
运行出来总是不能得到“*d=xyzabc”而是一些乱序的字符。老师,我的程序在哪儿有错?如果想用#define正确定义一个与strcat()功能相反
的函数应该怎么做?

TOP

memset有问题

杨老师,原文的第5点给结构体所有字段清零memset用法有问题,
函数原型为:void* memset(void *buffer,int c,size_t n),要对结构体s1清零,
memset(&s1, 0, sizeof(s1))。

TOP

呃,我也看到了这个错误了。

例如:

memset( the_array, '\0', sizeof(the_array) );
这是将一个数组的所以分量设置成零的很便捷的方法。

TOP

to ccccccc2003:
请注意strcat(str1,str2)函数的功能为:函数将字符串str2 连接到str1的末端,并返回指针str1.
那么str1就不能是字符串常量或是指向字符串常量的指针。


修改成下面这样的代码即可运行:
#define repfun(b,a) strcat((a),(b))
main()
{
    char a[10]="abc",b[10]="xyz",*c;
    printf("a=");
    puts(a);
    printf("\nb=");
    puts(b);
    c=strcat(a,b);
    printf("\nc=");
    puts(c);
    //此时a已经不是原来的值了。
repfun(a,b);
    printf("\nb=");
    puts(b);
}

TOP

to cjnt007

原帖由 cjnt007 于 2009-6-11 12:59 发表
to ccccccc2003:
请注意strcat(str1,str2)函数的功能为:函数将字符串str2 连接到str1的末端,并返回指针str1.
那么str1就不能是字符串常量或是指向字符串常量的指针。


修改成下面这样的代码即可运行:
#def ...

是的哦,我没注意到那个a的值已经改变了,我还想问一下,有什么办法才能使调用完strcat();后仍然能保持原先的两个字符串的原值。使调用完repfun();后得到期望的d=xyzabc;
而且我的那个代码,在C-FREE中老弹出个错误对话框,我不知道为什么哦~
希望能拥有像令狐冲一样的人生~

TOP

原帖由 wuxiong2008 于 2009-6-10 20:13 发表
杨老师,原文的第5点给结构体所有字段清零memset用法有问题,
函数原型为:void* memset(void *buffer,int c,size_t n),要对结构体s1清零,
用memset(&s1, 0, sizeof(s1))。
确实是这样啊,后两个参数弄反了

TOP

帮你把代码修改如下,其中使用数组c和d来获取a和b的值,这样就可以不影响到原来的字符串了。

#include<stdio.h>
#include<string.h>
#define repfun(b,a) strcat((a),(b))
main()
{
    char a[10]="abc",b[10]="xyz",c[10],d[10];
    printf("a=%s",a);
    printf("\nb=%s",b);
    strcpy(c,a); /*将a中值复制到c中,这样a中的值就不会有影响了*/
    strcat(c,b); /*将b中值连接到c中*/
    printf("\nc=%s",c);

    strcpy(d,b);/*这里其实可以将d换成c,从而省掉一个数组d*/
    repfun(a,d);
    printf("\nd=%s",d);
    getch();
}

你在c-free中出错,请给出出错信息才好帮你判断。

TOP

原帖由 cjnt007 于 2009-6-11 20:01 发表
帮你把代码修改如下,其中使用数组c和d来获取a和b的值,这样就可以不影响到原来的字符串了。

#include
#include
#define repfun(b,a) strcat((a),(b))
main()
{
    char a[10]="abc",b[10]="xyz",c[10],d[1 ...

谢谢你,麻烦你再帮我看下,这个错误。。。主要是程序连c都不输出了,很想不通。
错误信息在底下的附件里。

error.rar (16.22 KB)

错误信息

希望能拥有像令狐冲一样的人生~

TOP

为何有的人能看见来自哪里,有的人却看不见?

为何有的人能看见来自哪里,有的人却看不见呢?

TOP

利用这一节的知识,改进了一下前面的恶搞程序

还很粗糙,附件里有

好人测试.rar (54.14 KB)

点击进入我的博客www.bigworld.phost.ws
我自己建的VC win32以及Python学习qq群:87696830我的博客,正在建设丰富,我希望能给大家提供原创的技术知识,并且可以结交到鹏友。点击进入我的博客

TOP

提问

ZeroMemory(szFile,sizeof(szFile)/sizeof(char));
这个用法没错吗?
不太理解为什么要除sizeof(char)

TOP

原帖由 meizhishang 于 2009-6-21 12:00 发表
ZeroMemory(szFile,sizeof(szFile)/sizeof(char));
这个用法没错吗?
不太理解为什么要除sizeof(char)

-----这里应该是不需要除的!杨老师好像说过了.....

TOP

thanks

原帖由 xinxin99 于 2009-6-21 19:41 发表

-----这里应该是不需要除的!杨老师好像说过了.....

哦,谢谢了

TOP

xiexie

谢谢     老师 辛苦了

TOP

除就是求字符(元素)数,不除就是字节数

TOP

#include <windows.h>
#include <mmsystem.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PTSTR szCmdLine,int iCmdShow)
{
OPENFILENAME ofn;
char szFile[MAX_PATH];
ZeroMemory(&ofn,sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;

ofn.lpstrFile[0] = TEXT('\0');
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("ALL\0*.*\0WAV\0*.WAV\0");
ofn.nFilterIndex = 2;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

if (GetOpenFileName(&ofn))
{
MessageBox(NULL,szFile,"",MB_OK);
}
PlaySound(szFile,NULL,SND_FILENAME | SND_ASYNC |SND_LOOP);
MessageBox(NULL,TEXT("点击确定退出播放"),TEXT("退出播放"),MB_OK);
return 0;
}

TOP

发一个判断打开的是否是WAV格式的程序 呵呵


  1. #include<windows.h>
  2. #include<string.h>
  3. #include<mmsystem.h>
  4. int WINAPI WinMain(HINSTANCE hInstance/*句柄*/,HINSTANCE hPrevinstance/*值永远都NULL*/,
  5.        PSTR szCmdline/*(启动程序)命令行参数*/,int iCmdShow/*以什么方式启动*/)
  6. {
  7.        OPENFILENAME ofn;

  8.        char szFile[MAX_PATH];//用来存Windows操作系统最大文件路径的长度

  9.        ZeroMemory(&ofn,sizeof(ofn));

  10.        ofn.lStructSize = sizeof(ofn);//遗传下来的,将结构体的字节保存到lStructSize里,用来判断系统是哪个版本

  11.        ofn.lpstrFile = szFile;


  12.        ofn.lpstrFile[0] = TEXT('\0');
  13.       
  14.        ofn.nMaxFile = sizeof(szFile);

  15.        ofn.lpstrFilter = TEXT("ALL\0*.*\0Text\0*.*\0");

  16.        ofn.nFilterIndex = 1;
  17.       
  18.        ofn.lpstrFileTitle = NULL;

  19.        ofn.nMaxFileTitle = 0;
  20.        ofn.lpstrInitialDir = NULL;

  21.        ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;


  22.        while (GetOpenFileName(&ofn))

  23.        {
  24.               if(strcmp(szFile+strlen(szFile)-3,"wav")==0)
  25.               {
  26.                      PlaySound(TEXT(szFile),NULL,SND_FILENAME|SND_ASYNC);
  27.                      MessageBox(NULL,szFile,"打开成功",MB_OK);
  28.                      break;
  29.               }
  30.               else
  31.               {
  32.                      int r=MessageBox(NULL,szFile,"打开失败",MB_RETRYCANCEL|MB_ICONEXCLAMATION);
  33.                      if(r==IDRETRY)
  34.                      {
  35.                             continue;
  36.                      }
  37.                      else
  38.                      {
  39.                             break;
  40.                      }
  41.               }

  42.        }

  43.       
  44.        return 0;     
  45. }
复制代码

TOP

版主帮我修改下

上面程序的strcmp修改成lstrcmp  谢谢 搞错了。
坚持就是胜利~~~~~

TOP

返回列表