1、我想用对话框的形式取得某个文件夹的路径,就像CFileDialog类似的,用那个类?好像这种东东的应用好多,我就是找不到是那个类,是不是要自己做呀?
2、我想精确比较两个double型的数据,要怎么做?

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/1279/1279902.xml?temp=.4613611
      

  2.   

    WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(
        LPBROWSEINFO lpbi
    );
      

  3.   

    这是我写的函数,调用API函数SHBrowseForFolder,不过功能比楼上说的强。
    1. 可以指定初始目录。当对话框刚刚出现时,自动选择的目录,而一般情况
    下缺省的初始目录为"我的电脑"。
    2. 在对话框的顶部,可以显示当前用户选择的目录的全路径,而一般的没有。
    实际使用时,使用下面的函数SelectFolder就可以了。由于我对MFC不熟,对
    CString的用法可能有错。如果那样的话,自己改一下就可以了。struct FolderParam
    {
        bool Inited;
        HWND TitleWnd;
        char InitPath[MAX_PATH];
    };
    #define INIT_TITLE "!@#$%^&*"int CALLBACK BrowseProc(HWND hWnd, UINT msg, LPARAM lParam, LPARAM lpData)
    {
        char buf[512];
        FolderParam* pfp;    pfp = (FolderParam*)lpData;
        if (pfp->Inited && msg==BFFM_SELCHANGED) {
            memset(buf, 0, sizeof(buf));
            SHGetPathFromIDList((LPITEMIDLIST)
                lParam, buf);
            SetWindowText(pfp->TitleWnd, buf);
        }
        else if(msg == BFFM_INITIALIZED) {
            pfp->Inited = true;
            if (pfp->InitPath[0] != 0)
                SendMessage(hWnd, BFFM_SETSELECTION,
                    TRUE, (long)pfp->InitPath);
            pfp->TitleWnd = FindWindowEx(hWnd, NULL,
                NULL, INIT_TITLE);
            SetWindowText(pfp->TitleWnd,pfp->InitPath);
        }
        return 0;
    }bool SelectFolder(HWND hWnd, CString& Path)
    {
        int  len;
        char buf[512];
        BROWSEINFO bi;
        LPMALLOC Malloc;
        FolderParam Param;
        LPITEMIDLIST pidlBrowse;   // PIDL selected by user
        LPITEMIDLIST pidlDesktop;  // PIDL for Desktop folder    if (!SUCCEEDED(SHGetMalloc(&Malloc)))
            return false;    // Get the PIDL for the Desktop folder.
        if (!SUCCEEDED(SHGetSpecialFolderLocation(
                hWnd, CSIDL_DESKTOP, &pidlDesktop))) {
            return false;
        }    Param.Inited = false;
        Param.TitleWnd = NULL;
        len = Path.GetLength();
        if (len>3 && Path[len]=='\\')
            len -= 1;
        memcpy(Param.InitPath, (LPCTSTR)
            Path, len);
        Param.InitPath[len] = 0;    bi.hwndOwner = hWnd;
        bi.pidlRoot  = pidlDesktop;
        bi.lpszTitle = INIT_TITLE;
        bi.ulFlags   = BIF_RETURNONLYFSDIRS;
        bi.lpfn      = BrowseProc;
        bi.lParam    = (long)&Param;
        bi.pszDisplayName = buf;    pidlBrowse = SHBrowseForFolder(&bi);
        if (pidlBrowse != NULL) {
            memset(buf, 0, sizeof(buf));
            Path = SHGetPathFromIDList(
                pidlBrowse,buf)?buf:"";
            Malloc->Free(pidlBrowse);
        }
        Malloc->Free(pidlDesktop);    return pidlBrowse != NULL;
    }
      

  4.   

    多谢各位!还有精确比较两个double型数据,因为在某些时候,给两个double型数据付同样的值,但两个指会不同,我希望能有个精确比较的算法!
      

  5.   

    由于浮点数不是精确的,所以不能对2个浮点数直接使用==比较。一般来说,指定精度,比如2个数相差小于“某个很小的数”时,就认为相等。如:
    #define DELT 1E-10double f1, f2;
    if (fabs(f1-f2) <= DELT)
        ; //f1 等于 f2
      

  6.   

    1。将下面的代码靠到程序中就可以用了:
    //显示选择文件夹窗口
    //参数 sFolderPath:用于返回用户选择的文件夹的路径
    //参数 sTitle:用于指定选择文件夹窗口的标题
    //返回值 :操作结果,用户取消选择或操作失败返回false,否则true
    bool BrowseForFolder(CString &sFolderPath, CString sTitle)
    {
     BROWSEINFO bi;
     char Buffer[_MAX_PATH];
     //初始化入口参数bi
     bi.hwndOwner = NULL;
     bi.pidlRoot = NULL;
     bi.pszDisplayName = Buffer;
     bi.lpszTitle = sTitle;
     bi.ulFlags = 0;
     bi.lpfn = NULL;
     LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);
     //用户取消选择
     if(!pIDList)
      return false;
     SHGetPathFromIDList(pIDList, Buffer);
     sFolderPath = Buffer;
     LPMALLOC lpMalloc;
     if(FAILED(SHGetMalloc(&lpMalloc)))
      return false;
     //释放内存
     lpMalloc->Free(pIDList);
     lpMalloc->Release();
     return true;
    }
    2。利用字符串如何?只是一个建议而已。
    char strBuf1[100] ;
    char strBuf2[100] ;
    sprintf(strBuf1,"%ld",double1) ;
    sprintf(strBuf2,"%ld",double2) ;
    if(strcmp(strBuf1,strBuf2) == 0) //下面的操作。