C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: プレビューの仕様


(過去ログ 58 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■33349 / inTopicNo.1)  プレビューの仕様
  
□投稿者/ おへそ七 (1回)-(2009/02/26(Thu) 11:41:17)

分類:[C/C++] 

環境:VS6.0、VS2005、MFC、MDI

既存プログラムの開発環境をVS6.0からVS2005に変えたところ
プレビューの仕様が変わった様子で、困っています。
設定等で従来の仕様にする方法があればご指導ください。

◆仕様のちがい
プレビューウィンドウが、VS6.0ではメインウィンドウ一杯の大きさに
表示されていましたが、VS2005ではアクティブな子ウィンドウに対応して
表示されるようになりました。

◆困っていること
・プレビューウィンドウの「X」をクリックすると、プレビューウィンドウとともに
 対応する子ウィンドウも閉じてしまいます。従来は子ウィンドウが閉じることは
 ありませんでした。
・プレビューウィンドウのサイズを変更してから「閉じる」ボタンをクリックすると、
 対応する子ウィンドウのサイズ変わってしまいます。(プレビューウィンドウの
 サイズが用いられるようです)
 従来は、子ウィンドウのサイズが変わることはありませんでした。
・子ウィンドウが複数あると、各々についてプレビューが表示できてしまいます。
 従来はプレビュー表示中はメインウィンドウのメニューが隠れたので
 プレビューを複数表示することはできませんでした。

以上です。
よろしくお願いいたします。

引用返信 編集キー/
■33355 / inTopicNo.2)  Re[1]: プレビューの仕様
□投稿者/ とっちゃん (373回)-(2009/02/26(Thu) 13:22:24)
とっちゃん さんの Web サイト
No33349 (おへそ七 さん) に返信
> 環境:VS6.0、VS2005、MFC、MDI
>

> 既存プログラムの開発環境をVS6.0からVS2005に変えたところ
> プレビューの仕様が変わった様子で、困っています。
MDIで、MFCで子ウィンドウにプレビューなので、印刷プレビューと
決めつけましたが間違ってませんよね?
#ただ単にプレビューといわれてもなんのプレビューなのかは誰にもわからんですよ

> 設定等で従来の仕様にする方法があればご指導ください。
>
MFCには設定ファイルみたいなものはありませんので、呼び出すソースをちょっといじります。
今までと何が変わったのか?は、MFCのソースを見れば一目瞭然(な場合もある)と言えるので
自分でちゃんと調査してください。

プレビュー以外にもいろんな所が変わってます。数え上げたらきりがないくらい。
とりあえず、MSDNで、旧バージョンとの違いを探しまくってください。
VC6->7 あるいは、7.1 などいっぱい違ってるところがあるんで...
7.x -> 8 も結構変わってたりします。
#ちなみに、MFC8はVistaに対応してないので注意してくださいね。


> ◆仕様のちがい
> プレビューウィンドウが、VS6.0ではメインウィンドウ一杯の大きさに
> 表示されていましたが、VS2005ではアクティブな子ウィンドウに対応して
> 表示されるようになりました。
>
フレームウィンドウのデフォルトが GetParentFrame() に変わったので
VC6同様、AfxGetMainWnd() を指定してください。
#どこかわからんならまずヘルプをくまなく探してくださいね。

でも、記憶が正しければここの部分は、VC6から変わったはずなんですが...?


> ◆困っていること
> ・プレビューウィンドウの「X」をクリックすると、プレビューウィンドウとともに
>  対応する子ウィンドウも閉じてしまいます。従来は子ウィンドウが閉じることは
>  ありませんでした。
> ・プレビューウィンドウのサイズを変更してから「閉じる」ボタンをクリックすると、
>  対応する子ウィンドウのサイズ変わってしまいます。(プレビューウィンドウの
>  サイズが用いられるようです)
>  従来は、子ウィンドウのサイズが変わることはありませんでした。
> ・子ウィンドウが複数あると、各々についてプレビューが表示できてしまいます。
>  従来はプレビュー表示中はメインウィンドウのメニューが隠れたので
>  プレビューを複数表示することはできませんでした。
>
このあたりは、どのフレームでプレビューするか?に影響を受けるところなので、
とりあえずは後回しでもよさそうなところかと。


