音量(パンポット)はmidiOutSetVolumeを使えばあっという間に設定できるのですが、
これだとミュートチェックは外してくれません。

というわけでこちら(http://www.terra.dti.ne.jp/~vivas/delphi/mixerapi.html)のサイト様の説明を参考にさせて頂きながらミキサーAPIを使ってミュートを解除するコードを書いてみました。

MIXERLINE MixerLine = {sizeof(MIXERLINE)};
MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
if (mixerGetLineInfo((HMIXEROBJ)nDevID, &MixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE | MIXER_OBJECTF_MIDIOUT) == MMSYSERR_NOERROR) {
	MIXERCONTROL Ctrl;
	MIXERLINECONTROLS Ctrls = {sizeof(MIXERLINECONTROLS), MixerLine.dwLineID};
	Ctrls.cControls = 1;
	Ctrls.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE; 
	Ctrls.cbmxctrl = sizeof(MIXERCONTROL);
	Ctrls.pamxctrl = &Ctrl;
	if (mixerGetLineControls((HMIXEROBJ)nDevID, &Ctrls, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_MIDIOUT) == MMSYSERR_NOERROR) {
		MIXERCONTROLDETAILS Details = {sizeof(MIXERCONTROLDETAILS)};
		Details.dwControlID = Ctrl.dwControlID;
		Details.cChannels = 1;	// 決めうちで良いらしい
		MIXERCONTROLDETAILS_BOOLEAN Boolean = {0};
		Details.paDetails = &Boolean;
		Details.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
		if (mixerSetControlDetails((HMIXEROBJ)nDevID, &Details, MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_MIDIOUT) == MMSYSERR_NOERROR) {
			// 成功
		}
	}
}

この制御をDominoに組み込めば「音が鳴らない!」と助けを求める方が激減する予感。

適当にウィザードでプロジェクトを作成したのち、「カスタマイズ」機能でツールバーやメニューコマンドをドラッグ&ドロップしようと思ったら、動かない!なんて事がありましたので原因を探ってみたところ、プロジェクト作成ウィザードでActiveXのチェックを外してしまっていたのが原因のようです。

中は見ていませんが、おそらくカスタマイズ時のドラッグ&ドロップ処理はOLEのドラッグ&ドロップなんでしょうね。
なので、
CXXXXApp::InitInstanceの適当な所で「AfxOleInit()」を呼べばカスタマイズ機能が正常に動くようになります。

仕事で開発を行っていると、他の人がエクセルファイルでデータ資料を作り、プログラマがその情報をアプリに組み込む、なんて事がよくあります。
一度CSVに書き出してからプログラムでそれを読み、使いやすいデータ(XMLやCのソース)にコンバートして利用するのが定石かと思いますが、エクセルファイルを直接読めればCSVに書き出す手間が多少軽減されます。
(そもそもVBAでコンバート処理書いちゃうという人は尊敬されれば良いと思います)

Visual C++6.0ではよくそういう事をやっていたのですが、Visual Studio 2008 + MFCだとどうやるんだろう?と思いましてちょっとやってみました。

メニューからクラスの追加を実行します。
xls00

「TypeLibからのMFCクラス」を選びます。
xls01

エクセルのタイプライブラリを選び、使うインターフェースを追加して(今回は面倒なので全部追加)完了ボタンを押します。
xls02

ちょっと生成に時間が掛かりますが、ヘッダーファイルが生成されます。
ただ、何故か#import文が入っていて、コンパイル時にエラー(名前の競合)が出てしまうので一括置換でコメントアウトします。
xls03

VC6ではできなかった芸当ですね(ソリューション内一括置換)
xls04

あとはごりごりコードを書けばエクセルの操作ができます。

既存のファイルを開いて、最初のシートのA1のテキストを取得するにはこんな感じになるかと思います。
(Excel 2007使用)

#include "CApplication.h"
#include "CWorkbooks.h"
#include "CWorksheets.h"
#include "CWorkbook.h"
#include "CWorksheet.h"
#include "CRange.h"

void CHogeHogeDlg::OnBnClickedButton1()
	CApplication App;
	if (!App.CreateDispatch(_T("Excel.Application"))) {
		ASSERT(0);
		return;
	}
	App.put_Visible(TRUE);

	CWorkbooks Workbooks = App.get_Workbooks();

	// 既存のエクセルファイルを開く
	COleVariant varNull;
	varNull.ChangeType(VT_NULL);
	CWorkbook Workbook = Workbooks.Open(_T("c:\\hogehoge.xls"), varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull,varNull, varNull);

	CWorksheets Worksheets = Workbook.get_Worksheets();
	CWorksheet Worksheet = Worksheets.get_Item(COleVariant((long)1));

	CRange Cells = Worksheet.get_Cells();
	CRange Cell = Cells.get_Item(COleVariant((long)1), COleVariant((long)1)).pdispVal;
	CString str = Cell.get_Text().bstrVal;
}

