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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0308
toltタブに画像をつけたい6解決


tolt

リンク

2012/3/8(Thu) 19:31:22|NO.45285

タイトルどおり、タブに画像をつけたいです。
ジョークソフトでタブのつまみに部分に画像等で色をつけたくて・・・
objimageでは意味がないとわかったので、別の方法を模索中です。
何かいい手段はないものでしょうか?
buffer 4
picload "vscan2.jpg" gsel 0 #module #uselib "user32" #func GetClientRect "GetClientRect" int, int #func SetWindowLong "SetWindowLongA" int, int, int #func SetParent "SetParent" int, int #uselib "gdi32" #cfunc GetStockObject "GetStockObject" int #deffunc CreateTab int p1, int p2, int p3, int p4 winobj "systabcontrol32", "", , $52000000 | p4, p1, p2 hTab = objinfo(stat, 2) sendmsg hTab, $30, GetStockObject(17) TabID = p3 if TabID = 0 : TabID = 1 dim rect, 4 return hTab #deffunc InsertTab str p2 pszText = p2 : tcitem = 1, 0, 0, varptr(pszText) sendmsg hTab, $1307, TabItem, varptr(tcitem) GetClientRect hTab, varptr(rect) sendmsg hTab, $1328, , varptr(rect) bgscr TabID + TabItem, rect.2 - rect.0, rect.3 - rect.1, 2, rect.0, rect.1 SetWindowLong hwnd, -16, $40000000 SetParent hwnd, hTab TabItem++ return #deffunc ChangeTab gsel wID + TabID, -1 sendmsg hTab, $130B wID = stat gsel wID + TabID, 1 return #global screen , 427*2, 365*2 syscolor 15 : boxf pos , 300 CreateTab 427*2, 170*2, 1 hTabControl = stat objimage 4,492,265 InsertTab "   結果の概略   " pos 50, 50 : mes "A" InsertTab "    要注意    " pos 50, 50 : mes "B" InsertTab "   結果の詳細   " pos 50, 50 : mes "C" gsel 1, 1 gsel oncmd gosub *notify, $4E stop *notify dupptr nmhdr, lparam, 12 if nmhdr.0 = hTabControl & nmhdr.2 = -551 { ChangeTab gsel } return



この記事に返信する


ヂオン

リンク

2012/3/8(Thu) 21:30:45|NO.45289

wm_drawitem メッセージを使用します。

winobj に TCS_OWNERDRAWFIXED を指定して、コントロールを作成。

oncmd gosub *drawitem , /*WM_DRAWITEM*/ 0x2B
 のサブルーチンで、背景とテキストの描画を行います。
 背景の描画方法は bitblt で hsp ウィンドウ から コピーするか、あるいは、
 FillRect で ブラシを指定して塗りつぶします。
テキストは DrawText を使用することが一般的です。

余り良い例とは言えませんが即興で書いたスクリプトも載せておきます。


#include "gdi32.as" #include "user32.as" buffer 4 picload "vscan2.jpg" gsel 0 #module #deffunc CreateTab int p1, int p2, int p3, int p4 winobj "systabcontrol32", "", , $52000000 | p4, p1, p2 hTab = objinfo(stat, 2) GetStockObject 7 sendmsg hTab, $30, stat TabID = p3 if TabID = 0 : TabID = 1 dim rect, 4 return hTab #deffunc InsertTab str p2 pszText = p2 : tcitem = 1, 0, 0, varptr(pszText) sendmsg hTab, $1307, TabItem, varptr(tcitem) GetClientRect hTab, varptr(rect) sendmsg hTab, $1328, , varptr(rect) bgscr TabID + TabItem, rect.2 - rect.0, rect.3 - rect.1, 2, rect.0, rect.1 SetWindowLong hwnd, -16, $40000000 SetParent hwnd, hTab TabItem++ return #deffunc ChangeTab gsel wID + TabID, -1 sendmsg hTab, $130B wID = stat gsel wID + TabID, 1 return #global screen , 427*2, 365*2 syscolor 15 : boxf pos , 300 #define TCS_OWNERDRAWFIXED $00002000 oncmd gosub *drawitem , /*WM_DRAWITEM*/ 0x2B CreateTab 427*2, 170*2, 1 , TCS_OWNERDRAWFIXED hTabControl = stat objimage 4,492,265 InsertTab "   結果の概略   " pos 50, 50 : mes "A" InsertTab "    要注意    " pos 50, 50 : mes "B" InsertTab "   結果の詳細   " pos 50, 50 : mes "C" gsel 1, 1 gsel oncmd gosub *notify, $4E stop #define BS_NULL $00000001 #define DT_CENTER $00000001 #define DT_VCENTER $00000004 #define TRANSPARENT $00000001 #if 0 typedef struct tagDRAWITEMSTRUCT { // dis UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; DWORD itemData; } DRAWITEMSTRUCT; #endif *drawitem #define ODS_SELECTED $00000001 // DRAWITEMSTRUCT dim di,12 dupptr di,lparam,12*4,vartype("int") if (di.4 & ODS_SELECTED){ tx = "inactive!!" GetSyscolorBrush 29 : hb = stat }else{ tx = "active!!" GetSyscolorBrush 2:hb = stat } FillRect di.6 , varptr(di.7) , hb SetBkMode di.6,TRANSPARENT DrawText di.6,varptr(tx),-1,varptr(di.7),DT_CENTER|DT_VCENTER return 0 *notify dupptr nmhdr, lparam, 12 if nmhdr.0 = hTabControl & nmhdr.2 = -551 { ChangeTab gsel } return



