Edge1

↑右がリソースエディタで貼ったツリーコントロールで、
左が↓のコードで貼ったツリーコントロール。

// m_TreeはCTreeCtrl型
m_Tree.CreateEx(WS_EX_CLIENTEDGE, WS_CHILD | WS_VISIBLE | TVS_SHOWSELALWAYS, CRect(10, 10, 200, 200), 
this, 0);
m_Tree.InsertItem(_T("ああああ"));

見てお判りの通りWS_EX_CLIENTEDGEが付きません。
CTreeCtrl::CreateExのソースを見てみると、変なことやってますので、そりゃ付かないですね。

BOOL CTreeCtrl::CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT& rect,
	CWnd* pParentWnd, UINT nID)
{
	BOOL bRet = Create(dwStyle, rect, pParentWnd, nID);
	if (bRet && dwExStyle != 0)
	{
		bRet = ModifyStyleEx(0, dwExStyle);
	}
	return bRet;
}

かと言って

m_Tree.CreateEx(0, WS_CHILD | WS_VISIBLE | TVS_SHOWSELALWAYS, CRect(10, 10, 200, 200), this, 0);
m_Tree.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);
m_Tree.InsertItem(_T("ああああ"));

こんなコードにしても、↓のようにビジュアルテーマ(?)が適用されません。
Edge5
(WS_BORDERだとちょっと濃い枠が付くため、これもちょっと違います。)

回避方法としては、

m_Tree.CWnd::CreateEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, _T(""), WS_CHILD | WS_VISIBLE | TVS_SHOWSELALWAYS, CRect(10, 10, 200, 200), this, 0);
m_Tree.InsertItem(_T("ああああ"));

というように、CWnd::CreateExを直接呼び出してしまう事ぐらいでしょうか。

これで一応リソースエディタで貼った物と同じ枠が付きます。
Edge6

MFCのバグ一覧とかどっかにまとまってたりしないのかな・・・。

音量(パンポット)は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に組み込めば「音が鳴らない!」と助けを求める方が激減する予感。

DirectShowの動画編集機能(DES)を使っていろいろ実験していたところ、
アルファブレンディングがどうにも上手く行かなかった。

http://msdn.microsoft.com/ja-jp/library/cc352035.aspx

ちゃんとやったつもりが、動画プレビュー時に何故かアプリが何事もなかったかのように終了してしまう(例外なども無し)。
各関数のエラー値を見たりエラーログ出力機能を使ったりしても原因を特定できず・・・。

ふと、コンパイルしたEXEをエクスプローラ上から起動してみたら上手く起動できましたorz
なんですかこれ、Vsual Studioの「デバッグの停止」が誤爆してるんだろうか??

例えば、次のような事をやると、0xE8008017エラーが出ます。

  1. プロジェクト内に日本語のファイル名のリソースがある状態でAdHocコンパイル
  2. コンパイルしたアプリをmac上でZIP圧縮
  3. ↑をwindows上で解凍してiTunesへ放り込んで同期を行う

どうやら、日本語ファイル名なんかはWindows上で解凍した時点で文字化けしてしまうため、iPhone/iPod touchへインストール後にリソースチェックか何かで指定されたファイルが見つからん!という感じのエラーが出てしまっているんだと思われます。

日本語ファイル名を英数字のみにすれば解消されるはずです。

ちなみに、私の場合は「変更点.rtf」をプロジェクトに入れてしまっていた事が原因でした(^^;

VS2008 SP1 MFC環境では、ポップアップメニューの表示には
theApp.GetContextMenuManager()->ShowPopupMenu(・・・)
などと呼ぶことになりますが、これを何気なくダイアログ上でやると、メニューは表示されるものの、適当な場所をクリックしてもメニューが閉じてくれません。

これで少しハマっていたのですが、ダイアログの親クラスをCDialogではなくCDialogExにするとうまくメニュー処理がされるようです。
(こういうものこそASSERTで引っかけてくれよorz)

Edge12

記事検索

アーカイブ