CRange::DialogBoxとかいう関数でコンパイルエラーが出ますが関数名変えるなどして回避します。

当然ながら実行する環境にエクセルがインストールされている必要があります。
また、使用したタイプライブラリと実行時のエクセルのバージョンが違うと、うまく動かない事があるかもしれません。うろ覚えですが。上位互換はあるかも?

もしいろんな操作をやりたい場合、エクセルのマクロのヘルプが参考になると思います。若干関数名は違いますが、構造などはほぼ同じです。

表形式でデータを表示するだけならリストコントロールのレポートビューでなんとでもなりますが、入力に対応させようとするとリストコントロールではちょっと無理があります(頑張ればこれでも行けないことはないと思いますが)。

他の開発環境ではグリッドコントロールなどと呼ばれている物が有りますが、VC(MFC)には付いてきません。
(標準のコントロールとしては、そのような物が無いため)

とはいえ、実際にアプリを作る際には、グリッドコントロールはしょっちゅう必要になってきますし、ソフトウェアハウスなんかではグリッドコントロールを独自開発して使っているのが実状だと思います。

そんな中、商品でも何でも良いのである程度汎用的に使えるグリッドコントロールは無いものか、ざっくりと探してみたので、ざっくりとまとめておきます。

Microsoft FlexGrid Control

ActiveXで使うグリッドコントロール。
http://noribeat.s38.xrea.com/developer/03031501.html
http://hp.vector.co.jp/authors/VA014436/prg_memo/windows/vctips/004.html

DataGridという奴もあるようですが、こちらはDB用なのかな?

MFC Grid control

Code Projectで公開されているライブラリ。
http://www.codeproject.com/KB/miscctrl/gridctrl.aspx

UNICODE環境でコンパイルするとOLEデータの貼り付け時に文字化けたり、そもそもコピペ時にCF_TEXT使ってたり(UNICODEなら本来はCF_UNICODETEXT)、ちょっとプログラムを修正する必要がありますが、結構いろんな事ができます。

ただ、操作性やデザイン面で好き嫌いが出そうな予感です。

BCGControlBar Library Professional Edition

VS2008 Future Packの元ネタである、このライブラリ集にもグリッドコントロールがあります。
http://www.bcgsoft.com/samples/grid.htm(サンプル)

デザインがなかなか格好良く、しかもかなりの高機能っぷりです。
なんでも出来そうです。

ただ、これだけデザイン良くて高機能なのに、すごく動作が重いんです。
とても実用に耐えられるものではありません。
(データが1画面に納まるような時でないと使い物になりません。)
これが動作が軽ければ文句なしに買っていたのに、非常に残念です。

ご意見お待ちしております

うちの会社はこの万能グリッドコントロールを使ってるよ!とか、むしろうちの会社でグリッドコンポーネント作ってるから買ってよ!みたいな宣伝とかありましたらメールください。

※ VS2005/VS2008 + UNICODE + MFC 環境でサクっと動く物をお願いいたします。

iPhoneの開発言語であるObjective-CはCの上位互換言語なのでC言語で出来ることは一通り出来ます。クラス(NSObjectの派生クラス)にするとメモリ周りのオーバーヘッドが気になる!もしくはクラスを使うまでも無い!という場合は構造体を使うと良いかと思います。

struct Hogehoge {
	int aaaa;
	int bbbb;
};

ただ、C++と違ってCなので構造体を使うときにもいちいち型を「struct Hogehoge」と指定してやらなきゃいけません。

そんなときにはtypedefを使うと楽になります。

typedef struct {
	int aaaa;
	int bbbb;
} Hogehoge;

これで「Hogehoge」だけで構造体の型を利用できるようになります。

この方法はCの頃は結構当たり前のように使っていたのですが、C++にしばらく入り浸っているうちに忘れてしまっていました。
(というか、structつけずに型を使おうとしてコンパイルエラーが出たときは、なんだか懐かしく感じました(^^;;)
またObjective-Cで思い出したので情報として残しておきます。

記事検索

アーカイブ