ホーム » 2011 » 12月

月別アーカイブ: 12月 2011

2011年12月
 123
45678910
11121314151617
18192021222324
25262728293031

カテゴリー

アーカイブ

ブログ統計情報

  • 77,446 アクセス



::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 などでうまくなかったのは,ここら辺が影響していたのかも知れない.

ImgCnvrt.hxx

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

里親募集

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

ダイアログ.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 は抜けがかなりありそう.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

印刷ジョブの削除

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

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() ;
    }
  }

Print.zip
Print
マルチページ ドキュメント


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 クラスを利用したサンプル.
DH_Print クラスのサンプル EMF の印刷
PrtMF_2020_12.zip
DH_Print 利用のソースが zip の中にあり.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Virtual PC が遅い-その後

再起動を試したが,効果なし.
サーバのウィルス対策ソフトをアンインストールしたが,これも効果なし.

サーバからクライアントのファイルなどを参照する場合は以前と変わらないと思われる.
クライアント間も特に問題なし.
イベントビューアなどで,関連しそうなログは見つからない.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

DDV を働かせたい

あまり DDV は使用しないが,数値で簡単な範囲チェックをやりたかった.
最大文字数などは指定しておけば勝手にやってくれるが,値のチェックはそうではない.

適当な(チェックしたい)タイミングで UpdateData(TRUE) を呼んでやればよい.
例えば,
void CXxxxDlg::OnChangeXxx() { UpdateData(TRUE) ; }
EN_UPDATE とどちらが良いかは不明.

本当は範囲を超えた時の入力をはじきたいが,それは簡単にはできなかった.

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

Virtual PC が遅い

昨日から Virtual PC と,ホスト間のアクセスが極端に遅くなった.
今までも,たまに,ファイルコピーなどで一時的に遅くなったことはあったが,ここまでではなかった様な...
エクスプローラで,左のフォルダツリーが表示されているとこれも遅い.
他の Virtual PC の共有フォルダの参照は,そこまでではないように感じるが...

動作は,電源 OFF などで LAN 上からいなくなった PC を参照した様な感じ.

全ての Virtual PC の終了で,今までは普通に戻っていたが今回は違うみたい.

ルータなども含め,LAN 上の全ての再起動が必要か?
それともホストにウィルス対策ソフト 2012 の体験版をインストールした影響か?

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.