リボンバーで印刷プレビューがフリーズ

[戻る]
傾奇者 2011/01/17(月) 15:34:12
今年もお世話になります。
VFC2010, MFC, SDI アプリで、リボンバーを採用しています。
印刷を行うソフトです。

「印刷プレビュー」を押したところ、リボンバーには「印刷プレビュー」という
カテゴリ(タグ)だけが表示され、ビューに印刷イメージが出ます。
「閉じる」ボタンで閉じれば問題ないのですが、間違って一番右上にある
システムメニューの赤いXボタンを押すと、フリーズしてしまいます。
必ずということではなく、数回の繰り返し後であったり、1回でも生じたりします。

最もシンプルなスケルトンを新しく作ってやってみましたが、再現しました。
関連するコードを下記します。
印刷内容は OnPrint の中に書いています。

// CtestView 印刷

void CtestView::OnFilePrintPreview()
{
#ifndef SHARED_HANDLERS
    AFXPrintPreview(this);
#endif
}

BOOL CtestView::OnPreparePrinting(CPrintInfo* pInfo)
{
    // 既定の印刷準備
    return DoPreparePrinting(pInfo);
}

void CtestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: 印刷前の特別な初期化処理を追加してください。
}

void CtestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: 印刷後の後処理を追加してください。
}

void CtestView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
    // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出し
てください。

    for (int i=0; i<10000; i++) pDC->TextOut(100, 100+i*20, _T("本日は大
雪なり"));

    CView::OnPrint(pDC, pInfo);
}

1万回も繰り返しているのは、フリーズを出やすくするためです。
1回だけでも、フリーズするときはします。

何か不足のコードがあるでしょうか? どうぞ教えてください。
ちなみに、エクセル2007 で「印刷プレビュー」を押すと、同様に表示されますが、
一番右上にあるシステムメニューの赤いXボタンを押しても、プレビューが閉じます。
出来れば、こうしたいです。

【蛇足かも?】
ずっと昔、VS6.0 から VS.NET に進んだとき、印刷プレビューを閉じると、親ウィンド
ウも閉じるという不具合がありました。
次の1行を追記すればいいと教えて戴いたことがあります。(理由はまだ理解していな
い)
しかし、今回の件にはこの1行の有無は影響ないようです。

CMainFrame::OnClose()
{
    if ((m_lpfnCloseProc != NULL) && !(*m_lpfnCloseProc)(this)) return;
}

傾奇者 2011/01/17(月) 16:41:25
誤 VFC2010 → 正 VC2010

傾奇者 2011/01/20(木) 18:51:43
VC2008 SP1 でも同じことをやってみましたが、結果は同じで、フリーズしました。
リボンバーはダメじゃ、こりゃ。

傾奇者 2011/01/25(火) 11:30:08
英文のフォーラムも探しました。
全く同じ質問がありました。
http://www.experts-
exchange.com/Programming/Languages/.NET/Visual_CPP/Q_26502760.html

ITO 2011/01/26(水) 13:18:02
OSはWINDOW 7ですか?

 WINDOW 7の64bit版を試験的に使っていますが、Windowの更新が思ったより多かった
ですね。
 そのうちSP1がでそうな雰囲気です。
 VC2010がないのでリボンバー関連のソフトは分かりませんが、現状のバグもしくは、
仕様なのかも知れませんね。

傾奇者 2011/01/27(木) 08:55:43
[[解決]]
ITO様、有り難うございます。

> OSはWINDOW 7ですか?

はい、WINDOWS 7 です。
!!!
ビルドした実行ファイルを Windows XP で動作させてみました。
何の問題もありません。フリーズしないのは勿論、システムメニューのXボタンを押し
ても、プレビューが閉じます。

「リボンバー」は VS2010 の新機能として「売り」にしているくせに、マイクロソフト
め! 何たるお粗末。

ITO 2011/01/27(木) 16:28:19
ん?
 そういえば、未だWINDOWS 7 のSDKって組んだことないので分かりませんが、
印刷プレビューの表示部分をSDKで組むのは可能ですか?
うまくいくかどうか分からないのでおすすめできません。
昔、WINDOWS9XからWINDOWS2000に切り替わり時にマイクロソフトから
  「印刷のダイアログ部分をSDKで組んでください。」
 といわれたことがあります。

傾奇者 2011/01/28(金) 06:54:52
SDKは、ほとんどやったことがありません。
リボンバーって、SDKで組めるのでしょうか? すごく厄介なことでしょう。

ITO 2011/01/28(金) 17:35:16
> リボンバーって、SDKで組めるのでしょうか? すごく厄介なことでしょう。
確かにそうですね。
 もともと、Frameworkの関数で動いているものをMFCで組めるようにした可能性も
ありますね。

古いスレッドには追加発言できません。