CMDIFrameWndExの仕様なのでしょうか? – 固定ページ 2 – プログラミング – Home

CMDIFrameWndExの仕様なの...
 
通知
すべてクリア

[解決済] CMDIFrameWndExの仕様なのでしょうか?

固定ページ 2 / 3

仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>の方も再現できません。

検証ありがとうございます。
VS2010だと直っているようですね。
対策を放棄してて正解だったかもしれません(vv;)。


返信引用
tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
 

直接関係無い話題ですみませんが
こういうのってVS2008にもSPxとかでサポートされるんですかね?
配布用ファイルとか…


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

aetosさん

報告ありがとうございます。
こちらでもVisual Studio 2010 pro + WinXP SP3でテストした所、
下線が縦・横ともに表示されているのを確認しました。

MFCのソースを確認したところ、
afxGlobalData.m_bUnderlineKeyboardShortcutsメンバの
状態により、下線のON/OFFをしており、この変数は
SPI_GETMENUUNDERLINESキーによる、システムの設定値を
保持していました。

システム設定を利用する方式に変更してくれたのはありがたいです。

なお、ファイル名に&を付けたファイルに対し、
FWS_PREFIXTITLEを外してみてもファイル名が下線に変換されていたので
まだ直ってないみたいです。

エッジ線のほうですが、直っていないみたいですが...
OSによって、違いがでるのかな?


返信引用
hirocco
 hirocco
(@hirocco)
ゲスト
結合: 14年前
投稿: 138
Topic starter  

.netFrameWork的にも2.0で間に合ってますし,納める先もXP希望というトコロがほとんど
で,VS10に切り替える必要性もない感じで,しかも余裕もないですので,希望はVS9のSP2が
出ると嬉しいですね
本題とは関係ないですけど,メニューバーもドッキングで固定にできないのは,なんか感
じ悪いです →CMFCMenuBarをサブクラス化しちゃいましたけど…
それと,クラス名にMFCって入れるのってかっこいいんですかねぇ


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> なお、ファイル名に&を付けたファイルに対し、
> FWS_PREFIXTITLEを外してみてもファイル名が下線に変換されていたので
> まだ直ってないみたいです。

> エッジ線のほうですが、直っていないみたいですが...

リボンを使うアプリケーションだといずれも 2010 で再現しました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

というわけでフィードバックしました。投票をお願いいたします。
VS2010 をお持ちの方は再現試験をして頂き、右側の「再現できます」のところもクリッ
クして頂けると助かります。

https://connect.microsoft.com/VisualStudioJapan/feedback/details/626013/vc-
2010-mfc
https://connect.microsoft.com/VisualStudioJapan/feedback/details/626016/vc-
2010-mfc-mdi-ws-ex-clientedge


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

aetosさん

ファイル名の件ですが、
リボンで再現するのは、外観が[Office2007]だからです。
リボンなしでも概観を同じにすると発生します。
以前付けたリンクに説明を付けていたのでしたが、再度補足するべきでした。
2010では概観に[Windows7]が追加されていますが、そちらでも再現を確認できました。

エッジ線のほうですが、リボンなしでも概観も関係なく
WinXP SP3上で発生しますが...

ファイル名についての解決策というか、Microsoftに修正してもらいたいのは、
関数
CMFCVisualManagerOffice2007::DrawNcText()
CMFCVisualManagerWidows7::DrawNcText()

afxvisualmanageroffice2007.cpp(1942行)
afxvisualmanagerwindos7.cpp(360行)
#Visual Studio2010のMFCソース

DWORD dwTextStyle = DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | (bIsRTL ?
DT_RTLREADING : 0);

DWORD dwTextStyle = DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | (bIsRTL ?
DT_RTLREADING : 0) | ((!bPrefix) ? DT_NOPREFIX : 0) ;

としてくれるだけで良いのですが。
CMFCVisualManagerWidows7::DrawNcText()についてはvirtualが付いているので
派生して対処できるのですが、CMFCVisualManagerOffice2007()には付いて
いないのです。

この件については、コメント追記しておきました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

んー…

VS2010 で、タブを OFF にした以外は全部デフォルトの状態、つまり、

・アプリケーションの種類:MDI(非タブ)
・プロジェクト形式:Visual Studio
・Visual スタイルと色:Visual Studio 2008
・コマンドバー:メニューバーとツールバーを使用する

でプロジェクトを作って、名前に & を含むファイルを開いても、子ウィンドウを最大化
したまま閉じても、現象が再現しません。

デフォルトのスタイルが VS2008 なので、

・ファイルを開く&子ウィンドウ最大化してからスタイルを Office2007 に変更
・スタイルを Office2007 に変更してからファイルを開く&子ウィンドウ最大化

のいずれでも正常に動きます。

また、プロジェクト作成時のデフォルトのスタイルを Office2007 にしても同様です。

これら再現しないケースでは、
> afxvisualmanageroffice2007.cpp(1942行)
を通っていないようです。

ちなみに、こちらの OS は Win2008R2 です。

OS 依存の問題かどうか切り分けたいので、よろしければ、XP で現象が発生するプロジ
ェクト一式を Connect のページにアップロードして頂けませんでしょうか。


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

aetosさん

アップロードする必要もなく、提示されたのと同じ設定で、
ウィザード作成したプロジェクトです。
追加で
CMainFrame::PreCreateWindow()

cs.style &= ~FWS_PREFIXTITLE;
を追加しているだけです。

自宅ではVista+Visual Studio2008しかないのですが、

1.エッジ線はリボンの有無関係なく消えます
2.ファイル名については、正常に&表示し、リボンの時だけ下線
ファイル名に関しては、2008/2010関係なく同じ症状のようです。

この場合も私が提示した部分のソースは通りませんでした。
#リボン+Office2007の場合のみ通る

