今年もお世話になります。
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;
}
誤 VFC2010 → 正 VC2010
VC2008 SP1 でも同じことをやってみましたが、結果は同じで、フリーズしました。
リボンバーはダメじゃ、こりゃ。
英文のフォーラムも探しました。
全く同じ質問がありました。
http://www.experts-
exchange.com/Programming/Languages/.NET/Visual_CPP/Q_26502760.html
OSはWINDOW 7ですか?
WINDOW 7の64bit版を試験的に使っていますが、Windowの更新が思ったより多かった
ですね。
そのうちSP1がでそうな雰囲気です。
VC2010がないのでリボンバー関連のソフトは分かりませんが、現状のバグもしくは、
仕様なのかも知れませんね。
ITO様、有り難うございます。
> OSはWINDOW 7ですか?
はい、WINDOWS 7 です。
!!!
ビルドした実行ファイルを Windows XP で動作させてみました。
何の問題もありません。フリーズしないのは勿論、システムメニューのXボタンを押し
ても、プレビューが閉じます。
「リボンバー」は VS2010 の新機能として「売り」にしているくせに、マイクロソフト
め! 何たるお粗末。
ん?
そういえば、未だWINDOWS 7 のSDKって組んだことないので分かりませんが、
印刷プレビューの表示部分をSDKで組むのは可能ですか?
うまくいくかどうか分からないのでおすすめできません。
昔、WINDOWS9XからWINDOWS2000に切り替わり時にマイクロソフトから
「印刷のダイアログ部分をSDKで組んでください。」
といわれたことがあります。
SDKは、ほとんどやったことがありません。
リボンバーって、SDKで組めるのでしょうか? すごく厄介なことでしょう。
> リボンバーって、SDKで組めるのでしょうか? すごく厄介なことでしょう。
確かにそうですね。
もともと、Frameworkの関数で動いているものをMFCで組めるようにした可能性も
ありますね。