2011年12月29日木曜日

スピンコントロールで浮動小数点の取り扱い

ダイアログでエディットボックスとスピンコントロールを作る際に、
スピンコントロールのSet Buddy IntegerをFalseにしないといけない。

これを忘れると、関連付けたエディットボックスがスピンコントロールのInt型で扱われるため、
浮動小数点にならないの注意。

あとは

     float value;
     m_xcSpin.SetPos32( value*10 );

とか
     float value = m_xcSpin.GetPos32();

とか使えば大丈夫。

2011年12月17日土曜日

輪郭の処理

参考: http://imagingsolution.blog107.fc2.com/blog-entry-202.html

パスからファイル名の取得

MFCのコードを書いておく。

ユニコードなので、wcharからcharヘの変換とかしてる。


CString filename = PathFindFileName(CString string);
を使ってる。

または,分解・結合可能。


// 分解
char drive[8], dir[256], filename[256],ext[8];
_splitpath(str.c_str(), drive, dir, filename, ext);

// 結合
char dirpath[256];
_makepath(dirpath, drive, dir,NULL,NULL);




void CMainFrame::OnOpenFile()
{
CString         filter("JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg|| BMP files (*.bmp)| *.bmp||");
CString         filePath, strBuf;
CString filename;
    POSITION        pos = NULL;
    CFileDialog     selDlg(TRUE, NULL, NULL,  OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, filter);
   
    int             err = 0, lbErr = 0;
   
vector<char*> filenames;


    // ファイル名リスト用メモリ確保
    if (!err)
    {
        try
        {
            selDlg.GetOFN().lpstrFile = strBuf.GetBuffer(MAX_PATH *100);
            selDlg.GetOFN().nMaxFile = MAX_PATH *100;
        }
        catch (...) {err = 1;}
    }
    if (!err) if (selDlg.DoModal() != IDOK) err = 1;
    if (!err) if ((pos = selDlg.GetStartPosition()) == NULL) err = 1;
    if (!err)
    {
        while (pos)
        {
            filePath = selDlg.GetNextPathName(pos);

            if (!err)
            {

_bstr_t bSrc(filePath);
char tmp_filepath[256];
//strcpy(m_pathname, sizeof(m_pathname), pathname);
//int len = WideCharToMultiByte(CP_UTF8, 0, bSrc, -1, NULL, 0,NULL,NULL);
WideCharToMultiByte(CP_UTF8, 0, bSrc, -1, tmp_filepath, sizeof(tmp_filepath), NULL, NULL);
string str = tmp_filepath;
m_fullpathes.push_back(str);

// ファイル名のみ抽出する
CString Filename = PathFindFileName(filePath);

_bstr_t bSrc_filename(Filename);
char tmp_filename[256];
////strcpy(m_pathname, sizeof(m_pathname), pathname);
////int len = WideCharToMultiByte(CP_UTF8, 0, bSrc, -1, NULL, 0,NULL,NULL);
WideCharToMultiByte(CP_UTF8, 0, bSrc_filename, -1, tmp_filename, sizeof(tmp_filename), NULL, NULL);
string str_filename = tmp_filename;
m_filenames.push_back(str_filename);

            }
            if (err) break;
        }
        UpdateData(FALSE);
    }
   

UpdateData(false);
}