-
GDI描画
【MFC】BitBltで画面やウィンドウをキャプチャする:見えない枠・CAPTUREBLT・PrintWindow・DPIのずれ
MFCで画面やウィンドウをキャプチャするときは、画面のDCからメモリDCに選択したビットマップへBitBltで写します。ただ、GetWindowRectで取った範囲をそのまま写すと、ウィンドウの左右と下に後ろの背景が写り込むことがあります。重なっている別のウィン... -
GDI描画
【MFC】AlphaBlendで半透明に重ねて描く:乗算済みアルファとAC_SRC_ALPHA・SourceConstantAlphaの使い分け
MFCで画像を半透明に重ねるときは、CDC::AlphaBlendを使います。画像全体を同じ濃さで薄くするならBLENDFUNCTIONのSourceConstantAlphaだけで足りますが、丸い形だけを重ねたり縁をぼかしたりするには、画素ごとのアルファを持った32ビットのビットマップ... -
GDI描画
【MFC】TransparentBltで背景色を抜いて描く:透過色の指定と、縮小した画像の縁に色が残る所
背景をマゼンタで塗ったアイコンのビットマップをBitBltで重ねると、マゼンタの四角までそのまま描かれます。TransparentBltを使うと、透過色に指定した色の画素は転送されないので、アイコンの形だけが下の絵の上に描かれます。MFCではCDC::TransparentBl... -
ビルド
【MFC】mfc110.dll / mfc90.dllが見つからない:VC++ 2012 / 2008の再頒布可能パッケージとx86/x64の選び方
Visual Studio 2012や2008で作られた古いMFCアプリを起動したときに、mfc110.dllやmfc110u.dllが見つからないという次のようなエラーが出たら、DLL名の数字に合った世代の再頒布可能パッケージを、アプリと同じビット数(x86 / x64)のものを入れます。 mf... -
UI制御
【MFC】ボタンの色がOnCtlColorで変わらない:BS_OWNERDRAWとDrawItemで背景色と文字色を変更する
MFCのダイアログで、非常停止のようなボタンを赤くしようとしてOnCtlColorでCTLCOLOR_BTNのときに赤いブラシを返しても、プッシュボタンの面と文字の色は変わりません。プッシュボタンは、OnCtlColorが返したブラシを使わずにシステムの色で描かれるためで... -
ビルド
【MFC】VCRUNTIME140.dllが見つからない:DLL名とx86/x64から入れる再頒布パッケージを決める
アプリを起動したときに、VCRUNTIME140.dllが見つからないという次のエラーが出たら、MicrosoftのVisual C++ v14再頒布可能パッケージを入れます。Windowsが64bitだからx64版、と手が伸びますが、アプリと同じビット数(x86 / x64)のものを選びます。 VCR... -
ビルド
【MFC】LNK2001 未解決の外部シンボル:参照元の関数が出ないときの探し方
ビルドするとerror LNK2001: 外部シンボル "…" は未解決です と出て、exeができません。LNK2019なら「関数 "…" で参照されました」と呼び出し元まで出ますが、LNK2001の行にはそれがありません。その代わり、行頭の .objと二重引用符の中の名前の形から、... -
ビルド
【MFC】msvcr100.dll / msvcr120.dllが見つからない:Cランタイムの名前から入れる再頒布可能パッケージを決める
古いアプリを起動したときに、msvcr100.dllやmsvcr120.dllが見つからないという次のようなエラーが出たら、DLL名の数字とアプリのビット数(x86 / x64)から、入れる再頒布可能パッケージを決めます。 MSVCR100.dll が見つからないため、コードの実行を続... -
デバッグ
【MFC/C++】Assertion failed!の読み方:assert()とDebug Assertion Failed!の見分け方
Visual Studioで作ったアプリを動かしていると、「Microsoft Visual C++ Runtime Library」という題名で「Assertion failed!」と書かれたダイアログが出ることがあります。これはC/C++標準のassert()の条件が成り立たなかったときにCランタイムが出すもの... -
デバッグ
【MFC】二重起動防止:CreateMutexをGetLastError 183で判定
MFCアプリで二重起動防止をするときは、InitInstanceで名前付きミューテックスをCreateMutexで作り、直後のGetLastError()が183(ERROR_ALREADY_EXISTS)かどうかで、同じアプリがすでに動いているかを判断します。同じ名前のミューテックスがすでにあって...