Vista上ではタイトルバーが独自描画されないので、もしやとは思いましたが
OS依存の可能性が高そうですね。
リボンの場合は、独自のタイトルバーを形成しているので影響がでるのかもしれませ
ん。

# 2010でテストしたいところですが、バージョンアップしていないので...


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

一度、問題について整理しましょう。

以下の2点があります。
1:名前に & を含むファイルを開くと、タイトルバーに & ではなく下線が表示される
2:非タブ MDI の子ウィンドウを最大化したまま閉じると、MDI クライアントエリアの
 WS_EX_CLIENTEDGE スタイルが復活しない。

1 は、Windows XP、Windows 2008 R2 ともに、VS2008 でも VS2010 でも、
リボンの場合のみ発生します。

2 は、VS2008 on Windows XP の環境ではリボンでなくても発生します。
VS2010 on Windows 2008 R2 の環境では、リボンでしか再現しません。

ということで間違いないですか?

問題 2 について、VS2008 on Windows 2008 R2 の環境で再現することを確認しました。
したがってこの問題は(リボン不使用の場合については)、OS 依存ではなく、VS2010
で修正された問題ということですね。

問題 1 も、どちらの環境でも発生していることから OS 依存ではなさそうです。

ところで…
アプリケーション ウィザードの最初のページで、Office2007 / Windows7 以外のテーマ
を選んでいても、後のページでリボンを使うようにすると、実行時には Office2007 /
Windows7 しか選べなくなりますね。
が、初回実行時には最初に選んだスタイルが使われているわけで、その場合でも下線の
問題が発生しました。
というわけで、Office2007 / Windows7 スタイルだけの問題ではない気がします。
ただ、ウィザードのバグと言えないこともないですが。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

しかし、VisualManager は気持ち悪い継承階層ですね。

CMFCBaseVisualManager
└CMFCVisualManager
 ├CMFCVisualManagerOfficeXP
 |└CMFCVisualManagerOffice2003
 | ├CMFCVisualManagerOffice2007
 | └CMFCVisualManagerVS2005
 |  └CMFCVisualManagerVS2008
 └CMFCVisualManagerWindows
  └CMFCVisualManagerWindows7

もうちょっと抽象的にできなかったのでしょうか。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

# あ、こうだった。
# どうでもいいけどw

CMFCBaseVisualManager
└CMFCVisualManager
 └CMFCVisualManagerOfficeXP
  ├CMFCVisualManagerOffice2003
  |├CMFCVisualManagerOffice2007
  |└CMFCVisualManagerVS2005
  | └CMFCVisualManagerVS2008
  └CMFCVisualManagerWindows
   └CMFCVisualManagerWindows7


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

aetosさん

> 一度、問題について整理しましょう。
整理ありがとうございます。
こちらでテストした内容を加えると

1 は、Windows Vista、Windows 2008 R2 ともに、VS2008 でも VS2010 でも、
リボンの場合のみ発生します。
※Vista+VS2010については、今夜確認します。(exeのみのチェックになりますが
がたぶん同じことだと思います。)
Windows XPではリボンなしだと概観を[Office 2007]を指定すると発生し、
リボン時には発生。([Windows7]では発生しませんでした。)

2 は、VS2008 on Windows XP/Vista の環境ではリボンでなくても発生します。
VS2010 on Windows 2008 R2 の環境では、リボンでしか再現しません。
VS2010 on Windows XP SP3 の環境では、リボンでなくても発生します。

>アプリケーション ウィザードの最初のページで、Office2007 / Windows7 以外のテー

>を選んでいても、後のページでリボンを使うようにすると、実行時には Office2007 /
>Windows7 しか選べなくなりますね。
>が、初回実行時には最初に選んだスタイルが使われているわけで、その場合でも下線の
>問題が発生しました。
>になります。
たしかにリボンを使用するときは選択できるテーマがこの2種しかないので、気がつき
ませんでした。
そこで各CVisualManager*クラスのソースを確認してみると、
リボンのキャプションの描画ですが、全てDT_NOPREFIXフラグが指定されていませんでし
た。

リボンのキャプションはCVisualManager*::OnDrawRibbonCaption()で描画します。
#*は選択したテーマ名

テーマが[Office2007]/[Windows7]に関しては、そこからDrawNcText()が呼ばれます。

WindowsXP+テーマがOffice2007+リボンなしで発生する原因ですが、

CVisualManager*::IsOwnerDrawCaption()が有効のとき、タイトルの独自描画を
行うようになっていますが、テーマが[Office2007]以外では無効でした。
さらに、CMFCVisualManagerOffice2007クラスのソースを追っていくと
DWMが実装されていないOS+リボンを使用していない場合は、
独自描画を行う条件になっていました。

つまり、Windows 2008ではDWMが実装されているのでデフォルトのタイトル描画と
なるので、発生しないことに納得がいきます。
Aeroを無効にすれば発生するかもしれませんので、試してもらえないでしょうか?


返信引用
えーと
 えーと
(@えーと)
ゲスト
結合: 19年前
投稿: 54
 

> リボン時には発生。([Windows7]では発生しませんでした。)

ではなく、
リボン時には発生。(リボンなし+[Windows7]では発生しませんでした。)
です。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> VS2010 on Windows XP SP3 の環境では、リボンでなくても発生します。

ええ、ってことはやっぱり OS 依存の部分があるってことですか…

> Aeroを無効にすれば発生するかもしれませんので、試してもらえないでしょうか?

Windows 2008 R2 Aero 無効の非リボン アプリケーションで再現することを確認しまし
た。

詳細な検証、ありがとうございます。
是非 Connect にフィードバックして頂きたいと思います。
お願いできますでしょうか。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました