ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

プログラミング

Visual studioのC++で実行ファイルのプロパティにビルド番号を埋め込む

Visual studio, 便利なのに、なぜかビルドしたファイルのバージョンプロパティにビルド番号を埋め込めない。そこで、下記にあるIncrementBuildを導入した。 Build Incrementing for Visual Studio C++ Projects – Fooling Around 動作原理 ビルド後のイベン…

CInfoProgressCtrlの更新(プログレスバー伸長速度を切替可能に)

CInfoProgressCtrlはCProgressCtrlを継承することでプログレスバーの上に文字を表示できるようにしているのだが、このプログレスバーの欠点の一つに、バーを伸ばす速度が制限されている、というのがある。バーが縮む方向ならば瞬時に縮むので、これを利用し…

ProgressCtrlの上に文字を表示

プログレスバーの上に文字を表示する必要が生じたのだが、標準のCProgressCtrlは文字表示機能が無い。どうも、Windowsのデザインガイドではテキストを表示するな!となっているようだ(1次情報未確認)。そこで、他の方が作ったものがないかなーと調べてみる…

タブコントロール内のダイアログがESCキーで閉じてしまうのを防ぐ

タブコントロールを実装するには、各タブに相当する枠なしダイアログを用意するのだが、困ったことにESCキーを押すとこのタブ内のダイアログが閉じてしまい、真っ白になってしまう。これを回避するには、タブ内の各ダイアログのOnCancel()をオーバーライドし…

CProgressCtrlのSetStateが反映されない

CProgressCtrlの色を変えようとしたがハマったのでメモ。 CProgressCtrlは、WindowsThemeが有効だとプログレスバーの色を変えるSetBarColorが無視される。そこで、SetStateでPBST_NORMAL, PBST_PAUSED, PBST_ERRORのいずれかを指定することでテーマに沿った…

ダイアログのコントロール上でも右クリックでメニューを出したい

ダイアログ上で右クリックした際にメニューを表示するには、OnRButtonUpあたりをオーバーライドしてやればいい。しかし、OnRButtonUpはダイアログ上のプログレスバー等の上で右クリックした場合には呼び出されない。これは、ボタンの上で左クリックした場合…

Visual Studio2017でWindowsXp用プログラムをビルドする

事情によりWindowsXp用プログラムをビルドすることになったんだけど、WINVER等の定数をいじっても、出来上がったソフトが動かなかった。確か、有効な実行ファイルではありませんとか言われる。なんでかなーと思いながらオプションながめてたら、こんなの発見…

GetLastError()の結果をCStringで出力するクラス

GetLastError()で得たエラーコードを毎回FormatMessageで変換するのが面倒だったので、両者をひとまとめにしてCStringまたはLPCTSTRで返すクラスを作った。 注意! LPCTSTRは一時オブジェクトのアドレスを返すので、長時間使わないこと。すぐに無効なアドレ…

CString等でUnicodeとマルチバイトを相互に変換する

CString等でUnicodeとマルチバイトを相互に変換する方法のメモ。こんな便利なマクロ(実態はクラス)があったとは。例えば、UnicodeからANSI(マルチバイト)に変換する場合はCW2A(string)でOK。逆に、ANSIからUnicodeならCA2W(string)。マクロの返り値が変換…

フォルダ選択ダイアログの表示

フォルダ選択ダイアログを表示するため以前はSHBrowseForFolderを使っていたんだけど、MSDNによるとVista以降はIFileDialogを使うことが推奨されるらしい。 そこで、IFileDialogを使うよう、以下の通り実装した。 (2018/06/23追記:IFileDialogはWindowsVist…

error C2787 このオブジェクトに関連付けられた GUID はありません。

IFileDialogやIFileOpenDialogを使おうとしたら、「error C2787 このオブジェクトに関連付けられた GUID はありません。」というコンパイルエラーが出た。 原因は、元のソフトがWindowsXp以降で動作するようにしていたため。上記インターフェースは、Windows…

CImageからcv::Matへの画像コピー

MFCで画像をお手軽に使えるクラスCImageから、画像処理の定番OpenCV用のクラスcv::Matへ画像をコピーするのは、一見簡単だが罠がある。CImageが保持している画像データへのポインタはCImage::GetBits()で取得できるのだが、このポインタ、データの先頭を指す…

Critical error detected c0000374

昔作ったソフトの改造をしていたら、突然「Critical error detected c0000374」というエラーが出て止まるようになった。実行継続して例外を処理させてみたら、 「ハンドルされない例外が 0x00007FFB1E01E6FC (ntdll.dll) で発生しました(伏せ字.exe 内): 0xC…

OpenCVのmatchTemplateがうまく動かない!

以下のコードが上手く動かず、しばし悩む。 まったく同じ画像のはずなのに、どうしてもminMaxLocの結果が0.85になる。なぜだ。そこで、各画像のメモリを覗いてみた。 まずはイメージの探索対象側。イメージサイズは2×4, 32bit。0xf0f0f000 というパターンが7…

Visual Studioの出力ウィンドウにデバッグ文字列を出力する(ATLTRACE, AtlTrace, _RPTn)

Visual Studioを使ってWIndowsプログラムのデバッグ中に、プログラムや変数の状態を表示したい・残したいと思う人や、なんでstderrが使えないんじゃああ!という人向けメモ。 C/C++でこれをするには、OutputDebugStringや_RPTNという関数が便利。他にもATLTR…