• ベストアンサー

ウィンドウの外枠について

通常、ウィンドウをドラッグするとウィンドウの真中は透明になって外枠はちょっと太目の半透明な線になりますよね。 これが付箋紙95というソフトでは外枠が1本の細い点線になるのですが、このようにするにはウィンドウスタイルをどう設定すれば良いのでしょうか? 環境 WIN98 VC++6.0 MFC にて

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.7

>今困っている不具合現象は、付箋が再描画されるときに、 >この縁が灰色からすぐに黄色に変わらなかったり、 >灰色のままで変わらないことがあることです。 >宜しくお願い致します。 せっかくヒントも書いてあるんだから全部読んでね。 >#個人的にはこんなことしないで、WS_THICKFRAMEをつけて、WM_NCPAINTで細いフレーム自分で書いちゃいますけどね。 非クライアント領域の描画タイミングはWM_NCPAINTが飛んできたときです。 WM_PAINTではありません。

VitaminBB
質問者

お礼

回答ありがとうございます。 補足に書いた方法でうまく行きました。

VitaminBB
質問者

補足

1.WS_THICKFRAMEを付けた場合 WM_NCPAINTに書くことで不具合現象は解決しました。 2.WS_THICKFRAMEを付けない場合 以下コードでウィンドウサイズ変更が可能になりました。 出典 http://www24.cds.ne.jp/~neg/pro/piyo1/dialog/resize.html struct { UINT num,uit; } tblnht[]={ 1,HTTOP, 2,HTRIGHT, 3,HTTOPRIGHT, 4,HTBOTTOM, 6,HTBOTTOMRIGHT, 8,HTLEFT, 9,HTTOPLEFT, 12,HTBOTTOMLEFT, 0,0}; UINT CTest0037Dlg::OnNcHitTest(CPoint point) {//WS_THICKFRAME // TODO:この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください RECT rect; UINT flg,i; GetWindowRect(&rect); flg=0; if(point.y<rect.top+16) flg|=1; if(point.y>rect.bottom-16) flg|=4; if(point.x<rect.left+16) flg|=8; if(point.x>rect.right-16) flg|=2; for(i=0;tblnht[i].num;++i) if(tblnht[i].num==flg) return(tblnht[i].uit); return CDialog::OnNcHitTest(point); }

その他の回答 (7)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.8

ほー、WM_NCHITTESTの応答でOKなんですか。 どうだろうとは思いましたが、適当なコード書いて試したけどできなかったもんで。間違えてたかな?(^^;; 作成された(元にされた)コード、なかなかシンプルでいいですね。

VitaminBB
質問者

お礼

どもども taka_tetsuさん。 久しぶりの質問でまた大変お世話になりました。 VC++にちょっと興味が薄れてしばらく遠ざかってましたが、久しぶりに触って苦労しました。 taka_tetsuさんに回答頂けて嬉しかったです。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.6

>しかしながらこの付箋の上を別のウインドウが移動したり、別のウィンドウで覆われた後の再描画時に一瞬縁がデフォルトの灰色になってしまいます。 「デフォルトの灰色」ってどこのデフォルトの色ですか? Windowsのデフォルトの色って個別に変えられたり、OSによって初期値が違うので、色だけいわれてもわからないのですが。

VitaminBB
質問者

補足

まずデフォルトという表現はなかったことにしてください。 以下のようにして作成したウィンドウの場合、縁は灰色になります。 lpszClassName = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, hCursor); dwExStyle = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_ACCEPTFILES | WS_EX_CONTROLPARENT; dwStyle = WS_POPUP | WS_VISIBLE| WS_CLIPSIBLINGS| WS_OVERLAPPED |WS_THICKFRAME; CreateEx( dwExStyle, lpszClassName, _T("付箋"), dwStyle, rect, parent, NULL, NULL) この縁をvoid CMyWnd::OnPaint() 内で黄色に塗り直しています。 int cyCaption = 4;//GetSystemMetrics(SM_CYCAPTION);//タイトルバーの高さを取得 int cxFrame = GetSystemMetrics(SM_CXFRAME); // フレームの幅 int cyFrame = GetSystemMetrics(SM_CYFRAME); // フレームの高さ COLORREF crCaption = RGB(250, 250, 120); // 塗りつぶす色 CRect rcWnd; GetWindowRect(rcWnd); CDC* pDC = GetWindowDC(); pDC->FillSolidRect(0, 0, rcWnd.Width(), cyCaption, crCaption);//フレーム上部 今困っている不具合現象は、付箋が再描画されるときに、この縁が灰色からすぐに黄色に変わらなかったり、灰色のままで変わらないことがあることです。 宜しくお願い致します。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

>ところで、サイズ変更ロジックのイメージが沸かないのですが。 > >マウスの座標を取得して、え~と、あれれ >この先ウインドウをどうやって書き直せばいいの?? まず、通常のウィンドウのサイズを変更するときのことを思い出しましょう。 たとえば、辺がクリックされた場合は、 1.左右又は上下の方向にのみ変更可能。 2.クリックされた辺の反対側の辺の両方の頂点の座標は変化しない。 3.左右の辺がクリックされた場合、マウスのy軸方向の動きは無視。上下の辺は同様にx軸方向の動きは無視。 ということを踏まえておいて、マウスの軌跡から新たなウィンドウの矩形を求める方法は考えてください。 #4角をクリックされたときは、また別に自分で考えて下さい。 で、大まかな処理の流れは、 1.WM_LBUTTONDOWNで座標を確認し、サイズの変更方法を決定。マウスダウンフラグでも立てておく。 2.WM_MOUSEMOVEがきたら、新たなウィンドウの矩形を算出し、MoveWindow等でサイズを変更する。 3.WM_LBUTTONUPが来たらフラグを戻す。 ですかね。 #個人的にはこんなことしないで、WS_THICKFRAMEをつけて、WM_NCPAINTで細いフレーム自分で書いちゃいますけどね。