tolt

リンク

2012/3/9(Fri) 17:05:05|NO.45304

>>ヂオンさん
ありがとうございます。

背景の変更ができました。
よろしければ、Inserttabで作った文字列をそのまま表示させておきたいのですが、
できるでしょうか?

あともう一つよければ、bitbltが調べてもよくわからないので、
ご教授願えるでしょうか。

押しつけがましくてすみませんm(_ _)m



check

リンク

2012/3/9(Fri) 20:04:56|NO.45313

BitBltは提示されたサンプルでは使われていないぞ。
あまりスレッドの主題と関係のない事を聞かないほうがいい。
気になるのなら新しくスレッドを立てろ。
んで、BitBltは言わばgcopyみたいなもんで、
あるDC(Device Context)の画像情報をさまざまなオプションをつけて別のDCにコピーしたりできる。

Inserttabで作った文字列を……云々は別の人に聞いてくれ。



tolt

リンク

2012/3/10(Sat) 13:58:09|NO.45332

>>checkさん
ありがとうございます。BitBlt使ってみます。



ヂオン

リンク

2012/3/13(Tue) 05:32:43|NO.45403

すみません、すっかり忘れていました。
まだ見ているか解りませんが、投稿します。

変更点は

GetTabText 命令を追加した事と、それの戻り値を
DrawText 関数に 送る様にした事です。


#include "gdi32.as" #include "user32.as" buffer 4 picload "vscan2.jpg" gsel 0 #module #deffunc CreateTab int p1, int p2, int p3, int p4 winobj "systabcontrol32", "", , $52000000 | p4, p1, p2 hTab = objinfo(stat, 2) GetStockObject 7 sendmsg hTab, $30, stat TabID = p3 if TabID = 0 : TabID = 1 dim rect, 4 return hTab #deffunc InsertTab str p2 pszText = p2 : tcitem = 1, 0, 0, varptr(pszText) sendmsg hTab, $1307, TabItem, varptr(tcitem) GetClientRect hTab, varptr(rect) sendmsg hTab, $1328, , varptr(rect) bgscr TabID + TabItem, rect.2 - rect.0, rect.3 - rect.1, 2, rect.0, rect.1 SetWindowLong hwnd, -16, $40000000 SetParent hwnd, hTab TabItem++ return #deffunc ChangeTab gsel wID + TabID, -1 sendmsg hTab, $130B wID = stat gsel wID + TabID, 1 return #defcfunc GetTabText int ht_ , int idx_ , int len_ sdim pszText,len_ tcitem = 1, 0, 0, varptr(pszText),len_ , 0,0 sendmsg ht_,0x1305,idx_,varptr(tcitem) return pszText #global screen , 427*2, 365*2 syscolor 15 : boxf pos , 300 #define TCS_OWNERDRAWFIXED $00002000 oncmd gosub *drawitem , /*WM_DRAWITEM*/ 0x2B CreateTab 427*2, 170*2, 1 , TCS_OWNERDRAWFIXED hTabControl = stat objimage 4,492,265 InsertTab "   結果の概略   " pos 50, 50 : mes "A" InsertTab "    要注意    " pos 50, 50 : mes "B" InsertTab "   結果の詳細   " pos 50, 50 : mes "C" gsel 1, 1 gsel oncmd gosub *notify, $4E stop #define BS_NULL $00000001 #define DT_CENTER $00000001 #define DT_VCENTER $00000004 #define TRANSPARENT $00000001 #if 0 typedef struct tagDRAWITEMSTRUCT { // dis UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; DWORD itemData; } DRAWITEMSTRUCT; #endif *drawitem #define ODS_SELECTED $00000001 // DRAWITEMSTRUCT dim di,12 dupptr di,lparam,12*4,vartype("int") if (di.4 & ODS_SELECTED){ //tx = "inactive!!" GetSyscolorBrush 29 : hb = stat }else{ //tx = "active!!" GetSyscolorBrush 2:hb = stat } FillRect di.6 , varptr(di.7) , hb SetBkMode di.6,TRANSPARENT logmes strf("%d,%d,%d",di.5,di.2,0xFF) DrawText di.6,GetTabText(di.5,di.2,0xFF),-1,varptr(di.7),DT_CENTER|DT_VCENTER return 0 *notify dupptr nmhdr, lparam, 12 if nmhdr.0 = hTabControl & nmhdr.2 = -551 { ChangeTab gsel } return



tolt

リンク

2012/3/31(Sat) 14:30:57|NO.45666

>>ヂオンさん
ありがとうございます!
本当に役に立ちました!



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