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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1210
fmstdlibの「imagebtn」がVistaで正常に動作しない9解決


fm

リンク

2008/12/10(Wed) 20:22:32|NO.21473

さくらさんの API module & macro Libraryに収録されているexwinstyle.asのimagebtn命令を
Vistaで使おうとすると該当ボタンの部分が黒くなってしまい、正常に動作しません。

おそらくはBM_SETIMAGE辺りで問題が発生しているのではと思うのですが・・・
どなたか解決策をご存じないでしょうか。



この記事に返信する


inovia

リンク

2008/12/10(Wed) 20:42:31|NO.21474




inovia

リンク

2008/12/10(Wed) 23:20:25|NO.21479

再び登場で〜す(^o^)丿
色々と実験をしてみたところ、
標準のランタイムのリソースのマニフェストに問題があるようです。(多分・・・)
とりあえず、マニフェストをリソースハッカーで削除してみたところ正常に動くようです。
マニフェストを削除したランタイムをあげておきます。
http://homepage2.nifty.com/MJHS/hsp/hsp3_no.lzh

hsp3_no.exeはhsp31(本体)のあるところに入れてください。
hsp3_no.hrtはruntimeフォルダに入れてください。

その後、

#runtime "hsp3_no"
をスクリプトの先頭にでも追加してください。

これでとりあえずは動くはずです。
XPだとビジュアルスタイルが適用されませんが…



inovia

リンク

2008/12/10(Wed) 23:52:58|NO.21483

追記〜

#runtime "hsp3_no"
を使うと不要なコードの最適化の機能が働かなくなるみたいですので、
(最適化しないで"gdi32.as"や"user32.as"を使っている場合は
実行ファイルのサイズが肥大化します。)


#runtime "hsp3_no" #cmpopt optcode 1
にしておいたほうがいいかもしれません。



fm

リンク

2008/12/11(Thu) 01:46:39|NO.21486

ありがとうございます。確かにVistaでもイメージボタンの動作を確認しました。
しかしビジュアルスタイルが適用されないのが何とも・・・
どうにかしてイメージボタンとビジュアルスタイルを共存させる方法はありませんかね?



MIZUSHIKI

リンク

2008/12/12(Fri) 00:19:11|NO.21506

VistaのスタイルではBS_BITMAPは使えなかったような気がします。
(検索してもそういった情報が見つからないので記憶違いの可能性大です;)

私はカスタムドローで画像を張り付けて使っています。
カスタムドローの各パラメータとかはKpanさんとこのカスタムドローのページ
http://lhsp.s206.xrea.com/misc/customdraw.html
が分かりやすいと思います。


#uselib "GDI32" #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define WM_NOTIFY 0x004E #define NM_CUSTOMDRAW -12 #define CDDS_PREPAINT 0x0001 #define CDIS_SELECTED 0x0001 #define SRCCOPY 0xCC0020 buffer 1,33,33 hdc1=hdc ;ボタンに張り付ける画像を作る syscolor 15 :boxf syscolor 18 :circle 4,4,29,29 syscolor 15 :circle 7,7,26,26 :boxf 13,0,19,10 syscolor 18 :boxf 15,2,17,13 gsel 0 pos 10,10 objsize 40,40 button "",*btn hw_btn=objinfo_hwnd(stat) oncmd gosub *NOTIFY, WM_NOTIFY stop *btn end *NOTIFY ;NMHDR構造体 dim NMHDR,3 dupptr NMHDR,lparam,4*3 if NMHDR.0 = hw_btn && NMHDR.2 = NM_CUSTOMDRAW { ;NMCUSTOMDRAW構造体 dim NMCUSTOMDRAW,12 dupptr NMCUSTOMDRAW,lparam,4*12 if NMCUSTOMDRAW.3 = CDDS_PREPAINT { if NMCUSTOMDRAW.10 && CDIS_SELECTED :push=1 :else :push=0 ;クリック状態 BitBlt NMCUSTOMDRAW.4,4,4,32,32,hdc1,1-push,1-push,SRCCOPY } } return



fm

リンク

2008/12/12(Fri) 00:44:26|NO.21507

MIZUSHIKIさん、有益な情報をありがとうございます。
ところで、この方法ですと複数のイメージボタンが作成できないような気がするのですが・・・

