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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0622
ht.inputのキャレットをインメモリで作成したビットマップに差し替える方法5解決


ht.

リンク

2013/6/22(Sat) 21:14:11|NO.55164

こちらのページを参考にCreateCaret関数を使ってキャレットの画像変更を試みたのですが、
CreateBitmap関数, CreateCaret関数等は成功しているものの実際に画像が反映されません。
http://hsp.tv/play/pforum.php?mode=pastwch&num=50708

CreateCaret MSDN
http://msdn.microsoft.com/ja-jp/library/cc410685.aspx
(英語版)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms648399%28v=vs.85%29.aspx

以下が私の書いたソースです。

// ビットマップを作成 caret_cx = 3 caret_cy = 12 CreateCompatibleDC hdc : h_dc = stat CreateCompatibleBitmap hdc, caret_cx, caret_cy : h_bmp = stat SelectObject h_dc, h_bmp PatBlt h_dc, 0, 0, caret_cx, caret_cy, WHITENESS PatBlt h_dc, 0, 0, 1, caret_cy, BLACKNESS PatBlt h_dc, 2, 0, 1, caret_cy, BLACKNESS /* CreateBitmapを使用 sdim bits, caret_cx * caret_cy * 4 memset bits, 0, caret_cx * caret_cy * 4 CreateBitmap caret_cx, caret_cy, 1, 32, varptr(bits) h_bmp = stat SelectObject h_dc, h_bmp */ // 試写 width 200, 100, 500, 300 BitBlt hdc, 5, 5, caret_cx, caret_cy, h_dc, 0, 0, SRCCOPY mes " ←" // 適用 pos 5, 30 a = "abcdef" input a, 100, 20 : h_input = objinfo_hwnd(stat) await CreateCaret h_input, h_bmp, 0, 0 ShowCaret h_input
英文の資料にはCreateCaret関数で指定するビットマップハンドルは、
CreateBitmapやCreateDIBitmapで作成されたものでなければならないと書いてあったので
CreateBitmap関数を使ったスクリプトも書いたのですが結果は同様でした。(コメントアウト)

解決策をご存知の方がいらっしゃいましたらよろしくお願いします。



この記事に返信する


ht.

リンク

2013/6/22(Sat) 21:15:31|NO.55165

定義部が抜けていました。申し訳ありません。

#include "user32.as" #include "gdi32.as" #define BLACKNESS $00000042 #define WHITENESS $00FF0062 #define SRCCOPY $00CC0020



774

リンク

2013/6/23(Sun) 11:03:07|NO.55177

始めに断っておきます。そちらの環境でダメでしたらごめんなさい。

私の環境では、ビットマップをDDBで用意する事で
キャレットに画像を反映させる所まではできました。

DIB・DDBの参考元
http://chokuto.ifdef.jp/advanced/bitmapobject.html

#include "user32.as" #include "gdi32.as" #define BLACKNESS $00000042 #define WHITENESS $00FF0062 #define SRCCOPY $00CC0020 // ビットマップを作成 caret_cx = 12 //別物だと解り易いように caret_cy = 12 screen 0, 200, 100 : font msgothic, 12, 1 color : boxf 5, 5, caret_cx+4, caret_cy+4 pos caret_cx+9, 5 : mes "←画像はxor値扱い?" color 0, 255, 255 : pos 5, 5 : mes "〆" CreateDC "DISPLAY", 0, 0, 0 : h_dsp = stat //DDBで作成したい CreateCompatibleDC h_dsp : h_dc = stat //h_dspから作成 CreateCompatibleBitmap h_dsp, caret_cx, caret_cy : h_bmp = stat //h_dspから作成 SelectObject h_dc, h_bmp : h_old = stat //後で戻す為に戻り値保持 ;PatBlt h_dc, 0, 0, caret_cx, caret_cy, WHITENESS ;PatBlt h_dc, 0, 0, 1, caret_cy, BLACKNESS ;PatBlt h_dc, 2, 0, 1, caret_cy, BLACKNESS BitBlt h_dc, 0, 0, caret_cx, caret_cy, hdc, 5, 5, SRCCOPY //左上の画像をキャレット化 SelectObject h_dc, h_old //元に戻さないダメっぽい? DeleteDC h_dc : DeleteDC h_dsp //後片付け onexit *exit // h_bmp の後片付け用 // 試写 ;width 200, 100, 500, 300 ;BitBlt hdc, 5, 5, caret_cx, caret_cy, h_dc, 0, 0, SRCCOPY ;mes " ←" // 適用 pos 5, 30 a = "abcdef" input a, 100, 20 : h_input = objinfo_hwnd(stat) await CreateCaret h_input, h_bmp, 0, 0 ShowCaret h_input pos 5,60 :button gosub "set Caret",*set_caret stop *set_caret ;手動でのキャレット変更 objsel 0 : CreateCaret h_input, h_bmp, 0, 0 ShowCaret h_input return *exit : DeleteObject h_bmp : end : end
もしこの方法で可能なら、CreateBitmap関数でも
DDBとして生成する事で同様に可能だと思います。

まだ道は険しそうですが、がんばってください。



暇人

リンク

2013/6/23(Sun) 22:20:41|NO.55194

DDBならCreateDIBitmapの方が楽かも


#include "user32.as" #include "gdi32.as" // ビットマップを作成 caret_cx = 3 caret_cy = 12 buffer 1,caret_cx,caret_cy //キャレット元画像制作用 color 255 boxf #define NOTSRCCOPY $00330008;// { dest = (NOT source) } BitBlt hdc, 0, 0, caret_cx, caret_cy, hdc, 0, 0, NOTSRCCOPY //キャレットは色反転するみたいなので元画像を色反転 mref VRAM_ID1,66 gsel 0 dim bmpLPBITMAPINFO,10 bmpLPBITMAPINFO = 40 ,caret_cx,caret_cy ,((24<<16) | 1) #define CBM_INIT 4 CreateDIBitmap hdc, varptr(bmpLPBITMAPINFO), CBM_INIT, varptr(VRAM_ID1), varptr(bmpLPBITMAPINFO), 0 //コピーとビットマップ(DDB)作成を同時に行うのでbuffer 1は必要なくなる if stat {h_bmp=stat :onexit *exit }else{dialog "ビットマップハンドルが取得できません":end} // 適用 pos 5, 30 a = "abcdef" input a, 100, 20 : h_input = objinfo_hwnd(stat) await CreateCaret h_input, h_bmp, 0, 0 ShowCaret h_input stop *exit DeleteObject h_bmp end



ht.

リンク

2013/6/23(Sun) 22:35:32|NO.55197

>774さん
とても親切な回答をありがとうございます。
774さんのスクリプトはすんなり正常に動作しました。
いただいたソースと自分のソースを比較して変更点を埋め合わせてみた結果、既にコメントしてくださっているように一度SelectObjectでBMPを孤立させてやらなかったことが主な原因みたいでした。
このような仕様は知らなかったので盲点です。
毎度のことですが、この掲示板には幅広い知識を持つ経験者の方が多くて助かります。
遅ればせながらこれで解決することができました。ご回答ありがとうございました。



ht.

リンク

2013/6/23(Sun) 22:57:46|NO.55198

>暇人さん
試行の最中に新たなご回答をいただいていたようで恐縮です。
mrefで得られる情報をそのまま流用してビットマップを作成できることは知りませんでした。
今までこの手の処理は使い捨てのDCを作成して管理していたので結構手間を感じていたところです。
HSPで画像を作成するのにとても相性が良さそうなので是非活用させていただきます。
改めて丁寧なご回答をくださった暇人さん、774さんありがとうございました。



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