Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

2011 / 12月

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


  にほんブログ村 IT技術ブログへ


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


  にほんブログ村 IT技術ブログへ


CView の OnFilePrint を抜き出し

OnFilePrint の関係を Print クラスとして抜き出しました.
ダイアログベースの exe や,ビューの表示対象と異なるオブジェクトの印刷などに利用できると思います.
利用方法はこんな感じ.
class PrintTest : public 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

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


  にほんブログ村 IT技術ブログへ

  • Categories:

Virtual PC が遅い-その後

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

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


  にほんブログ村 IT技術ブログへ


DDV を働かせたい

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

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

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


  にほんブログ村 IT技術ブログへ


Virtual PC が遅い

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

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

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

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


  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。