透明・透過のテスト(U)失敗の巻 <TOP>
SetWindowLong
Windowに関するデータをセット
GetWindowLong
Windowに関するデータを取得
SetLayeredWindowAttributes
透明なWindowを作成
SendMessage
ウィンドウにメッセージを送信
MoveWindow
指定されたウィンドウの位置およびサイズを変更
VBのFlexGridの代用としてListBoxを下線ありで使用していますが、行間隔が窮屈です。
透過のテストをしていて、フォームを2枚重ね、下側の白いフォームに罫線を描画し、
上側のフォームに貼り付けたListBoxを白を透過色にしたらどうなるだろう?の実験・・・
ListBox内のフォントサイズを14、行間隔を20に設定し適当なデータを用意して表示させてみました。
表示結果はまぁまぁ、でも動作が遅く実用にはならないようです。残念orz
Form2(背面)のフォームはダイアログフレーム、コントロール無しに設定しています。
白を透過させているのでキャプション(透明・透過の文字)を白く見えるように・・
MainFormとForm2の移動時の同期はとっていません!
'================================================================ '= 透明・透過のテスト(U)失敗の巻 '= (SetLayeredWinAttri2.bas) '================================================================ #include "Windows.bi" 'Windowに関するデータをセット Declare Function Api_SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&) 'Windowに関するデータを取得 Declare Function Api_GetWindowLong& Lib "user32" Alias "GetWindowLongA" (ByVal hWnd&, ByVal nIndex&) '透明なWindowを作成 Declare Function Api_SetLayeredWindowAttributes& Lib "user32" Alias "SetLayeredWindowAttributes" (ByVal hWnd&, ByVal crKey&, ByVal bAlpha&, ByVal dwFlags&) ' ウィンドウにメッセージを送信。この関数は、指定したウィンドウのウィンドウプロシージャが処理を終了するまで制御を返さない Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any) ' 指定されたウィンドウの位置およびサイズを変更 Declare Function Api_MoveWindow& Lib "user32" Alias "MoveWindow" (ByVal hWnd&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal bRepaint&) #define GWL_EXSTYLE (-20) '拡張ウィンドウスタイル(nIndexの定数) #define LB_SETITEMHEIGHT &H1A0 'リストボックス項目の高さを設定 #define LWA_ALPHA 2 'bAlphaをアルファー値として使う #define LWA_COLORKEY 1 'crKeyを透明色として使う(dwFlagsの定数) #define WS_EX_LAYERED &H80000 '透明なウィンドウ属性(Windows2000以上) Var shared Form2 As Object Var shared List1 As Object List1.Attach GetDlgItem("List1") : List1.SetFontSize 14 '================================================================ '= '================================================================ declare sub MainForm_Start edecl () Sub MainForm_Start() Var dwStyle As Long Var Ret As Long Form2.CreateWindow "Form2", 0 'Form2に罫線を引く For v = 62 To 362 step 20 Form2.Line(0, v)-(List1.GetWidth, v), , 14 Next Form2.Line( 62, 62)-( 62, 362), , 14 Form2.Line(192, 62)-(192, 362), , 14 Form2.Line(258, 62)-(258, 362), , 14 Form2.Line(488, 62)-(488, 362), , 14 Form2.Line(648, 62)-(648, 362), , 14 SetTopMostWindow -1 ItemHeight = 20 Ret = Api_SendMessage&(List1.GethWnd, LB_SETITEMHEIGHT, 0, ByVal ItemHeight) List1.SetWindowSize 748, 310 List1.Resetcontent Count = 0 FF = FreeFile Open "TEST.CSV" For Input As #FF While Not Eof(#FF) Count = Count + 1 ZD1$ = Format$(Count,"#####") & " " Input #FF, ZD2$ : ZD2$ = Left$(Kacnv$(ZD2$) & Space$(18), 18) & " " Input #FF, ZD3$ : ZD3$ = Left$(ZD3$, 8) & " " Input #FF, ZD4$ : ZD4$ = Left$(Kacnv$(ZD4$) & Space$(32), 32) & " " If Asc(Mid$(ZD4$, 32, 1)) > &H81 Then ZD4$ = Left$(ZD4$, 31) & " " Input #FF, ZD5$ : ZD5$ = Left$(Kacnv$(ZD5$) & Space$(22), 22) & " " If Asc(Mid$(ZD5$, 22, 1)) > &H81 Then ZD5$ = Left$(ZD5$, 21) & " " Input #FF, ZD6$ : ZD6$ = Left$(ZD6$ & Space$(13), 13) & " " List1.AddString ZD1$ & ZD2$ & ZD3$ & ZD4$ & ZD5$ & ZD6$ Wend '拡張ウィンドウスタイルにWS_EX_LAYEREDを追加する dwStyle = Api_GetWindowLong&(GethWnd, GWL_EXSTYLE) dwStyle = dwStyle Or WS_EX_LAYERED Ret = Api_SetWindowLong&(GethWnd, GWL_EXSTYLE, dwStyle) '透明色を指定して透明にする Ret = Api_SetLayeredWindowAttributes&(GethWnd, Form2.GetBackColor, 0, LWA_COLORKEY) Form2.ShowWindow -1 ShowWindow -1 End Sub '================================================================ '= イベント '================================================================ While 1 WaitEvent Wend Stop End
「TEST.CSV」は、下記のとおり
相川 欽助,087-0021,根室市幸町1丁目3−1,, 安達 邦明,003-0022,札幌市白石区南郷通14丁目2−1,山田マンション302,011-123-4567 井川 国安,090-0833,北見市とん田,, 江藤 五朗,002-8026,札幌市北区篠路6条8丁目,, 大山 大寒,061-2273,札幌市南区豊滝234,, 鎌田 浩介,080-0038,帯広市西8条北3丁目,, 亀田 勇作,040-0001,函館市五稜郭,, 川谷 光男,061-2285,札幌市南区藤野5条4丁目1−2,, 川中 美由紀,005-0841,札幌市南区石山1条6丁目,, 北村 末治,003-0022,札幌市白石区南郷通13丁目南5−1,山並パレス205,011-863-1234 木村 謙吉,093-0021,網走市南十一条西1丁目,, 近田 祐介,006-0811,札幌市手稲区前田1条8丁目,, 斉藤 花子,002-8033,札幌市北区西茨戸3条8丁目,, 佐々木 小次郎,003-0021,札幌市白石区栄通2丁目,宮本ビル1F, 佐々木 守靖,077-0000,留萌市,, 佐野 元義,003-0022,札幌市白石区南郷通11丁目南4,, 島田 古助,061-2274,札幌市南区小金湯,, 鈴木 敬一,099-3602,斜里郡小清水町東野,, 田中 各男,003-0021,札幌市白石区栄通1丁目,, 津田 健一,003-0021,札幌市白石区栄通15丁目4−1,, 所 常蔵,097-0006,稚内市新港1丁目,, 富並 雄一,003-0028,札幌市白石区平和通(南),, 内藤 国の助,003-0022,札幌市白石区南郷通11丁目南8−1,アトムマンション102,011-861-4567 畑中 俊輔,004-0053,札幌市厚別区厚別中央3丁目,,011-883-6587 宮本 武蔵,062-0932,札幌市豊平区平岸2条9丁目,, 森田 杉作,093-0017,網走市南7条西1丁目,, 安田 聖子,040-0001,函館市五稜郭町123,, ラリアット株式会社,006-0836,札幌市手稲区曙6条3丁目21−1,, 和光 留夫,097-0021,稚内市港1−6−5,, 渡辺 昭夫,003-0021,札幌市白石区栄通,,