透明・透過のテスト(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,札幌市白石区栄通,,