nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

MFCで、ファイル選択ダイアログを学習する [MFC]

MFCで、ファイル選択ダイアログを学習します。 開発環境は、Visual Studio 2015 Communityです。

■単一選択ダイアログと複数選択ダイアログを作成します。

(1) ダイアログベースでプロジェクトを作成し、次のようなダイアログを作成します。 f:id:nprogram:20170612195351p:plain

(2) エディットボックスには、m_xvEditFileの変数を追加します。

f:id:nprogram:20170612194332p:plain

(3) リストボックスには、m_xcListFileの変数を追加します。 f:id:nprogram:20170612200648p:plain

(4) ボタンには、それぞれ、ボタンクリックイベントハンドラを追加します。

単一ファイル参照用のイベントハンドラメソッドには、以下のように記載してください。

void CFileSelectDialogsDlg::OnBnClickedButton1()
{
    CString         filter("JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg||");
    CFileDialog     selDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);

    if (selDlg.DoModal() == IDOK)
    {
        m_xcListFile= selDlg.GetPathName();
        UpdateData(FALSE);
    }

    return;
}

複数ファイル参照用のイベントハンドラメソッドには、以下のように記載してください。

void CFileSelectDialogsDlg::OnBnClickedButton2()
{
    CString         filter("JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg||");
    CString         filePath, strBuf;
    POSITION        pos = NULL;
    CFileDialog     selDlg(TRUE, NULL, NULL,
        OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT, filter);
    int             err = 0, lbErr = 0;

    // ファイル名リスト用メモリ確保
    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)
            {
                lbErr = m_xcListFile.InsertString(-1, filePath);
                if (lbErr == LB_ERR || lbErr == LB_ERRSPACE) err = 1;
            }
            if (err) break;
        }
        UpdateData(FALSE);
    }
    strBuf.ReleaseBuffer();

    return;
}

以下のように、表示されれば、成功です。

<単一ファイル参照用のダイアログボックス表示>

f:id:nprogram:20170612201325p:plain

<複数ファイル参照用のダイアログボックス表示>

f:id:nprogram:20170612201416p:plain

<ファイル参照結果> f:id:nprogram:20170612201538p:plain

■本ページの記載は、以下のホームページを参考にしました。 ありがとうございます。

http://www.g-ishihara.com/mfc_cd_01.htm

■CFileDialog クラスのドキュメントは、以下でCFileDialogで、検索してください。

https://msdn.microsoft.com/ja-jp/library/

簡単なMFCアプリケーションの作成方法 [MFC]

MFCアプリケーションの学習をする必要が発生したため、記録します。

開発環境は、Visual Studio Community 2015です。

まずは、プロジェクト作成方法です。

ファイル⇒プロジェクトを選択し、MFCアプリケーションを選択します。プロジェクト名は、わかりにくくて、申し訳ないのですが、MFCApplication2としました。

f:id:nprogram:20170612105640p:plain

アプリケーションの種類で、ダイアログベースを選択してください。

f:id:nprogram:20170612105706p:plain

あと、そのまま、デフォルト設定でOKボタンを押します。

プロジェクト作成が完了すると、次のような画面が表示されます。

f:id:nprogram:20170612110300p:plain

■ PlaySound関数を用いた音楽再生サンプルアプリケーションを作成します。

・PlaySound関数を用いた簡単な音楽再生アプリケーションを作成します。 ただし、このアプリケーションは、wavファイルしか再生できず、また、音楽の途中からは再生できません。(泣)

■プログラム表示イメージ f:id:nprogram:20170612104610p:plain

(1) ソリューションエクスプローラーから、リソースファイルを選択します。

f:id:nprogram:20170612110608p:plain

(2) リソースビューが開かれるので、DIALOGをダブルクリックします。

f:id:nprogram:20170612110733p:plain

(3) 次のような画面が開かれます。

f:id:nprogram:20170612111309p:plain

(4) 上記画面左のツールボックスを選択して、Edit Controlを選択して、ダイアログにドラック・アンド・ドロップします。

f:id:nprogram:20170612111509p:plain

(5) 画面にファイルダイアログを開くボタンを追加します。 ツールボックスで、Buttonを選択して、変数の追加を選択します。

f:id:nprogram:20170612111810p:plain

