|
|
|
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関数を使ったスクリプトも書いたのですが結果は同様でした。(コメントアウト)
解決策をご存知の方がいらっしゃいましたらよろしくお願いします。
| |
|
2013/6/22(Sat) 21:15:31|NO.55165
定義部が抜けていました。申し訳ありません。
#include "user32.as"
#include "gdi32.as"
#define BLACKNESS $00000042
#define WHITENESS $00FF0062
#define SRCCOPY $00CC0020
|
|
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
|
|
2013/6/23(Sun) 22:35:32|NO.55197
>774さん
とても親切な回答をありがとうございます。
774さんのスクリプトはすんなり正常に動作しました。
いただいたソースと自分のソースを比較して変更点を埋め合わせてみた結果、既にコメントしてくださっているように一度SelectObjectでBMPを孤立させてやらなかったことが主な原因みたいでした。
このような仕様は知らなかったので盲点です。
毎度のことですが、この掲示板には幅広い知識を持つ経験者の方が多くて助かります。
遅ればせながらこれで解決することができました。ご回答ありがとうございました。
|
|
2013/6/23(Sun) 22:57:46|NO.55198
>暇人さん
試行の最中に新たなご回答をいただいていたようで恐縮です。
mrefで得られる情報をそのまま流用してビットマップを作成できることは知りませんでした。
今までこの手の処理は使い捨てのDCを作成して管理していたので結構手間を感じていたところです。
HSPで画像を作成するのにとても相性が良さそうなので是非活用させていただきます。
改めて丁寧なご回答をくださった暇人さん、774さんありがとうございました。
|
|