いずれにしても、VC6のときのソースをそのままはダメな場合もあるので
ちゃんと調査しましょう。
STLも実装が全然違ってるので、依存コード書いてると確実にバグります。
vector や auto_ptr のように仕様が変わったものもあります。
10年近い年月差はいかんともしがたいものがあります。
なにせ、その間に C++ が標準化されたんですから。

引用返信 編集キー/
■33397 / inTopicNo.3)  Re[2]: プレビューの仕様
□投稿者/ おへそ七 (2回)-(2009/02/27(Fri) 13:22:06)
とっちゃんさん、お返事をありがとうございました。

> MDIで、MFCで子ウィンドウにプレビューなので、印刷プレビューと
> 決めつけましたが間違ってませんよね?

はい「印刷プレビュー」のことです。
言葉が足りず、すみません。

> フレームウィンドウのデフォルトが GetParentFrame() に変わったので
> VC6同様、AfxGetMainWnd() を指定してください。

CView::DoPrintPreview()の中に「CWnd* pMainWnd = GetParentFrame()」
という記述がありましたので、ここを修正してみようと思い
DoPrintPreview()を派生させましたが、「protectedメンバにアクセス」
のコンパイルエラー(CViewViewのメンバを参照している)が解消できず
先へ進めない状況です。

> #どこかわからんならまずヘルプをくまなく探してくださいね。

VS2005のヘルプやネットを探しましたが、やりかたが下手なせいか
解決につながる記事を見つけ出すことができませんでした。

大変恐縮ですが、引き続きご指導お願いいたします。

引用返信 編集キー/
■33414 / inTopicNo.4)  Re[3]: プレビューの仕様
□投稿者/ とっちゃん (375回)-(2009/02/27(Fri) 16:51:44)
とっちゃん さんの Web サイト
No33397 (おへそ七 さん) に返信
> CView::DoPrintPreview()の中に「CWnd* pMainWnd = GetParentFrame()」
> という記述がありましたので、ここを修正してみようと思い
> DoPrintPreview()を派生させましたが、「protectedメンバにアクセス」
> のコンパイルエラー(CViewViewのメンバを参照している)が解消できず
> 先へ進めない状況です。
>
CPreviewView::m_pPreviewState のあたりですか?
自分のコード見たら、CPreviewViewも派生してましたw

ちと、チェックしてみましたけど、DoPrintPreview をオーバーライドせずに
フレームウィンドウをトップにするのは無理みたいなので、いくつかのfriend定義もオーバーライドが必要です。

MFCの印刷回りは、あちこちで密約関係を結んでおり(C++的には、friend class CHoge となりますがw)
うまいこと回避「できない」ように作られています。

そのため、カスタマイズする場合は、それぞれに派生クラスを用意して新たな密約関係を結びなおすという
なんだか泥臭い手法を取らなければならない部分があります。


>>#どこかわからんならまずヘルプをくまなく探してくださいね。
>
互換性のところとかたどっていくといろいろ書いてますよ。
消えちゃったものとかもあるような気はしますが...


> VS2005のヘルプやネットを探しましたが、やりかたが下手なせいか
> 解決につながる記事を見つけ出すことができませんでした。
>
ネットを探すなら英語圏も行かないときついと思いますよ。
VS2002以降日本語のWin32Nativeなネタはほとんどないですから。

引用返信 編集キー/
■33431 / inTopicNo.5)  Re[4]: プレビューの仕様
□投稿者/ Jitta on the way (278回)-(2009/02/27(Fri) 20:33:13)
No33414 (とっちゃん さん) に返信
> VS2002以降日本語のWin32Nativeなネタはほとんどないですから。
>
うん。ぜんぜん更新されてない。いっそすがすがしい(笑)
引用返信 編集キー/
■33530 / inTopicNo.6)  Re[5]: プレビューの仕様
□投稿者/ おへそ七 (3回)-(2009/03/03(Tue) 14:20:48)
とっちゃんさん、色々とご指導をありがとうございました。
Jitta on the way さん、コメントをありがとうございました。
だいたい希望するかたちになりそうです。
前後関係の理解がまだ不十分ですが、コードの要点を下にまとめておきます。

