|
|
2015/12/13(Sun) 13:13:12|NO.73593
通常のcomboxとは違い、ComboBoxEx32というクラスのコンボボックスを使う必要があります。
これはwinobjで作成できます。
winobj "ComboBoxEx32", ...
操作はsendmsgで行います。
詳しいことは、下記サイトなどが参考になると思います。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_194.htm
それから、UhspObjs3というモジュールに同等の機能を実装したサンプルが入っているので、そちらも参考にしてください。
|
|
2015/12/13(Sun) 15:12:54|NO.73594
>>catsさん
詳しい資料ありがとうございます。
コモンコントロールはさっぱりなのでUhspObjs3のサンプルを読んで理解していこうかと思います。
また自力では分からないことがありましたらよろしくお願い致します。
|
|
2015/12/13(Sun) 23:27:47|NO.73601
めちゃくちゃですが、
こんなコードを書いてみました。アイテムがまったく表示されないです...
;|============================================================================|
#include "../inc/UhspAinc.as" ;|=====[ UhspAinc.as ]=====|
;|============================================================================|
: _hImg = _ImgList(_IMG_CREATE,16,16,33)
:__ExtractIconA hInstance,"user32.dll",1 :ii = stat
: _let _ImgList(_IMG_ICON,_hImg,ii)
:__DestroyIcon ii
sdim pszText,256
#include"user32.as"
title"拡張コンボボックス"
CreateWindowEx 0,"comboboxex32","",0x40000000|0x10000000|0x0003,0,30,200,25,hwnd,0,hinstance,0
hExCombo=stat
psztext="Text"
sendmessage hExCombo,0x0402,0,lparam&_hImg
dim item,8
item(0)=0x00000001|0x00000002|0x00000004
item(1)=varptr(pszText)
item(2)=0
item(3)=0
item(4)=0
item(5)=1
sendmessage hExCombo,0x0401,0,lparam&item
おかしいところでもあるのかなぁ?
|
|
2015/12/14(Mon) 00:42:47|NO.73602
オーナードローのコンボボックスを作り、
文字とアイコンを表示する。 screen 1
//アイコン
color 255,0,0:circle 0,0,16,16,1
color 0,255,0:circle 16,0,32,16,1
color 0,0,255:circle 32,0,48,16,1
color 255,255,0:circle 48,0,64,16,1
screen 0
Text="AAA\nBBB\nCCC\nDDD"
//オーナードロー型コンボボックス
winobj "ComboBox","",0, 0x50200013,200:hComboBox=objinfo(stat,2)
sendmsg hComboBox, 0x153,,20//リストの行の高さ
sendmsg hComboBox,0x14E,0
notesel Text
repeat noteinfo(0),0
noteget _Text,cnt
sendmsg hComboBox,0x0143,0,_Text//項目追加(文字は見えない)
loop
sendmsg hComboBox,0x14E,0//項目選択
oncmd gosub *OnDrawItem,0x002B//WM_DRAWITEM
stop
*OnDrawItem
gsel 0
dupptr DIS, lparam, 48
mref BMSCR, 67
hdcOld=BMSCR(4)
BMSCR(4)=DIS.6//デバイスコンテキストを描きこみ先に変更し、直接描きこむ
if DIS.5 = hComboBox{
if DIS.4 & 1 {//選択状態
syscolor 13
color ginfo(16)^255,ginfo(17)^255,ginfo(18)^255//反転色
boxf DIS.7,DIS.8,DIS.9,DIS.10
syscolor 13:boxf DIS.7+1,DIS.8+1,DIS.9-1,DIS.10-1
syscolor 14
}else{//通常
syscolor 5:boxf DIS.7,DIS.8,DIS.9,DIS.10
syscolor 8
}
notesel Text
noteget _Text,DIS.2
pos DIS.7+18,DIS.8+2:mes _Text//文字描画
pos DIS.7+2,DIS.8+2:gcopy 1,DIS.2*16,0,16,16//アイコン描画
}
BMSCR(4)=hdcOld//ちゃんとデバイスコンテキストを元のように戻す
return
| |
|
2015/12/14(Mon) 02:35:34|NO.73603
>>Swonさん
UhspObjs3凄そうな機能色々ありますが一筋縄ではいかないですよね
>>Richさん
す、すごいこんな方法が!
ただ私の環境のせいか選択後のボックスが残ってしまいました
http://i.imgur.com/oPbXa53.gif
|
|
2015/12/14(Mon) 08:29:31|NO.73605
これって、Inputバージョンありますか?
よければサンプルください...
|
|
2015/12/14(Mon) 18:55:44|NO.73608
comboboxに入力できませんか?
|
|
2015/12/16(Wed) 08:10:53|NO.73626
何とかすれば入力できるかも。
|
|
2015/12/19(Sat) 15:44:05|NO.73686
オーナードローコンボボックスの修正とinputバージョン
screen 1
//アイコン
color 255,0,0:circle 0,0,16,16,1
color 0,255,0:circle 16,0,32,16,1
color 0,0,255:circle 32,0,48,16,1
color 255,255,0:circle 48,0,64,16,1
screen 0
Text="AAA\nBBB\nCCC\nDDD"
//オーナードロー型コンボボックス
winobj "ComboBox","",0, 0x50200013,200:hComboBox=objinfo(stat,2)
sendmsg hComboBox, 0x153,,20//リストの行の高さ
sendmsg hComboBox,0x14E,0
notesel Text
repeat noteinfo(0),0
noteget _Text,cnt
sendmsg hComboBox,0x0143,0,_Text//項目追加(文字は見えない)
loop
sendmsg hComboBox,0x14E,0//項目選択
oncmd gosub *OnDrawItem,0x002B//WM_DRAWITEM
stop
*OnDrawItem
gsel 0
dupptr DIS, lparam, 48
mref BMSCR, 67
hdcOld=BMSCR(4)
BMSCR(4)=DIS.6//デバイスコンテキストを描きこみ先に変更し、直接描きこむ
if DIS.5 = hComboBox{
if DIS.4 & 1 {//選択状態
syscolor 13
color ginfo(16)^255,ginfo(17)^255,ginfo(18)^255//反転色
boxf DIS.7,DIS.8,DIS.9,DIS.10
syscolor 13:boxf DIS.7+1,DIS.8+1,DIS.9-1,DIS.10-1
syscolor 14
}else{//通常
syscolor 5:boxf DIS.7,DIS.8,DIS.9,DIS.10
syscolor 8
}
notesel Text
noteget _Text,DIS.2
pos DIS.7+18,DIS.8+2:mes _Text//文字描画
pos DIS.7+2,DIS.8+2:gcopy 1,DIS.2*16,0,16,16//アイコン描画
}
BMSCR(4)=hdcOld//ちゃんとデバイスコンテキストを元のように戻す
gsel 0:redraw//リストが残る不具合解消
return
↓inputバージョン
サブクラス化し、inputがWM_PAINTメッセージを取得したところを、無理やり描画する。(良いやり方ではない)
#include "User32.as"
#include "Gdi32.as"
#include "hscallbk.as"
#uselib ""
#func InpWndProc "" int,int,int,int
setcallbk Proc, InpWndProc, *MyInpWndProc
sdim text
text="オーナードロー"
input text,600,25
hInput=objinfo(stat,2)
SetWindowLong hInput,-4,varptr(Proc)
OldWndProc=stat
stop
*MyInpWndProc
if callbkarg(1)==0x000F & callbkarg(0)=hInput{//WM_PAINT(再描画)
gosub *OnDrawItem
}else{
CallWindowProc OldWndProc,callbkarg(0),callbkarg(1),callbkarg(2),callbkarg(3)
}
return
*OnDrawItem
mref BMSCR, 67
hdcOld=BMSCR(4)
GetDC hInput//inputのデバイスコンテキスト
BMSCR(4)=stat//デバイスコンテキストを描きこみ先に変更し、直接描きこむ
redraw 0
color 255,255,255:boxf 1,1,596,20:syscolor 18:pos 20,2
sendmsg hInput,0x0D,125,varptr(text)//テキスト取得
sysfont 17
if text=""{
syscolor 17
mes "文字を入力してください"
}else:mes text+"|"
redraw 1
BMSCR(4)=hdcOld//ちゃんとデバイスコンテキストを元のように戻す
gsel 0
redraw//メインウィンドウがおかしくなるから再描画
return
| |
|
2015/12/19(Sat) 17:39:16|NO.73691
>>Richさん
ばっちり動作しましたありがとうございます!
動作的には問題ないのですが、画像付きcomboxが0,0以外の座標にあると
選択した時に選択項目のちらつきがでてしまいますね。
でも動作はそこまで支障ないのでこれでも大丈夫そうです。
複数表示も一応動作しました。
screen 1
//アイコン
color 255,0,0:circle 0,0,16,16,1
color 0,255,0:circle 16,0,32,16,1
color 0,0,255:circle 32,0,48,16,1
color 255,255,0:circle 48,0,64,16,1
color 100,100,0:circle 64,0,80,16,1
color 155,0,0:circle 0,32,16,16,1
color 0,155,0:circle 16,32,32,16,1
color 0,0,155:circle 32,32,48,16,1
color 155,155,0:circle 48,32,64,16,1
color 150,150,150:circle 64,32,80,16,1
screen 0
Text="AAA\nBBB\nCCC\nDDD\nEEE"
Text2="111\n222\n333\n444\n555"
//オーナードロー型コンボボックス
pos 0,0 :winobj "ComboBox","",0, 0x50200013,200:hComboBox=objinfo(stat,2)
sendmsg hComboBox, 0x153,,20//リストの行の高さ
sendmsg hComboBox,0x14E,0
notesel Text
repeat noteinfo(0),0
noteget _Text,cnt
sendmsg hComboBox,0x0143,0,_Text//項目追加(文字は見えない)
loop
sendmsg hComboBox,0x14E,0//項目選択
;追加分ーーーーーーーー
pos 200,0 :winobj "ComboBox","",0, 0x50200013,200:hComboBox2=objinfo(stat,2)
sendmsg hComboBox2, 0x153,,20//リストの行の高さ
sendmsg hComboBox2,0x14E,0
notesel Text2
repeat noteinfo(0),0
noteget _Text,cnt
sendmsg hComboBox2,0x0143,0,_Text//項目追加(文字は見えない)
loop
sendmsg hComboBox2,0x14E,0//項目選択
;ーーーーーーーーーーー
oncmd gosub *OnDrawItem,0x002B//WM_DRAWITEM
repeat
wait 2
title "左 "+SelNo+"="+SelText+" 右 "+SelNo2+"="+SelText2
loop
stop
*OnDrawItem
gsel 0
dupptr DIS, lparam, 48
mref BMSCR, 67
hdcOld=BMSCR(4)
BMSCR(4)=DIS.6//デバイスコンテキストを描きこみ先に変更し、直接描きこむ
if DIS.5 = hComboBox{
if DIS.4 & 1 {//選択状態
syscolor 13
color ginfo(16)^255,ginfo(17)^255,ginfo(18)^255//反転色
boxf DIS.7,DIS.8,DIS.9,DIS.10
syscolor 13:boxf DIS.7+1,DIS.8+1,DIS.9-1,DIS.10-1
syscolor 14
}else{//通常
syscolor 5:boxf DIS.7,DIS.8,DIS.9,DIS.10
syscolor 8
}
notesel Text : noteget _Text,DIS.2
SelText=_Text : SelNo=DIS.2
pos DIS.7+18,DIS.8+2:mes _Text//文字描画
pos DIS.7+2,DIS.8+2:gcopy 1,DIS.2*16,0,16,16//アイコン描画
}
BMSCR(4)=hdcOld//ちゃんとデバイスコンテキストを元のように戻す
; gsel 0:redraw//リストが残る不具合解消
;追加分ーーーーーーーー
dupptr DIS, lparam, 48
mref BMSCR, 67
hdcOld=BMSCR(4)
BMSCR(4)=DIS.6//デバイスコンテキストを描きこみ先に変更し、直接描きこむ
if DIS.5 = hComboBox2{
if DIS.4 & 1 {//選択状態
syscolor 13
color ginfo(16)^255,ginfo(17)^255,ginfo(18)^255//反転色
boxf DIS.7,DIS.8,DIS.9,DIS.10
syscolor 13:boxf DIS.7+1,DIS.8+1,DIS.9-1,DIS.10-1
syscolor 14
}else{//通常
syscolor 5:boxf DIS.7,DIS.8,DIS.9,DIS.10
syscolor 8
}
notesel Text2 : noteget _Text,DIS.2
SelText2=_Text : SelNo2=DIS.2
pos DIS.7+18,DIS.8+2:mes _Text//文字描画
pos DIS.7+2,DIS.8+2:gcopy 1,DIS.2*16,16,16,16//アイコン描画
}
;ーーーーーーーーーーー
BMSCR(4)=hdcOld//ちゃんとデバイスコンテキストを元のように戻す
gsel 0:redraw//リストが残る不具合解消
return
| |
|