(6) メンバー変数の追加ウィザードは次のようにします。カテゴリはValueにしてください。

f:id:nprogram:20170612113035p:plain

(7) Visual Studioの画面右下のプロパティウィンドウのCaptionに...を入力します。

f:id:nprogram:20170612113218p:plain

(8) プロパティウィンドウの管理イベント(電撃マークみたいなアイコン)を選択してください。

f:id:nprogram:20170612113851p:plain

MFCApplication2Dlg.cppファイルにイベントハンドラメソッドが追加されるため、以下のようにコードを記載します。

void CMFCApplication2Dlg::OnBnClickedButton1()
{
    CFileDialog dlg(
        TRUE,       // FileOpen
        L".wav",
        L"",
        0,
        L"WAVファイル (*.wav)|*.wav|All Files (*.*)|*.*||",
        this);

    if (dlg.DoModal() == IDOK)
    {
        m_strFilePath = dlg.GetPathName();
        UpdateData(FALSE);
    }
}

(9) 一度、アプリケーションを実行しましょう。ビルドして、実行しましょう。...ボタンを押して、ダイアログが開かれることを確認してください。

f:id:nprogram:20170612114535p:plain

(10) 次に、再生ボタンと停止ボタンを画面に追加します。 リソースビューから、ツールボックスを選択して、Buttonを二つダイアログ上にドラック・アンド・ドロップします。 Buttonの表示文字列をプロパティウィンドウからPlay````とStop```に変更してください。

f:id:nprogram:20170612115027p:plain

(11) ```Play````のボタンを選択して、ボタンをクリックしたときのイベントハンドラメソッドを追加し、以下のように記載します。 音楽を再生するのに、PlaySound関数を用います。

void CMFCApplication2Dlg::OnBnClickedButton2()
{
    PlaySound(m_strFilePath, NULL, 0); // 非同期ではない処理
}

(12) 同様に、```Stop````のボタンを選択して、ボタンをクリックしたときのイベントハンドラメソッドを追加し、以下のように記載します。

void CMFCApplication2Dlg::OnBnClickedButton3()
{
    PlaySound(NULL, NULL, 0);
}

(13) PlaySound関数を使うには、mmsystem.hのヘッダファイルをインクルードし、winmm.libをリンクする必要があります。stdafx.h````に、インクルード文#include <mmsystem.h>```を追加してください。

f:id:nprogram:20170612120717p:plain

プロジェクトを右クリックして、プロジェクトのプロパティページを開いて、構成プロパティ⇒リンカーから、追加の依存ファイルにwinmm.libを記載します。 f:id:nprogram:20170612121622p:plain

(14) アプリケーションを実行しましょう。wavファイルをファイル選択ボタンから開き、再生ボタンを押して、音楽が再生されることを確認してください。 音楽は、再生できるようになりましたが、他のボタンを押すことができません。PlaySound関数が非同期処理になっていないためです。

f:id:nprogram:20170612121921p:plain

そこで、次のように、PlaySound関数の呼び出し方を修正して、非同期処理で音楽を再生します。

void CMFCApplication2Dlg::OnBnClickedButton2()
{
    PlaySound(m_strFilePath, NULL, SND_FILENAME | SND_ASYNC);   // 非同期処理 (音楽再生中に、Stopボタンが押せます)
}

(15) アプリケーションを実行しましょう。 wavファイルをファイル選択ボタンから開き、再生ボタンを押して、音楽が再生され、音楽再生中に、停止ボタンが押せれば、本サンプルアプリケーションは完成です。

古い技術ではありますが、引き続き、MFCの学習を続けていこうと思います。

なお、本ページの記載は、以下のサイトを参考にさせていただきました。 ありがとうございます。

・Cactus Software様 MFC C++アプリケーション

自作split関数を用いて、標準入力を、読み出す [C++]

プログラムをメモします。

#include <vector>
#include <iostream>
#define BIG_BUFFERSIZE 1024
using namespace std;

template <typename List>
void split(const std::string& s, const std::string& delim, List& result)
{
    result.clear();

    using string = std::string;
    string::size_type pos = 0;

    while(pos != string::npos )
    {
        string::size_type p = s.find(delim, pos);

        if(p == string::npos)
        {
            result.push_back(s.substr(pos));
            break;
        }
        else {
            result.push_back(s.substr(pos, p - pos));
        }

        pos = p + delim.size();
    }
}

