::StretchDIBits の戻り値が 0
ImageConverter::Stretch で ::StretchDIBits がうまく動作しない.
通常のダイアログとしての動作の時は問題なさそうだが,サイレントモードの場合 0 になる.
memDC->FillSolidRect(-1,-1,rect.Width()+2,rect.Height()+2,0x00ffffff) ; などは OK.
うまくいかない(0 になる)場合,ImageConverter::ResizeAB を利用(Image::Stretch)することにより対応.
これを調べていた時に,MemoryDC::Init で ::CreateDIBSection の呼び出しがうまくない?ことを見つけた.
戻り値や ppvBits はそれなりに入っているが,GetLastError では,8 が戻される.
0x00000008 ERROR_NOT_ENOUGH_MEMORY このコマンドを実行するのに十分な記憶域がありません。
詳しく調べてないが,以前 StretchDIBits などでうまくなかったのは,ここら辺が影響していたのかも知れない.
里親募集
ちょっと聞いたので,…
麻布大学動物応用科学科 動物トレーニング実習
里親募集中の犬の紹介
麻布大学応用動物心理学実習HP
ダイアログ.exe サイレントモード
ダイアログベースで,コマンドライン引数により何も表示しないで終了する exe
次の様なコードで,AfxWinMain でエラーになってしまう.
BOOL CReszPicApp::InitInstance()
{
…
CReszPicDlg dlg;
m_pMainWnd = &dlg;
if (_tcslen(m_lpCmdLine) != 0) {
dlg.EnumDIB() ;
dlg.ResizeDIB() ;
return FALSE ;
}
INT_PTR nResponse = dlg.DoModal();
…
}
—————————
Microsoft Visual C++
—————————
ハンドルされていない例外 は ReszPic.exe (MFC42D.DLL) にあります: 0xC0000005: Access Violation。
—————————
OK
—————————
WinMain.cpp
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
…
// Perform specific initializations
if (!pThread->InitInstance()) {
if (pThread->m_pMainWnd != NULL) {
TRACE0(“Warning: Destroying non-NULL m_pMainWnd\n”);
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
…
}
m_pMainWnd への設定より前に,サイレントモードでの動作を行えば良い.
CReszPicDlg dlg;
// m_pMainWnd = &dlg;
if (_tcslen(m_lpCmdLine) != 0) {
dlg.EnumDIB() ;
dlg.ResizeDIB() ;
return FALSE ;
}
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
Message クラスなどで,AfxGetMainWnd()->GetSafeHwnd()==NULL の時の判断が抜けていたので修正.
AfxGetMainWnd()==NULL は多くの所で対応しているが,
AfxGetMainWnd()->GetSafeHwnd()==NULL は抜けがかなりありそう.
CView の OnFilePrint を抜き出し
OnFilePrint の関係を DH_Print クラスとして抜き出しました.
ダイアログベースの exe や,ビューの表示対象と異なるオブジェクトの印刷などに利用できると思います.
利用方法はこんな感じ.
class PrintTest : public DH_Print { public: virtual void OnPrint (CDC* pDC, CPrintInfo* pInfo) { CRect rect = pInfo->m_rectDraw ; { pDC->TextOut(0,0,_T("ここが印刷のためのコードです.")) ; } return ; } virtual BOOL OnPreparePrinting ( CPrintInfo* pInfo) { pInfo->SetMaxPage(5) ; return DoPreparePrinting(pInfo) ; } virtual CString GetDocumentTitle (void) { return _T("通常はドキュメント名を戻します.") ; } } ;
印刷が押されると,
void CAboutDlg::OnPrint() { PrintTest pt ; if (pt.OnFilePrint()) { OnOK() ; } }
2020/07/13 Google ドライブ上の Print.zip へのリンク
Print.zip
2020/12/17 公開しているファイルだけでは利用できなかったので修正
Print_2020_12.zip
クラス名 Print は DH_Print に変更.
印刷時のデフォルトのドキュメント名を ” DH_Print : %Y/%m/%d %H:%M:%S ” に変更.
DH_Print クラスを利用したサンプル.
PrtMF_2020_12.zip
DH_Print 利用のソースが zip の中にあり.
Virtual PC が遅い
昨日から Virtual PC と,ホスト間のアクセスが極端に遅くなった.
今までも,たまに,ファイルコピーなどで一時的に遅くなったことはあったが,ここまでではなかった様な...
エクスプローラで,左のフォルダツリーが表示されているとこれも遅い.
他の Virtual PC の共有フォルダの参照は,そこまでではないように感じるが...
動作は,電源 OFF などで LAN 上からいなくなった PC を参照した様な感じ.
全ての Virtual PC の終了で,今までは普通に戻っていたが今回は違うみたい.
ルータなども含め,LAN 上の全ての再起動が必要か?
それともホストにウィルス対策ソフト 2012 の体験版をインストールした影響か?