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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1213
ニボッシー画像付きのcomboxの表示10解決


ニボッシー

リンク

2015/12/13(Sun) 10:47:21|NO.73592

最近作っているアプリでcomboxを多用しているのですが小さなサムネイル表示をつけた状態で
comboxを使うことは出来ないでしょうか?
HSPTV!掲示板で調べたらゲーム向け用に暇人様が作られていましたが、
今作っているのはアプリのためシンプルなものがいいため質問させていただきました。
イメージ的にはこんな感じのものです。
http://www.hanatyan.sakura.ne.jp/vb6/combobox05.htm



この記事に返信する


cats

リンク

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のサンプルを読んで理解していこうかと思います。
また自力では分からないことがありましたらよろしくお願い致します。



Swon

リンク

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
おかしいところでもあるのかなぁ?



Rich

リンク

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



Swon

リンク

2015/12/14(Mon) 08:29:31|NO.73605

これって、Inputバージョンありますか?
よければサンプルください...



S#

リンク

2015/12/14(Mon) 18:55:44|NO.73608

comboboxに入力できませんか?



はまち

リンク

2015/12/16(Wed) 08:10:53|NO.73626

何とかすれば入力できるかも。



Rich

リンク

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



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