• ベストアンサー

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

通常、ウィンドウをドラッグするとウィンドウの真中は透明になって外枠はちょっと太目の半透明な線になりますよね。 これが付箋紙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

  • ホームページのサムネイル画像の外枠を消したい

    ホームページビルダー15でホームページを製作中の初心者です。 サムネイルを使って画像を入れると画像の周りに外枠が表示されます。外枠の線を何とか消そうと試みていますがうまくいきません。 ページ編集のところでは画像の周りは点線の外枠に囲まれていますが、プレビューで見ると線で囲まれています。 外枠の線を画像のサイズと同じ大きさにしようと思っても、ある一定の大きさ以上は小さく出来ません。 この外枠は消えない性質のものなのでしょうか? 消す方法があればやり方を詳しく教えて下さい。お願いします。 OSは、Windows7 Professional ホームページビルダー15を使用しています。 タグ打ちはほとんど出来ません。

  • ウィンドウの再描画

    よろしくお願い致します。 環境 WIN98 VC++6.0 MFC にて ウィンドウをクリックしてダイアログを表示。 ダイアログのボタン押し下げでウィンドウを再描画させたいのですがどうすれば良いですか?

  • ドラックの軽量化

    XPでマイコンピュータ等のファイルをドラックするときに標準仕様だと外枠が青い線で中が淡い青になると思うのですが、これをデスクトップでドラックするときのように外枠を点線で中は色変化なしにしたいのですが、どこで変更できますか? どうも外枠が青線だと重いらしく、動きがあまりにもスムーズではなくドラックしにくいのでご存知でしたら教えてください。

  • 写真の外枠をかっこよくしたい

     WinXP(Office2003)を使っています。写真の四角い外枠をかっこよい形にしたいのです。じつは何年か前にやっているのですが、やり方を忘れてしまいました。このときは、外枠を太目の線の束のようなもので囲っています。インターネットでトリミングで検索すると、外枠ではなく中の写真がトリミングされ、外枠は四角いままです。もちろん四角いままでいいのですが、例えば、木の葉で覆われている四角だとかにならないのかと思っています。持っているソフトは、以下の通りですが以前やったことがあるということは、このうちのどれかでやったと思います。   Roxio Creater 2010   Windows 付属ペイント   ホームページビルダー内の「ウエブアートデザイナー」   Pictbear   ワード2003   ラベルマイティ   筆まめ   Picasa3

  • スプラッシュウィンドウの出し方

    よろしくお願いします。 環境 WIN98 VC++6.0 MFC SDIにて スプラッシュウィンドウの出し方ですが、 「プロジェクト」「プロジェクトに追加」「コンポーネント及びコントロール」でコンポーネントギャラリーを開く。 とありました。 自分が実際に出したい絵はどうすれば出せるのですか?

  • ウィンドウを作成するには

    win98 VC++6.0 MFCにて 今ふと疑問に思ったのですが、 ダイアログのボタンを押すと、何かウィンドウが開き、続けてボタンを押すと、新たにまたウィンドウが開くようなプログラムはどうすれば実現できるのでしょうか? 参考になるサイトなどありますでしょうか?

  • デスクトップ画面での情報の取得方法は?

    こんにちは。 環境はWIN2000、VC6.0 MFCを使用しています。 質問なのですが、 デスクトップ画面上でアイコンをドラッグ&ドロップしていたり、 マウスで範囲を選択していたりしているかどうかを知りたいのですが、 なにか方法があるでしょうか? どうぞ宜しくお願いします。

  • SDIのクライアント領域に子ウィンドウを生成するには?

    環境 Win98 VC++6.0 MFCにて http://www.kumei.ne.jp/c_lang/sdk/sdk_50.htm ↑のように、SDIにてクライアント領域に子ウィンドウを生成するには、MFCの場合どうすれば良いのでしょうか? いつも質問ばかりで申し訳ありません。 ご存知の方お願いいたします。

  • フリーソフトrapture windows7で

    仕様環境 windows7 フリーソフトraptureを愛用しています。 画面の指定範囲を切り取って付箋のようにできるソフトフリーソフトなのですが、 WindowsXPの時には、付箋ウィンドウはいくつでも同時に表示させておくことが可能だったのに、windows7になって、付箋ウインドウが1個しか作動しなくなり、不便に感じています。 解決策ご存知の方、おられましたらよろしくお願いします。

  • マウスで線を引きたいのです。

    開発環境: WinNT4.0,VC++6.0 マウスの左ボタンを押したままドラッグした時、クリックした位置と現在のマウス位置の間を線で結びたいのです。 (DeskTop上でマウスのドラッグでファイルを選ぶ時四角い点線が現れるのと似たような動きですね。ー>DrawDragRect()) 確かにBitBltとMoveTo,LineToを使えばかけますが、バックイメージが重いもので画面がちらづきます。 何か言い方法があれば教えてください。 よろしくお願いします。