int main(void)
{
  vector<string> strData;
  
    while(cin) {
        string input_line;
        getline(cin, input_line);
        cout << input_line << endl;
        strData.push_back(input_line);
    };
    
    
    for(auto i = strData.begin(); i != strData.end(); ++i) {
        vector<string> split_data;
        cout << *i << endl;
        split(*i, ".", split_data);
        
        for(auto j = split_data.begin(); j != split_data.end(); ++j) {
            cout << *j << endl;
        }
    }
}

入力

192.168.186.70
1
192.168.110.238 - - [10/Jul/2013:18:40:43 +0900] "GET /top.html HTTP/1.1" 404 8922 "http://gi-no.jp" "Mozilla/5.0"

出力

192.168.186.70
1
192.168.110.238 - - [10/Jul/2013:18:40:43 +0900] "GET /top.html HTTP/1.1" 404 8922 "http://gi-no.jp" "Mozilla/5.0"

192.168.186.70
192
168
186
70
1
1
192.168.110.238 - - [10/Jul/2013:18:40:43 +0900] "GET /top.html HTTP/1.1" 404 8922 "http://gi-no.jp" "Mozilla/5.0"
192
168
110
238 - - [10/Jul/2013:18:40:43 +0900] "GET /top
html HTTP/1
1" 404 8922 "http://gi-no
jp" "Mozilla/5
0"

C++で、stdinから文字列を読み込む [C++]

C++で、stdinから文字列を読み込む方法をメモします。

///////////////////////
// stdin input example
// using cin.getline
///////////////////////

#include <iostream>

using namespace std;

int main() {
  while(cin) {
    getline(cin, input_line);
    cout << input_line << endl;
  };

  return 0;
}





C#でOfficeの予定表を確認したい。(準備編)

Visual Studio Communityで、C# Windows Formのプロジェクトを作成します。

C# Windows FormからOutlookにアクセスするためには、ライブラリの追加が必要です。

f:id:nprogram:20170130002715p:plain

f:id:nprogram:20170130002811p:plain

もし、Officeのインストールを実施しているのに、上のライブラリが見つからない場合は、 以下のサイトにアクセスしてください。解決策が書かれていると思います。

stackoverflow.com

この後、Outlookの予定表を表示するアプリケーションを作成できます。

以下のサイトを参考にさせていただきました。

[C#] Outlookの予定表から予定を取得する

strtok_sで文字列を分割する [C++]

文字列の分割には、strtokだとVisualStudioのコンパイラでエラーとなるので、strtok_sを使用します。

#include <stdio.h>
#include <string> //strtok関数用
#include <stdlib.h> //strtoul関数用

int main(void)
{
    char ch1; // 変換後の取得値
    char *p1, *p2; // char型ポインタワーク

                   //== 変換元の文字列 ==
    char sHex[] = { "30 31 32 41 42 43 4A 4B 4C 50 51 52 Hoge" };
    char *delim = ", ";//デリミタ(複数渡せる)ここではカンマと空白
    char *ctx;

    //== 変換処理(スペース区切りで分割した文字列の数値変換)==
    p1 = strtok_s(sHex, delim, &ctx); // 1個目の部分文字列取得
    while (p1 != NULL) {
        ch1 = (0xffU & strtoul(p1, &p2, 16)); // 16進文字列と解釈してchar型数値に変換
        if (p1 != p2) {
            printf("\"%s\" ==> '%c'\n", p1, ch1); // 変換成功時の表示
        }
        else {
            printf("\"%s\" ==> ** NG **\n", p1); // 変換失敗時の表示
        }
        p1 = strtok_s(NULL, delim, &ctx); // 2個目以降の部分文字列取得
    }

    return 0;
}

Visual Studio Community 2015で、DxLibを使って、シューティングゲームを作りたい!!

以下のSTGゲーム勉強は、サイトがとてもおすすめです。 龍神録プログラミングの館

Microsoft Visual Studio Community 2015の環境でのDxLibの使用方法は以下のサイトをご確認ください。 DXライブラリ置き場 使い方説明

現在、サイトを用いて学習中。 f:id:nprogram:20170108230742p:plain