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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0620
onionLVS_EX_FULLROWSELECTでリストビューの表示が崩れる?5解決


onion

リンク

2010/6/20(Sun) 11:58:12|NO.33341

WinXP+HSP3.2を使っています。
winobjによるSysListView32で、LVS_EX_FULLROWSELECTを指定すると、
リストビューの表示が崩れる場合があるのですがこれを防止する方法が分かりません。

このリストビュー上に他のウィンドウなどを重ねた後、そのウィンドウを移動させた後の
再描画がかからなくなるような感じで、グレーアウトして欠けたような表示になります。
LVS_EX_FULLROWSELECTを外せば直りますが、一行選択を使いたいのです。
llmod3のlistviewではこのような問題は起こらないことを確認したのですが、
ソースがHSP2ベースで書かれているようで原因も解決方法も分かっていません。
どなたかアドバイス下さい、よろしくお願いします。



この記事に返信する


pizza

リンク

2010/6/22(Tue) 03:30:29|NO.33359

vista+hsp3.2でwinobjを使いLVS_EX_FULLROWSELECTのlistviewを作ってみましたが、
ちゃんと再描画されているようです。

その症状が再現できるスクリプト(最小の)があれば誰か改善方法を知ってるかも?



onion

リンク

2010/6/22(Tue) 21:30:17|NO.33374

こんばんは。
pizzaさん、フォローありがとうございます。
こちらで試しに作成したサンプルを載せてみます。
4種類のリストビューのうち、真ん中の2つが上の動作で欠けて見えました。

サンプルではプログラムを短くするために、リストビューのヘッダやアイテムには
あえて何も入れていないので分かりにくいですが、
それでもヘッダ部分のグレーの所が欠けるのを確認しています。
また、どうやら”HSPのDebug Windowでは欠けないがエクスプローラでは欠ける”
ということがあるようです。

もしかしてVistaだと、この現象は起こらないのでしょうか?
こちらでは WinXPProSP3+HSP3.2 で確認しました。
どなたかご存じの方、アドバイスよろしくお願いします。


screen 0, 640, 480

#const global WS_CHILD $40000000
#const global WS_VISIBLE $10000000
#const global LVS_REPORT $00000001

#const global WS_EX_CLIENTEDGE $00000200
#const global LVS_EX_FULLROWSELECT $00000020
#const global LVS_EX_GRIDLINES $00000001

#const global LVM_SETEXTENDEDLISTVIEWSTYLE 0x1036


//上に他のウィンドウやダイアログが重なった後、リストビューの一部が欠けて表示される
lvs_ws = WS_VISIBLE | WS_CHILD | LVS_REPORT
lvs_ws_ex = WS_EX_CLIENTEDGE
pos 10, 0
winobj "SysListView32", "表示欠けないリストビュー", lvs_ws_ex, lvs_ws, 600, 100
hListView = objinfo_hwnd(stat)
sendmsg hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, lvs_ws_ex

//※エクスプローラ等のウィンドウを乗せるとヘッダ部分が欠ける。Debug Windowだと欠けない。
lvs_ws_ex = LVS_EX_FULLROWSELECT
pos 10, 100
winobj "SysListView32", "表示欠けるリストビュー", lvs_ws_ex, lvs_ws, 600, 100 //LVS_EX_FULLROWSELECTを入れると欠ける?
hListView = objinfo_hwnd(stat)
sendmsg hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, lvs_ws_ex

//※エクスプローラ等のウィンドウを乗せるとヘッダ部分が欠ける。Debug Windowだと欠けない。
lvs_ws_ex = WS_EX_CLIENTEDGE | LVS_EX_FULLROWSELECT
pos 10, 200
winobj "SysListView32", "表示欠けるリストビュー", lvs_ws_ex, lvs_ws, 600, 100 //LVS_EX_FULLROWSELECTを入れると欠ける?枠も表示されない
hListView = objinfo_hwnd(stat)
sendmsg hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, lvs_ws_ex

lvs_ws_ex = WS_EX_CLIENTEDGE | LVS_EX_GRIDLINES
pos 10, 300
winobj "SysListView32", "表示欠けないリストビュー", lvs_ws_ex, lvs_ws, 600, 100
hListView = objinfo_hwnd(stat)
sendmsg hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, lvs_ws_ex
stop



pizza

リンク

2010/6/23(Wed) 13:31:04|NO.33384

おそらくwinobjのexstyleにLVS_EX_FULLROWSELECTを入れているのが原因ではないでしょうか?
winobj作成時のexstyleにはLVS_EX_FULLROWSELECTを含めずに、
LVM_SETEXTENDEDLISTVIEWSTYLEを送るときだけLVS_EX_のスタイルを設定してみてください。

WS_EX_とLVS_EX_は分けて考えないと
#define WS_EX_TRANSPARENT 0x00000020
#define LVS_EX_FULLROWSELECT 0x00000020
この二つがかぶってるのでwinobj(CreateWindowEx)ではWS_EX_TRANSPARENTとして判断されているはずです。



Kpan

リンク

2010/6/23(Wed) 20:14:39|NO.33396

CreateWindowEx関数=winobj命令 なので、「設定・取得
することはできませんので注意してください」となりやす。
http://yokohama.cool.ne.jp/chokuto/urawaza/prm/comctl_style.html#listview

winobj命令のp1(拡張ウィンドウスタイル)は↓のみです。
http://yokohama.cool.ne.jp/chokuto/urawaza/prm/extended_window_style.html



onion

リンク

2010/6/24(Thu) 21:09:25|NO.33415

LVM_SETEXTENDEDLISTVIEWSTYLEでのみ
LVS_EX_FULLROWSELECTを設定することで、解決できました!

pizzaさん Kpanさん、
アドバイスありがとうございました。大変参考になりました。



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