力不足で申し訳ないのですが、複数ボタンを配置する方法があればご教授願えないでしょうか。



MIZUSHIKI

リンク

2008/12/12(Fri) 02:08:29|NO.21508

画像を張り付けたいボタンのハンドルを変数に入れて覚えておきます。
hw_btn1=objinfo_hwnd(stat)

オブジェクトが描画されたりするときに*NOTIFYラベルに飛ぶので、
NMHDR.0が張り付けたいボタンのハンドルだったときにBitBltを使って指定した画像を貼り付けます。

BitBltは

BitBlt コピー先デバイスコンテキスト, コピー先x座標, コピー先y座標, 幅, 高さ, コピー元デバイスコンテキスト, コピー元x座標, コピー元x座標, ラスタオペレーションコード
となってます。
詳しくは
http://yokohama.cool.ne.jp/chokuto/urawaza/api/BitBlt.html
で調べてください。


#uselib "GDI32" #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define WM_NOTIFY 0x004E #define NM_CUSTOMDRAW -12 #define CDDS_PREPAINT 0x0001 #define CDIS_SELECTED 0x0001 #define SRCCOPY 0xCC0020 //そのまま転送 #define SRCAND 0x8800C6 //転送先の画像とAND演算して転送 #define SRCPAINT 0xEE0086 //転送先の画像とOR演算して転送 screen 1, 33*3 +75, 33 +13 hdc1=hdc ;ボタンに張り付ける画像を作る syscolor 15 :boxf 0,0,32,32 syscolor 18 :circle 4,4,29,29 syscolor 15 :circle 7,7,26,26 :boxf 13,0,19,10 syscolor 18 :boxf 15,2,17,13 ;2つ目 color 0,255,0 :circle 4+33,4,29+33,29 color 255,255,255 :circle 7+33,7,26+33,26 :boxf 13+33,0,19+33,10 color 0,255,0 :boxf 15+33,2,17+33,13 ;3つ目 color 255,0,0 :boxf 2+33*2,4,22+33*2,22 :boxf 12+33*2,14,28+33*2,30 font "MSP ゴシック",10 pos 1,33 :color :mes "用意した画像はこんな感じになってます" gsel 0 objsize 40,40 ;ボタン1 pos 10,10 button "",*btn hw_btn1=objinfo_hwnd(stat) ;ボタンのハンドルを保存 ;ボタン2 pos 60,10 button "",*btn hw_btn2=objinfo_hwnd(stat) ;ボタン3 pos 110,10 button "",*btn hw_btn3=objinfo_hwnd(stat) oncmd gosub *NOTIFY, WM_NOTIFY stop *btn end *NOTIFY ;NMHDR構造体 dim NMHDR,3 dupptr NMHDR,lparam,4*3 if NMHDR.2 = NM_CUSTOMDRAW { ;NMCUSTOMDRAW構造体 dim NMCUSTOMDRAW,12 dupptr NMCUSTOMDRAW,lparam,4*12 ;コントロールが描画される if NMCUSTOMDRAW.3 = CDDS_PREPAINT { if NMCUSTOMDRAW.10 && CDIS_SELECTED :push=1 :else :push=0 ;クリック状態 ;各ボタンのハンドルごとに画像を張り付けるよう場合分け switch NMHDR.0 ;ボタン1 case hw_btn1 ;ボタンに画像をコピー BitBlt NMCUSTOMDRAW.4, 4,4, 32,32, hdc1, 1-push,1-push, SRCCOPY ;SRCCOPY = そのまま貼り付け swbreak ;ボタン2 case hw_btn2 BitBlt NMCUSTOMDRAW.4, 4,4, 32,32, hdc1, 32+1-push,1-push, SRCAND ;SRCAND = AND演算して貼り付け swbreak ;ボタン3 case hw_btn3 BitBlt NMCUSTOMDRAW.4, 4,4, 32,32, hdc1, 32*2+1-push,1-push, SRCCOPY swbreak swend } } return



fm

リンク

2008/12/12(Fri) 21:06:29|NO.21517

お陰様で上手くいきました。
MIZUSHIKIさん、それにinoviaさん、本当にありがとうございました。



sakure

リンク

2009/1/17(Sat) 09:48:31|NO.22905

横からお邪魔しますー。
Windows7betaでもこの問題があったので、
inoviaさんの解決法で動作しました。



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