新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 用Mixer API函数调节控制面板的音频设置 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 9349 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 用Mixer API函数调节控制面板的音频设置 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 用Mixer API函数调节控制面板的音频设置

    摘要:本文通过实例代码演示了如何通过Mixer API函数在程序中调节控制面板的音频设备性能的设置。

      关键词:Mixer函数,控制面板,音频设备调节

      如果你用过windows的音频设备,比如播放音乐或者录音,聊天,调节麦克或者声音的大小,以及设置静音,都可以通过控制面板中的音频设置面板来调节,你对于下面的两个设置面板肯定不陌生。

      播放时调节音量大小和左右声道的控制板,还可以通过它将某个设备设置为静音。

    按此在新窗口浏览图片
    图1

      另一个就是录音时控制面板,在这里我们可以选择声音输入设备,以及调节录音时左右声道音量大小

    按此在新窗口浏览图片
    图2

      这两个控制板是windows提供给我们的,这两个控制板是让windows用户在播放声音或者录音时莱调节音频设备的,通过这两个控制板,我们可以选择播放或者录音的音频设备,设置音量的大小,调整左右声道。但是如果我们自己开发的程序中也要用到这个功能该怎么办,比如你开发的程序想给用户提供一个调节音频设备的界面,可以让用户很方便的通过你的程序提供的功能来调节和选择相应的音频设备,而不是每次都要转到系统的控制面板中来调节它们,当用户通过我们提供的接口对设备进行的调整,在系统的控制面板中的音频设备设置要相应的发生改变,并且当用户通过系统控制面板调整音频设置后,在我们程序的界面上也会发生相应的改变。我最近在开发过程中就遇到这个问题,通过仔细的查阅msdn以及其他的资料,终于解决了这个问题,下面我将我的经验总结一下,如果你也遇到相类似的问题,希望能对你有所帮助。

      如何来控制系统中任何的音频输出和输入,比如波形音频,MIDI ,CD音频,合成语音等音频输出以及Line in ,麦克等输入,windows给我们提供了一组API接口函数,称为Mixer系列的函数,mixer也称为混音器,通过混音器可以实现混音和音量控制。最基本的混音器结构单元是音频线路,比如microphone ,line in ,cd,midi等都是一个音频线路。音频线路包含一个或者多个发源于单一音源或系统资源的声道,例如,一个立体声音频线路有两个声道,但仍然被看成是一个音频线路,因为它发源于一个音源。

      下面我要先简单的介绍一下Mixer函数,其实反正总共也没有几个,使用起来很简单的。

      mixerOpen
      mixerClose
      mixerGetDevCaps
      mixerGetLineControls
      mixerGetLineInfo
      mixerGetControlDetails
      mixerSetControlDetails
      mixerGetID
      mixerGetNumDevs

      看到了吧,就这么简单的几个函数,通过这9个API,我们就可以来控制音频的输入和输出设备了,其实有关这几个函数的定义你可以在C:\Program Files\Microsoft Visual Studio\VC98\Include\mmsystem.h文件中找到。下面我简单介绍一下这几个函数,详细地介绍你可以参见msdn。

      mixerOpen和mixerClose函数用来打开和关闭混音器设备

      mixerGetNumDevs可以确定系统中有多少混音器设备

      mixerGetDevCaps函数可以确定混音器设备的能力

      mixerGetLineInfo可以检索指定音频线路的信息

      mixerGetLineControls用于检索一个或者多个与音频线路相关的控制的通用信息

      mixerGetControlDetails用于检索与某个音频线路相关的一个控制的属性

      mixerSetControlDetails用于设置制定控制的属性。

      其实我们主要用到的就是后面的四个函数,希望大家重点研究一下。混音器还提供了窗口回调服务,用户在调用mixeropen的时候,可以将一个窗口句柄作为参数传递给mixer,这样,当mixer设备发生变化时就会给回调窗口发送消息通知,比如用户通过控制面板调整了音量的大小,或者选择了某个录音设备。消息的类型就两个MM_MIXM_LINE_CHANGE和MM_MIXM_CONTROL_CHANGE。

      下面就不多说了,我用一个例子告诉你如何在程序中对音频设备进行设置,先看看我提供的例子的界面

    按此在新窗口浏览图片
    图3

      这里播放和录音我都只是选择了几个常用的设备,当然系统提供的设备比我这里的举例用到的设备要多,你可以根据我提供的方法来对其他的设备进行控制。还有说明一下,具有两个滑动条的表示左右声道。但是像麦克风只有一个声道。

      通过我们的程序界面我们就可以像在控制面板里一样可以调节左右声道的音量,以及选择某个设备进行录音,或者对某个音频线路进行静音,相应的系统的设置也会被改变,如果你通过系统的控制面板进行设置,在我们的程序界面也上同步的可以反映出来变化。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/20 9:50:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客2
    发贴心情 
    关于工程的建立我就不多少了,很简单的,就是一个基于对话框的工程,上面放了一些控件。下面我主要讲一下每个功能是如何实现的。主要有三个功能1 如何调整左右声道音量的大小,2 如何将某个设备静音,3 如何选择录音设备。

      这里关于mixer函数的用法还要先唠叨几句。一般来说,对音频线路的操作流程如下:

      1、通过GetLineInfo获取指定音频线路的信息,返回一个MIXERLINE结构

      2、然后通过GetLineControl获取音频线路相关的控制的通用信息,通过MIXERCONTROL结构返回。

      3、通过GetConrolDetails获取指定控制的属性值

      4、通过SetControlDetails设置指定控制的属性值,

      对于每个线路设备,mixer都用一个类型值来标示,比如:

      Volume对应的值 MIXERLINE_COMPONENTTYPE_DST_SPEAKERS

      CD 对于的值 MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC

      Midi对应的值为 MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER

      Wave对应的值为 MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT

      Line in对应的值为 MIXERLINE_COMPONENTTYPE_SRC_LINE

      Microphone对应的值为 MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE

      我们可以通过音频线路的类型值获得相应的线路的信息,也可以通过音频线路的设备ID来获取相应的线路的信息。

      下面开始我们编程吧。

      首先定义三个变量

    UINT m_uMxId; //mixer的ID
    HWND m_hWnd; //回调窗口句柄
    HMIXER m_hmx; //

      然后就是要打开mixer,可以在对话的初始化中作这些工作。

    #define MAX_VOL_VALUE 65535
    if (MMSYSERR_NOERROR != mixerOpen(&m_hmx, m_uMxId,(DWORD)m_hWnd, 0, CALLBACK_WINDOW))
    {
     return FALSE;
    }
    if (MMSYSERR_NOERROR == mixerGetID((HMIXEROBJ)m_hmx, &m_uMxId, MIXER_OBJECTF_HMIXER))
    {
     return m_uMxId;
    }
    //设置Volume的滑动条的范围这里只以Volume为例。
    m_SliderWaveL.SetRange(0, MAX_VOL_VALUE, TRUE);
    m_SliderWaveR.SetRange(0, MAX_VOL_VALUE, TRUE);

      接着我先演示一下如何获取和设置录音设备的左右声道的音量值,以及如何静音放音设备,这里以Volume为例,其他的设备类似,你可以照着我的代码,套用即可。

      1、如何获取Volume设备的音量大小

    DWORD dwLValue;
    DWORD dwRValue;
    GetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, &dwLValue,&dwRValue);
    //GetVolume函数的定义见下面,然后根据返回的值调整滑动条的位置
    m_SliderVolR.SetPos(MAX_VOL_VALUE - dwLValue);
    m_SliderVolL.SetPos(MAX_VOL_VALUE - dwRValue);

      2、如何根据滑动条的位置来调整系统音量的大小

    void CMixerControlDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
     // m_dwSpkR和m_dwSpkL是用来记录Volume左右声道的音量值,0~~65535
     CSliderCtrl *pSlider = (CSliderCtrl *)pScrollBar;
     int nValue = MAX_VOL_VALUE - pSlider->GetPos(); //获取滑动条的位置pos
     else if (m_SliderVolR.m_hWnd == pSlider->m_hWnd)
     {
      //如果拖动的是Volume的左声道
      m_dwSpkR = nValue;
      // 设置Volume的音量值
      SetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, m_dwSpkL, m_dwSpkR);
     }
     else if (m_SliderVolL.m_hWnd == pSlider->m_hWnd)
     {
      //Volume右声道
      m_dwSpkL = nValue;
      // 设置Volume的音量值
      SetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, m_dwSpkL, m_dwSpkR);
     }
     //其他音频线路可以依次类推在下面添加
    }

      GetVolume和SetVolume函数的定义下面给出

    BOOL CMixer::SetVolume(DWORD dwSrcType, DWORD dwLValue, DWORD dwRValue, BOOL bMono)
    {
     MIXERLINE mxl;
     if (! GetLineInfo(&mxl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dwSrcType))
      return FALSE;

     MIXERCONTROL mxc;
     if (! GetLineControl(&mxc, &mxl, MIXERCONTROL_CONTROLTYPE_VOLUME))
      return FALSE;

     MIXERCONTROLDETAILS mxcd;
     MIXERCONTROLDETAILS_UNSIGNED mxcd_u1;
     MIXERCONTROLDETAILS_UNSIGNED mxcd_u[2];

     mxcd.cbStruct = sizeof(mxcd);
     mxcd.dwControlID = mxc.dwControlID;
     mxcd.cMultipleItems = 0;

     if (bMono)
     {
      mxcd.cChannels = 1;
      mxcd.cbDetails = sizeof(mxcd_u1);
      mxcd.paDetails = &mxcd_u1;
      mxcd_u1.dwValue = dwLValue;
     }
     else
     {
      mxcd.cChannels = mxl.cChannels;
      mxcd.cbDetails = sizeof(*mxcd_u);
      mxcd.paDetails = mxcd_u;
      mxcd_u[0].dwValue = dwLValue;
      mxcd_u[1].dwValue = dwRValue;
     }

     if (! SetControlDetails(&mxcd, MIXER_OBJECTF_MIXER))
      return FALSE;

     return TRUE;
    }

    BOOL CMixer::GetVolume(DWORD dwSrcType, DWORD* pdwLValue, DWORD* pdwRValue, BOOL bMono)
    {
     MIXERLINE mxl;
     if (! GetLineInfo(&mxl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dwSrcType))
      return FALSE;

     MIXERCONTROL mxc;
     if (! GetLineControl(&mxc, &mxl, MIXERCONTROL_CONTROLTYPE_VOLUME))
      return FALSE;

     MIXERCONTROLDETAILS mxcd;
     MIXERCONTROLDETAILS_UNSIGNED mxcd_u1;
     MIXERCONTROLDETAILS_UNSIGNED mxcd_u[2];

     mxcd.cbStruct = sizeof(mxcd);
     mxcd.dwControlID = mxc.dwControlID;
     mxcd.cMultipleItems = 0;

     if (bMono)
     {
      mxcd.cChannels = 1;
      mxcd.cbDetails = sizeof(mxcd_u1);
      mxcd.paDetails = &mxcd_u1;

      if (! GetControlDetails(&mxcd, MIXER_GETCONTROLDETAILSF_VALUE))
       return FALSE;

      *pdwLValue = mxcd_u1.dwValue;
     }
     else
     {
      mxcd.cChannels = mxl.cChannels;
      mxcd.cbDetails = sizeof(*mxcd_u);
      mxcd.paDetails = mxcd_u;

      if (! GetControlDetails(&mxcd, MIXER_GETCONTROLDETAILSF_VALUE))
       return FALSE;

      *pdwLValue = mxcd_u[0].dwValue;
      *pdwRValue = mxcd_u[1].dwValue;
     }
     return TRUE;
    }


    BOOL GetLineInfo(LPMIXERLINE pmxl, DWORD dwDstType, DWORD dwSrcType)
    {
     MIXERCAPS mxcaps;
     if (! GetDevCaps(&mxcaps))
      return FALSE;

     UINT u=0;
     do
     {
      pmxl->cbStruct = sizeof(*pmxl);
      pmxl->dwDestination = u;
      u++;
      if (MMSYSERR_NOERROR != mixerGetLineControls((HMIXEROBJ)m_uMxId, pmxl, MIXER_GETLINEINFOF_DESTINATION))
      {
       return FALSE;
      }

     } while ((u < mxcaps.cDestinations) && (pmxl->dwComponentType != dwDstType));

     if (u > mxcaps.cDestinations)
      return FALSE;

     if (dwDstType == dwSrcType)
      return TRUE;

     pmxl->dwDestination = u;
     UINT cConnections = (UINT)pmxl->cConnections;

     UINT v=0;
     u--;
     do
     {
      pmxl->cbStruct = sizeof(*pmxl);
      pmxl->dwDestination = u;
      pmxl->dwSource = v;
      v++;

      if (MMSYSERR_NOERROR != mixerGetLineControls((HMIXEROBJ)m_uMxId, pmxl, MIXER_GETLINEINFOF_SOURCE))
      {
       return FALSE;
      }
     } while ((v < cConnections) && (pmxl->dwComponentType != dwSrcType));

     if((v > cConnections) || (pmxl->dwComponentType !=dwSrcType))
      return FALSE;

     return TRUE;
    }

    BOOL GetLineControl(LPMIXERCONTROL pmxc, LPMIXERLINE pmxl, DWORD dwType)
    {
     LPMIXERCONTROL pamxctrl;
     DWORD cbmxctrls = sizeof(*pamxctrl) * (UINT)pmxl->cControls;
     pamxctrl = (LPMIXERCONTROL)LocalAlloc(LPTR, cbmxctrls);

     MIXERLINECONTROLS mxlc;
     mxlc.cbStruct = sizeof(mxlc);
     mxlc.dwLineID = pmxl->dwLineID;
     mxlc.dwControlType = dwType;
     mxlc.cControls = pmxl->cControls;
     mxlc.cbmxctrl = sizeof(*pamxctrl);
     mxlc.pamxctrl = pamxctrl;

     if (MMSYSERR_NOERROR != mixerGetControlDetails((HMIXEROBJ)m_uMxId, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE))
     {
      return FALSE;
     }
     memcpy(pmxc, pamxctrl, sizeof(*pamxctrl));
     LocalFree(pamxctrl);
     return TRUE;
    }

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/20 9:50:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客3
    发贴心情 
    3、下面演示一下如何设置Volume设备的静音

      这里提供了两个函数,GetMute用来获取系统设置中是否对某个音频线路进行了静音操作,SetMute是用来对系统的某个音频线路进行静音操作。

    BOOL CMixer::SetMute(DWORD dwSrcType, BOOL bValue)
    {
     MIXERLINE mxl;
     if (! GetLineInfo(&mxl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dwSrcType))
      return FALSE;

     MIXERCONTROL mxc;
     if (! GetLineControl(&mxc, &mxl, MIXERCONTROL_CONTROLTYPE_MUTE))
      return FALSE;

     MIXERCONTROLDETAILS mxcd;
     MIXERCONTROLDETAILS_BOOLEAN mxcd_f;

     mxcd.cbStruct = sizeof(mxcd);
     mxcd.dwControlID = mxc.dwControlID;
     mxcd.cChannels = 1;
     mxcd.cMultipleItems = 0;
     mxcd.cbDetails = sizeof(mxcd_f);
     mxcd.paDetails = &mxcd_f;
     
     mxcd_f.fValue = bValue;

     if (! SetControlDetails(&mxcd, MIXER_OBJECTF_MIXER))
      return FALSE;

     return TRUE;
    }

    BOOL CMixer::GetMute(DWORD dwSrcType, BOOL* pbValue)
    {
     MIXERLINE mxl;
     if (! GetLineInfo(&mxl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dwSrcType))
      return FALSE;

     MIXERCONTROL mxc;
     if (! GetLineControl(&mxc, &mxl, MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT ))
      return FALSE;

     MIXERCONTROLDETAILS mxcd;
     MIXERCONTROLDETAILS_BOOLEAN mxcd_f;

     mxcd.cbStruct = sizeof(mxcd);
     mxcd.dwControlID = mxc.dwControlID;
     mxcd.cChannels = 1;
     mxcd.cMultipleItems = 0;
     mxcd.cbDetails = sizeof(mxcd_f);
     mxcd.paDetails = &mxcd_f;

     if (! GetControlDetails(&mxcd, MIXER_GETCONTROLDETAILSF_VALUE))
      return FALSE;

     *pbValue = mxcd_f.fValue;

     return TRUE;
    }

      如果用这两个函数呢,下面我演示了如何设置和获取Volume音频线路的静音操作。

    BOOL bValue = TRUE;
    SetMute(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, bValue);
    GetMute(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, &bValue);

      4、下面看看当系统的设置改变时,mixer是如何通知我们的吧。

      还记得我前面讲过的,当我们调用mixeropen时可以传递一个窗口的句柄作为回调窗口,当系统的设置改变,比如音量改变,某个音频线路被静音时,mixer都会给我们的回调窗口发送消息的。

      一般只有两个消息,如下

    afx_msg void OnMLChange(WPARAM wParam, LPARAM lParam);
    afx_msg void OnMCChange(WPARAM wParam, LPARAM lParam);

    ON_MESSAGE(MM_MIXM_LINE_CHANGE, OnMLChange)
    ON_MESSAGE(MM_MIXM_CONTROL_CHANGE, OnMCChange)

      其中MM_MIXM_CONTROL_CHANGE 消息中,发送消息的两个参数代表的意思如下

    wParam = (WPARAM) hMixer
    lParam = (LPARAM) dwControlID

      在MM_MIXM_LINE_CHANGE 消息中,发送消息的参数代表的意思如下

    wParam = (WPARAM) hMixer
    lParam = (LPARAM) dwLineID

      在我们的应用程序中,我们可以在这两个消息处理函数中调整我们的设置,以对应于系统的改变,比如你的代码可以这样写:

    void CMixerControlDlg::OnMCChange(WPARAM wParam, LPARAM lParam)
    {
     DWORD dwLValue;
     DWORD dwRValue;
     GetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, &dwLValue,&dwRValue);
     //GetVolume函数的定义见下面,然后根据返回的值调整滑动条的位置
     m_SliderVolR.SetPos(MAX_VOL_VALUE - dwLValue);
     m_SliderVolL.SetPos(MAX_VOL_VALUE - dwRValue);
     //你也可以在这里调用GetMute查看Volume是否被静音,
    }

      如此你的程序就可以自动的响应系统设置的改变了。

      关于mixer API的应用开发就介绍到这里,记着最后要关闭mixer如此:mixerClose(m_hmx);

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/11/20 9:51:00
     
     一分之千 帅哥哟,离线,有人找我吗?射手座1984-11-30
      
      
      威望:1
      等级:研一(随老板参加了WWW大会还和Tim Berners-Lee合了影^_^)
      文章:632
      积分:4379
      门派:XML.ORG.CN
      注册:2006/12/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给一分之千发送一个短消息 把一分之千加入好友 查看一分之千的个人资料 搜索一分之千在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看一分之千的博客4
    发贴心情 
    挺不错,多谢分享~~~

    ----------------------------------------------
    越学越无知

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/1 9:35:00
     
     iadun 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:68
      门派:XML.ORG.CN
      注册:2007/12/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给iadun发送一个短消息 把iadun加入好友 查看iadun的个人资料 搜索iadun在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看iadun的博客5
    发贴心情 
    bucuo xiexie
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/31 20:25:00
     
     wujiandong 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:60
      门派:XML.ORG.CN
      注册:2008/4/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wujiandong发送一个短消息 把wujiandong加入好友 查看wujiandong的个人资料 搜索wujiandong在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wujiandong的博客6
    发贴心情 
    请问能不能用C#写呢,如果能该怎么写~
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/30 8:50:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客7
    发贴心情 
    相关函数查MSDN转换了就可以了,和这个差不了多少的。

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/30 15:40:00
     
     wujiandong 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:60
      门派:XML.ORG.CN
      注册:2008/4/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wujiandong发送一个短消息 把wujiandong加入好友 查看wujiandong的个人资料 搜索wujiandong在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wujiandong的博客8
    发贴心情 我不怎么看明白
    我不怎么看明白,能不能简单点写下,让我看看呢,谢谢啊~我有急用~
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/30 22:31:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 4:03:15

    本主题贴数8,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    110.352ms