BEGIN_MESSAGE_MAP(CXView, CView)
  <中略>
 ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CXView::OnFilePrintPreview) // CView→CXView
END_MESSAGE_MAP()


// CView::OnFilePrintPreview()をコピーして一部修正
void CXView::OnFilePrintPreview()
{
 bXPreview = TRUE; // add
   <中略>
  if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
        RUNTIME_CLASS(CXPreviewView), pState)) // CPreviewView→CXPreviewView
   <中略>
}

// CView::DoPrintPreview()をコピーして一部修正
BOOL CXView::DoPrintPreview(UINT nIDResource, CView* pPrintView, CRuntimeClass* pPreviewViewClass, CPrintPreviewState* pState)
{
  <中略>
 CWnd* pMainWnd = AfxGetMainWnd(); // GetParentFrame()→AfxGetMainWnd()
  <中略>
 CXPreviewView* pView = (CXPreviewView*)pPreviewViewClass->CreateObject(); // CPreviewView→CXPreviewView
  <中略>
 CXView* pActiveView = (CXView*)pParent->GetActiveFrame()->GetActiveView(); // CView→CXView
  <中略>
}

// CView::OnEndPrintPreview()をコピーして一部修正
void CXView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT, CXPreviewView* pView)
 // CPreviewView→CXPreviewView
{
  <中略>
 if (pView->m_pPrintView != NULL)
  ((CXView*)(pView->m_pPrintView))->OnEndPrinting(pDC, pInfo); // (CXView*)

 CWnd* pMainWnd = AfxGetMainWnd(); // GetParentFrame()→AfxGetMainWnd()
  <中略>
 bXPreview = FALSE; // add
}

----

class CXPreviewView : public CPreviewView
{
 DECLARE_DYNCREATE(CXPreviewView)

protected:
 DECLARE_MESSAGE_MAP()

public:
 void OnPreviewClose();
 void OnPreviewPrint();

 friend class CXView;
};

----

IMPLEMENT_DYNCREATE(CXPreviewView, CPreviewView)

BEGIN_MESSAGE_MAP(CXPreviewView, CPreviewView)
 ON_COMMAND(AFX_ID_PREVIEW_CLOSE, &CXPreviewView::OnPreviewClose)
 ON_COMMAND(AFX_ID_PREVIEW_PRINT, &CXPreviewView::OnPreviewPrint)
END_MESSAGE_MAP()


// CPreviewView::OnPreviewClose()をコピーして修正
void CXPreviewView::OnPreviewClose()
{
 CWnd* pMainWnd = AfxGetMainWnd(); // GetParentFrame()→AfxGetMainWnd()
  <中略>
 ((CXView*)m_pOrigView)->OnEndPrintPreview(m_pPreviewDC, m_pPreviewInfo, // (CXView*)
         CPoint(0, 0), this);
}

// CPreviewView::OnPreviewPrint()をコピー
void CXPreviewView::OnPreviewPrint()
{
  <中略>
}

----

BOOL bXPreview = FALSE; // add プレビューを表示中

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  <中略>
 ON_WM_CLOSE() // add
END_MESSAGE_MAP()

void CMainFrame::OnClose()
{
 // プレビュー時は「×」ボタンを無視
 // 通常時は「×」ボタンで閉じる
 if(!bXPreview)
 {
  CMDIFrameWnd::OnClose();
 }
}

以上です。
ありがとうございました。

環境:VS2005

引用返信 編集キー/
■33532 / inTopicNo.7)  Re[6]: プレビューの仕様
□投稿者/ おへそ七 (4回)-(2009/03/03(Tue) 14:24:55)
チェックを忘れました。
一応、解決とさせていただきます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -