リボンコントロールでサイズ固定枠にしたい – プログラミング – Home

リボンコントロールでサイズ固定枠にした...
 
通知
すべてクリア

[解決済] リボンコントロールでサイズ固定枠にしたい


傾奇者
 傾奇者
(@傾奇者)
ゲスト
結合: 14年前
投稿: 35
Topic starter  

VS2010 C++ MFC SDI CFormView です。
メニューバーとツールバーに代えてリボンコントロールにしたいのですが、ウインドウ
枠がサイズ変更枠になってしまいます。
CFormViewなのでサイズ固定枠にしたいです。どなたかヒントでもいいですから教えてく
ださい。

<詳細>
VS2010のウィザードで、シングルドキュメント・MFC標準・Office2007青のテーマを選択
して進み、「サイズ変更枠」がONになっているのでこれをOFFにしますが、「リボ
ンの使用」を選択すると、自動的にサイズ変更枠がONになってグレー表示に変わりま
す。
仕方なくこのまま進みビルドすると、もちろんサイズ変更枠になります。

CMainFrame::PreCreateWindow(CREATESTRUCT& cs)を見ると、
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE | WS_THICKFRAME |
WS_MINIMIZEBOX | WS_SYSMENU;
となっているので、WS_THICKFRAME を削除してみました。
サイズ固定枠にはなるのですが、白色の枠で見た目が悪いです。

よろしくお願いいたします。


引用未解決
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

2008 on Xpしかないので、それでやってみましたが、
メインフレームのWM_CREATE(OnCreate)の最後で、

LONG_PTR style = ::GetWindowLongPtr( m_hWnd, GWL_STYLE);
style |= ( WS_BORDER | WS_DLGFRAME );
::SetWindowLongPtr( m_hWnd, GWL_STYLE, style);
::RedrawWindow( m_hWnd, NULL, NULL, RDW_FRAME);

とすると、見た目は通常ウインドウで、サイズ変更ができない
ウインドウができます。


返信引用
傾奇者
 傾奇者
(@傾奇者)
ゲスト
結合: 14年前
投稿: 35
Topic starter  

仲澤@失業者 様、ご教示ありがとうございました。
やってみましたが、結果に変わりはありませんでした。
すなわち、ご教示戴いた4行を追加しても、CMainFrame::PreCreateWindow の中の
cs.style に WS_THICKFRAME が無いときは白色のサイズ固定枠となり、WS_THICKFRAME
があるとサイズ変更枠になります。


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

ですか。
では、WS_THICKFRAME状態のまま、WM_NCHITTESTをオーバーライドして、
サイズ変更枠上ならHTCLIENTを戻す。しかないかもしれません。

ただし、今やってみたら底辺部分はAfx:RibbonStatusBar・・・に
覆われてしまっているので、このこのWM_NCHITTEST処理相当部分にも
対策が必要なようですね(vv;)。


返信引用
傾奇者
 傾奇者
(@傾奇者)
ゲスト
結合: 14年前
投稿: 35
Topic starter  

> WS_THICKFRAME状態のまま、WM_NCHITTESTをオーバーライドして、
> サイズ変更枠上ならHTCLIENTを戻す。

やってみました。
サイズ変更枠上でマウスが無反応となり、矢印マークが出ないので、一応OKです。
底辺部も矢印マークは出ません。
しかし、右上のシステムメニュー:Xマーク(閉じる)、-マーク(最小化)も無反応
になっています。
左上の大きなメインボタンは有効です。
もう少し工夫が必要ですが、これで進めてみようと思います。
ありがとうございました。


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

派生元のOnNcHitTest()をコールした結果で判断します。
UINT MousePos = 派生元::OnNcHitTest();
switch( MousePos){
case HTBOTTOM: return HTCLIENT; // クライアントに強制
case HTCAPTION: return MousePos; // 元の処理を続行
:
:
}
とか。


返信引用
傾奇者
 傾奇者
(@傾奇者)
ゲスト
結合: 14年前
投稿: 35
Topic starter  

仲澤@失業者 様
失礼しました。一応解決と考えて、そのまま進めていました。

> UINT MousePos = 派生元::OnNcHitTest();
> switch( MousePos){
> case HTBOTTOM: return HTCLIENT; // クライアントに強制
> case HTCAPTION: return MousePos; // 元の処理を続行

このコードをどこに書けばいいのでしょうか? 派生元とは?
初心者なので理解がよくできていません。
現在、CMainFrame にオーバーライドして、次のコードを書いています。

LRESULT CMainFrame::OnNcHitTest(CPoint point)
{
CRect rc;
GetClientRect(rc);
ScreenToClient(&point);
if (point.x < 0 || point.x > rc.right || point.y < rc.top || point.y >
rc.bottom)
return HTCLIENT;
else return CFrameWndEx::OnNcHitTest(point);
}

これで、左右および底辺の枠上では、サイズ変更の矢印が出ません。
上辺では、矢印が出てサイズ変更可能となっています。
よろしくお願いいたします。


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

WM_NCHITTESTのマニュアルにある通り、このメッセージはシステムが
発行し、アプリがそのの問い合わせに対して、現在のマウス位置が
どこにあるのかの「場所種別」みたいなコードを戻します。
オーバーライドしなければ真実の値を戻すコードになるわけですね。
つまりCFrameWndEx::OnNcHitTest(point);は正しい「場所種別」
を戻すはずです。これを利用したらどうですかといっているわけです。
さて、提示されたコードで初めて「派生元」が明らかになったので、
自分の提示したコードは次のように書き換えられます。

UINT MousePos = CFrameWndEx::OnNcHitTest(); //正しい値
switch( MousePos){
case HTBOTTOM: return HTCLIENT; // クライアントに強制した
case HTCAPTION: return MousePos; // 元の値ののまま処理を続行
:
:
}


返信引用
傾奇者
 傾奇者
(@傾奇者)
ゲスト
結合: 14年前
投稿: 35
Topic starter  

午前中に示したコードの代わりに、教えて戴いたコードを書きました。
case として、HTTOP, HTBOTTOM, HTLEFT, HTRIGHT, HTTOPLEFT, HTTOPRIGHT,
HTBOTTOMLEFT, HTBOTTOMRIGHT で「HTCLIENT」を返すようにし、default で MousePos
を返すようにしました。
左右と底辺および4隅ではサイズ変更の矢印が出ませんが、上辺で縦向きの矢印および
右下にある「ペイン2」の四角形の右上部で斜めの矢印が出ます。
HTTOP でも HTCAPTION でも駄目です。
しかし、コードとしてすっきりしたので、これで進めようと思います。
ありがとうございました。


返信引用
傾奇者
 傾奇者
(@傾奇者)
ゲスト
結合: 14年前
投稿: 35
Topic starter  

ステータスバーを付けないことにしました。
これで、サイズ変更の矢印が出るのは上辺のみとなり、何とか実用に供せるでしょう。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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