HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0612
チャーくん (テスト期間)タイトルバーに直接描画3解決


チャーくん (テスト期間)

リンク

2016/6/12(Sun) 11:23:49|NO.75852

お久しぶりです

ChromeとかFirefoxとかのタブブラウザって、タイトルバー部分にタブを描画していますよね。
あんな感じでタブブラウザを作ろうと思って、オーナーウィンドウを使ってやってみたの
ですが、なんかごまかしてる感がしてきたので、タイトルバーに直接描画したい…
と思うようになってきたのです。

で、探したら http://kitano.plala.jp/~kitano/winfaq/9/9-1.htm を見つけましたが、
ウィンドウメッセージをハンドルとか、WM_NCPAINTの処理とかよくわからなかったので、
どのように処理をしているのかを教えていただきたいです。



この記事に返信する


InoueSoftware

リンク

2016/6/12(Sun) 15:20:33|NO.75855

WM_NCPAINTの処理の仕方

非クライアント領域に変更があった場合に、WM_NC〜系のメッセージが来る

WM_NCPAINTやWM_NCACTIVATEが来た場合
1.GetWindowDCで、非クライアント領域を含むウィンドウのデバイスコンテキストを取得。
2.DefWindowProcで、いったんシステムに描画させる(リセット)。
3.GetSystemMetricsで、タイトルバーの高さなどを取得。
4.FillRectなどで描画。

WM_NCLBUTTONUPやWM_NCMOUSEMOVEやWM_NCLBUTTONDOWNが来た場合
1.マウスの座標を取得して、それに応じた描画をする。



掘木

リンク

2016/6/12(Sun) 16:23:33|NO.75856

うーん?
なんか質問内容を見る限りではキャプションの描画を弄るより、
「枠なしウィンドウ(bgscr)に自前で枠を作る」
方が近そうに思えるんですけど・・・
(WS_SYSMENUを追加して、WM_NCHITTESTの返り値でキャプション相当エリア、各8方向伸縮などなど振り分ける)


本題ですが、
ウィンドウメッセージのハンドルってのは、メッセージ処理を捕まえるって事。
HSPで言うところのoncmdです。で、捕まえた結果キャプションバー等に何か描画するのですが、
当然のようにHSP命令では描画できないのでWinAPI関数群で描画することになります。
(TextOutだとかFillRectだとか)
1)oncmd gosubでWM_NCPAINTを捕まえる。
2)必要であれば、DefWindowProcAを呼んでWindows標準の外枠を描いてもらう
3)自ウィンドウのハンドルから外枠を含むデバイスコンテキストを取得
  (取得方法はBeginPaintではなくGetWindowDC。WM_PAINTとは違う。)
4)デバイスコンテキストに好き勝手に描画する。
5)取得したデバイスコンテキストを解放する。
6)return 0で処理を完了する。(返り値の0は省略できません。)
同様にWM_NCACTIVATEの際もやる必要があるらしいとか書いてあるのでやってみるといいかも。

この方法でいくのなら、
http://eternalwindows.jp/graphics/repaint/repaint06.html
一応こちらもそれっぽいことが書いてあるので(Cですが)頑張って読んだら分かるかも。

ちなみに、WM_NCHITTESTは$0084、WM_NCPAINTは$0085、WM_NCACTIVATEは$0086です。



チャーくん (テスト期間)

リンク

2016/6/15(Wed) 21:22:13|NO.75887

>InoueSoftware さん
 なるほど…
 非クライアント領域に描画するのはFillRectとかでできるんですね。
 でも構造体とかポインタとかブラシとかまだ無理みたいです

>堀木 さん
 bgscrだけでするとAeroスナップに対応できない(できるのかも)ので通常ウィンドウを
 オーナーにしてbgscrに描画してました。
 ウィンドウメッセージをハンドル=oncmd なんですね…

回答ありがとうございます。難しい…!
う〜ん…
従来の方法で行くか…(えっ



ONION software Copyright 1997-2021(c) All rights reserved.