VitaminBB
質問者

お礼

回答ありがとうございます。 MoveWindowを使うのですね。これが分かりませんでした。 あと実はどうしてこういうことをやろうとしてるかというと、今はクライアント領域と縁を黄色に塗り、またその周りを黒い線で囲っています。 これで見栄えは何の問題もありません。 しかしながらこの付箋の上を別のウインドウが移動したり、別のウィンドウで覆われた後の再描画時に一瞬縁がデフォルトの灰色になってしまいます。 これを回避する良い方法は無いでしょうか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>>dwExStyle = WS_EX_WINDOWEDGE; >これがダメなら何を指定すれば良いのでしょうか? 何も指定しない。 すなわち dwExStyle = 0; >ますます分かりません。 >どうしたらこんなことが出来るのですか?? ちゃんと読んでくださいね。 >WS_THICKFRAMEをはずして自分でサイズ変更のロジックを組むか、 >結局枠の部分も自分で描画するかのどちらかになります。 って書いてあるとおりでしょ。 自分で全部処理書けばできますよ。

VitaminBB
質問者

お礼

回答ありがとうございます。 すみませんちょっとあせってて色々見落としてました。 ところで、サイズ変更ロジックのイメージが沸かないのですが。 マウスの座標を取得して、え~と、あれれ この先ウインドウをどうやって書き直せばいいの?? まったく分かりません。 教えてください。お願いします。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>dwExStyle = WS_EX_WINDOWEDGE;//エッジを無くす うそ??? 「ウィンドウが盛り上がった縁の境界線を持つように指定します。」なんですが。 http://yokohama.cool.ne.jp/chokuto/urawaza/prm/extended_window_style.html >dwStyle = WS_VISIBLE | WS_POPUP | WS_BORDER | WS_THICKFRAME ; WS_BORDERっていります? 「境界線を持つウィンドウを作成します。」なんですけど。 http://yokohama.cool.ne.jp/chokuto/urawaza/prm/window_style.html >またエッジを完全に無くすとドラッグによるサイズ変更が出来なくなるのでしょうか? はい。最低限、サイズ変更枠が必要です。 WS_THICKFRAMEがあれば変更可能枠がつきます。 ということで 残った dwStyle = WS_VISIBLE | WS_POPUP | WS_THICKFRAME ; だけで十分かと これより細くしたいですか? 細くしたいのであれば、 WS_THICKFRAMEをはずして自分でサイズ変更のロジックを組むか、結局枠の部分も自分で描画するかのどちらかになります。 >付箋紙95はエッジが有るけれど、この幅が非常に狭いと思います。 で、そんなに他のウィンドウのスタイルが気になるのでしたら、Spy++を使って自分で調べてください。

VitaminBB
質問者

お礼

回答ありがとう御座います。 >dwExStyle = WS_EX_WINDOWEDGE; これがダメなら何を指定すれば良いのでしょうか? これがどうしても分かりませんので教えていただきたいのですが。

VitaminBB
質問者

補足

お礼の記述後の記述です。 スパイで調べたらこうなってました。 dwExStyle = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_ACCEPTFILES | WS_EX_CONTROLPARENT ; dwStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER | WS_OVERLAPPED ; WS_THICKFRAMEが無いのにウィンドウサイズをドラッグで変えることが出来ます。 ますます分かりません。 どうしたらこんなことが出来るのですか??

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>タイトルバーを無しにしても、更にその外側にエッジ部がありますよね。 つければありますけど、つけなきゃないはずなんですが。 どんなスタイルを指定して作成しているんですか?

VitaminBB
質問者

お礼

回答ありがとう御座います。 今は試行錯誤の末こうしてます。 dwExStyle = WS_EX_WINDOWEDGE;//エッジを無くす dwStyle = WS_VISIBLE | WS_POPUP | WS_BORDER | WS_THICKFRAME ;

VitaminBB
質問者

補足

付箋紙95はエッジが有るけれど、この幅が非常に狭いと思います。 またエッジを完全に無くすとドラッグによるサイズ変更が出来なくなるのでしょうか? そうでしたら、エッジが有っても良いのですが、付箋紙95のように狭くしたいのです。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>通常、ウィンドウをドラッグするとウィンドウの真中は透明になって外枠はちょっと太目の半透明な線になりますよね。 ドラッグ中にウィンドウの内容を表示する設定になっていなければそうなりますね。 >これが付箋紙95というソフトでは外枠が1本の細い点線になるのですが、このようにするにはウィンドウスタイルをどう設定すれば良いのでしょうか? 自分で描く。 タイトルバーがあるような普通のウィンドウじゃないでしょ?<付箋。

VitaminBB
質問者

お礼

回答ありがとう御座います。 >タイトルバーがあるような普通のウィンドウじゃないでしょ? そうです。 最終的にやりたいことは一緒なので、ちょっと質問内容を変えさせてください。 タイトルバーを無しにしても、更にその外側にエッジ部がありますよね。 このエッジを付箋紙95のように無くすか または 通常より幅を狭くして無いように見せかけたいのですが、どうやったら出来るのでしょうか?

関連するQ&A