MFCはじめまして(書きかけです)

MFC使う目的■

画像の前背景セグメンテーションをしたい!そのための、、、

  • ファイル入出力をGUI化したい。連番とかも。
  • パラメータ入力も同上
  • 読み込んだ画像上にお絵かきしたい(前/背景を指定したい)

で、もう静止画の実装は終わったんだけど、動画仕様に書き直すついでにメモ。
最近記憶が薄れるのが早くて困るので、メモ書きが大切になってきた。。だからこういう場(はてなね)にアウトソースしようとするんだけど、いかんせん慣れなくてもっかい困る。どこに書いたかを忘れるし笑。コントローラもセットで欲しすなあ。せとー

  • 以下MFCアプリケーション、ダイアログベース

コントロール

デフォルト"OK"

デフォルトのOKボタンが削除しても有効で(?)、実行中エディットボックス内で押したEnterに反応して終了する。
防ぐには、OKボタンをダブルクリックしてハンドラ関数出して、OnOK()をコメントアウトする。

void CVideoSnapcutMFCDlg::OnBnClickedOk()
{
 // TODO: ここにコントロール通知ハンドラ コードを追加します。
 //OnOK();   ←ここをコメントアウト
}


で、これする前にOKボタン消しちゃったときはどうするのかという質問には笑顔を返す!


「リソースの追加」で作った新ダイアログの表示の不具合

諸般の事情(mainのダイアログにエディットボックス置きたくない)によりパラメータ入力用のダイアログを別に作ることにしたんだが、頑張って作ってDoModal()したらこんなのが↓


原因は新しくダイアログのクラスを作る時(作成したダイアログボックス上でダブルクリック)、基本クラスのデフォルトがCDHtmlDialogになっていること。
CDialogに直すときれいになる↓



これに気付くのに1時間。
またつまらんことに時間をつかってしまった・・・


フォルダ選択ダイアログ

MFCのクラスには「名前を付けて保存」みたいな時に出てくるファイルダイアログはクラス化されているが、フォルダダイアログはない。(らしい。)
そこでshlobj.h内のAPIを使うとよい。以下を参考に。
http://www.ne.jp/asahi/yamashita/programming/tips/1.html
ソースコードをコピペしてエラーが出なかったのは初めてです。ほんとにありがとうございました。


ちなみにpszDisplayNameは定義を辿るとwchar型。(俺がプログラムをワイド文字で書いてるから?)


「フォルダの新規作成」を追加したい場合はbInfoの変数を以下の通り変更

//bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
bInfo.ulFlags = BIF_NEWDIALOGSTYLE;        // ←こうする。


ただこうするとフォルダのビジュアルがちょっと変わる??
(参考)http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200205/02050134.txt


ulFlagsの中身については以下を参考に。
http://www10.ocn.ne.jp/~shiimori/mfc/mfc04.htm


BIF_RETURNONLYFSDIRSは便利なので結局戻しておいた。

bInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;

連番ファイルの作り方■

先輩の何千行に及ぶソースコードから見っけてきてあぷらい。

ostringstream ostrImg;
ostrImg << setw(nFrameDigit) << setfill('0') << nFrame << "." << IMG_EXTENSION << '\0';


IMG_EXTENSIONは拡張子、nFrameDigitは桁数。


はじめはCStringの.Formatとか、sprintfの%dのオプションで桁数を決められるかと思ったんだが、状況によって連番桁数は変わるので、可変にしたかった。ので、setfill使用。


char*に直すには、

ostringstream ossStr;
ossStr << 〜〜〜;

char pchStr[];
strcpy(pchStr, ossStr.str().c_str() );


unicode環境下でMFCプログラミングしても、ostringstreamに格納される文字列はchar型。MFCのクラスじゃないからか(?)。

キー入力取得

PreTrancelateとOnChar

GetKeyState

画像の表示■

次の日記に。

画像上にお絵かき

同上

しょうもないミス

急にあるダイアログ上のコントロールに対し変数の追加が行えない

ダイアログのIDを変えたためと判明。ID名を元に戻すか、ダイアログのclassの宣言内のダイアログデータを直す。
まぁエラーが出るからすぐわかる。

「コード要素'xxxx'が読み取り専用であるため、追加と削除操作は実行できません。」

開いているxxxx関連のファイルを閉じるか、"プロジェクト名.ncb"を一回削除
http://plaza.rakuten.co.jp/dolphin3/diary/200612010000/
ありがとうございます。




Shawn