Hallo,
I would like to use a DDT-example from the PowerBasic-forum in my SDK code. Unfortunately I get with my SDK-translation not the same result. I use PBWin 9.05 an Windows XP SP3.
1. the listbox has no height. I can help me futher with the added style %LBS_NOINTEGRALHEIGHT. But why is that with DDT not necessary?
2. is olny one bitmap displayed with the SDK-style.
(I use PBWin 9.05 an Windows XP SP3.)
Please help me further.
DDT:
' Ownerdrawn bmp-listbox sample -> DDT-Style
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
#COMPILE EXE
#INCLUDE "WIN32API.INC"
DECLARE CALLBACK FUNCTION DlgProc
%IDC_LISTBOX_30 = 30
%BMPMARGIN = 2
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' Main entrance - Create dialog and controls
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
FUNCTION PBMAIN
LOCAL hDlg AS LONG, ic AS LONG, hBmp AS LONG, lRes AS LONG, txt AS STRING
DIALOG NEW 0, "BmpList sample",,, 160, 120, %WS_CAPTION OR %WS_SYSMENU TO hDlg
CONTROL ADD LISTBOX, hDlg, 30,, 5, 5, 40, 36, %WS_CHILD OR _
%WS_VISIBLE OR %LBS_OWNERDRAWFIXED OR %LBS_HASSTRINGS OR _
%LBS_NOTIFY OR %WS_TABSTOP OR %WS_VSCROLL, %WS_EX_CLIENTEDGE
CONTROL SEND hDlg, 30, %LB_SETITEMHEIGHT, 0, 36
CONTROL ADD BUTTON, hDlg, %IDCANCEL, "&Close", 105, 98, 50, 14
'add some small system bitmaps, just to show how it works.
FOR ic = 32660 TO 32661
hBmp = LoadImage(BYVAL %NULL, BYVAL ic, %IMAGE_BITMAP, 0, 0, %LR_SHARED)
IF hBmp THEN
txt = ""
CONTROL SEND hDlg, %IDC_LISTBOX_30, %LB_ADDSTRING, 0, STRPTR(txt), TO lRes
CONTROL SEND hDlg, %IDC_LISTBOX_30, %LB_SETITEMDATA, lRes, hBmp
END IF
NEXT
DIALOG SHOW MODAL hDlg, CALL DlgProc
END FUNCTION
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' Main dialog callback
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CALLBACK FUNCTION DlgProc
SELECT CASE CBMSG
CASE %WM_INITDIALOG
LOCAL itd AS LONG, rc AS RECT, lpdis AS DRAWITEMSTRUCT PTR, zTxt AS ASCIIZ * 300
CASE %WM_COMMAND
SELECT CASE CBCTL
CASE %IDCANCEL
IF CBCTLMSG = %BN_CLICKED THEN DIALOG END CBHNDL
END SELECT
CASE %WM_DRAWITEM
IF CBWPARAM = %IDC_LISTBOX_30 THEn
lpdis = CBLPARAM
IF @lpdis.itemID = &HFFFFFFFF THEN
EXIT FUNCTION
end if
SELECT CASE @lpdis.itemAction
CASE %ODA_DRAWENTIRE, %ODA_SELECT
'CLEAR BACKGROUND
IF (@lpdis.itemState AND %ODS_SELECTED) = 0 THEN 'if not selected
FillRect(@lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_WINDOW)) 'clear background
CALL SetBkColor(@lpdis.hDC, GetSysColor(%COLOR_WINDOW)) 'text background
CALL SetTextColor(@lpdis.hDC, GetSysColor(%COLOR_WINDOWTEXT)) 'text color
ELSE
FillRect(@lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_HIGHLIGHT)) 'clear background
CALL SetBkColor(@lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHT)) 'text background
CALL SetTextColor(@lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHTTEXT)) 'text color
END IF
'DRAW BITMAP
itd = SendMessage(GetDlgItem(CBHNDL, %IDC_LISTBOX_30), %LB_GETITEMDATA, @lpdis.itemID, 0)
IF itd THEN
CALL DrawState(@lpdis.hDC, 0&, 0&, itd, 0&, _
%BMPMARGIN, @lpdis.rcItem.ntop + %BMPMARGIN, 0, 0, &H4)
'Note: if you want to draw icons instead - change last value to &H3
END IF
FUNCTION = %TRUE : EXIT FUNCTION
END SELECT
END IF
END SELECT
END FUNCTION
SDK:
' Ownerdrawn bmp-listbox sample -> SDK-Style
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' Declares
'----------------------------------------------------------------------
#COMPILE EXE
#INCLUDE "WIN32API.INC"
%IDC_LISTBOX_30 = 30
%IDC_BUTTON_2 = 2
%BMPMARGIN = 2
'----------------------------------------------------------------------
DECLARE FUNCTION WndProc(BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, _
BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' Program entrance
'----------------------------------------------------------------------
FUNCTION WINMAIN(BYVAL hInst AS DWORD, BYVAL hPrevInstance AS DWORD, _
BYVAL lpszCmdLine AS ASCIIZ PTR, BYVAL nCmdShow AS LONG) AS LONG
LOCAL wc AS WndClassEx, hFont AS DWORD
LOCAL hParent AS DWORD, hCtl AS DWORD, rc AS RECT
LOCAL dwStyle AS DWORD, dwStyleEx AS DWORD
LOCAL sCaption AS STRING, szClassName AS ASCIIZ*255
local ic AS LONG
local hBmp AS LONG
local txt AS STRING
szClassName = "MainClassName"
sCaption = "BmpList sample"
dwStyle = %WS_VISIBLE OR %WS_CLIPSIBLINGS OR %WS_CAPTION OR _
%WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR _
%DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT OR _
%DS_CENTER
dwStyleEx = %WS_EX_WINDOWEDGE OR %WS_EX_CONTROLPARENT
CALL SetRect(rc, 517, 398, 246, 227)
wc.cbSize = SIZEOF(wc)
wc.style = %CS_DBLCLKS OR %CS_HREDRAW OR %CS_VREDRAW
wc.lpfnWndProc = CODEPTR(WndMainProc)
wc.cbClsExtra = 0
wc.cbWndExtra = 0
wc.hInstance = hInst
wc.hCursor = LoadCursor (%NULL, BYVAL %IDC_ARROW)
wc.hbrBackground = GetSysColorBrush(%COLOR_BTNFACE)
wc.lpszMenuName = %NULL
wc.lpszClassName = VARPTR(szClassName)
wc.hIcon = LoadIcon (%NULL, BYVAL %IDI_APPLICATION) 'sample, if resource icon: LoadIcon(hInst, "APPICON")
wc.hIconSm = LoadIcon (%NULL, BYVAL %IDI_APPLICATION) 'remember to set small icon too..
IF ISFALSE(RegisterClassEx(wc)) THEN
FUNCTION = %TRUE :EXIT FUNCTION
END IF
hParent = CreateWindowEx(dwStyleEx,szClassName,BYVAL STRPTR(sCaption),dwStyle, _
rc.nLeft,rc.nTop,rc.nRight,rc.nBottom, _
%HWND_DESKTOP,%NULL,GetModuleHandle(""), BYVAL %NULL)
'------------------------------------------------------------------------------
szClassName = "ListBox"
sCaption = ""
dwStyle = %WS_CHILD OR _
%WS_VISIBLE OR %LBS_OWNERDRAWFIXED OR %LBS_HASSTRINGS OR _
%LBS_NOTIFY OR %WS_TABSTOP OR %WS_VSCROLL 'OR %LBS_NOINTEGRALHEIGHT
dwStyleEx = %WS_EX_CLIENTEDGE ' OR %WS_EX_CONTROLPARENT
CALL SetRect(rc, 8, 8, 40, 36)
hCtl = CreateWindowEx(dwStyleEx,szClassName,BYVAL STRPTR(sCaption),dwStyle, _
rc.nLeft,rc.nTop,rc.nRight,rc.nBottom, _
hParent,%IDC_LISTBOX_30,GetModuleHandle(""), BYVAL %NULL)
SendMessage hCtl, %LB_SETITEMHEIGHT, 0, 36
FOR ic = 32660 TO 32661
hBmp = LoadImage(BYVAL %NULL, BYVAL ic, %IMAGE_BITMAP, 0, 0, %LR_SHARED)
IF hBmp THEN
txt = ""
SendMessage hCtl, %LB_ADDSTRING, 0, STRPTR(txt)
SendMessage hCtl, %LB_SETITEMDATA, 0, hBmp
END IF
NEXT
'------------------------------------------------------------------------------
szClassName = "Button"
sCaption = "&Close"
dwStyle = %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP
dwStyleEx = 0
CALL SetRect(rc, 158, 159, 75, 23)
hCtl = CreateWindowEx(dwStyleEx,szClassName,BYVAL STRPTR(sCaption),dwStyle, _
rc.nLeft,rc.nTop,rc.nRight,rc.nBottom, _
hParent,%IDC_BUTTON_2,GetModuleHandle(""), BYVAL %NULL)
'------------------------------------------------------------------------------
ShowWindow hParent, nCmdShow
UpdateWindow hParent
LOCAL uMsg AS tagMsg
WHILE GetMessage(uMsg, %NULL, 0, 0)
TranslateMessage uMsg
DispatchMessage uMsg
WEND
FUNCTION = uMsg.wParam
END FUNCTION
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' Main Window procedure
'----------------------------------------------------------------------
FUNCTION WndMainProc (BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, _
BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
SELECT CASE wMsg
CASE %WM_INITDIALOG
LOCAL itd AS LONG, rc AS RECT, lpdis AS DRAWITEMSTRUCT PTR, zTxt AS ASCIIZ * 300
CASE %WM_COMMAND
'Messages from controls and menu items are handled here.
'-------------------------------------------------------
SELECT CASE LOWRD(wParam)
CASE %IDCANCEL
IF HIWRD(wParam) = %BN_CLICKED OR HIWRD(wParam) = 1 THEN
SendMessage hWnd, %WM_DESTROY, wParam, lParam
FUNCTION = 0 : EXIT FUNCTION
END IF
CASE %IDC_BUTTON_2
END SELECT
CASE %WM_DRAWITEM
IF wParam = %IDC_LISTBOX_30 THEN
lpdis = lParam
IF @lpdis.itemID = &HFFFFFFFF THEN
EXIT FUNCTION
end if
SELECT CASE @lpdis.itemAction
CASE %ODA_DRAWENTIRE, %ODA_SELECT
'CLEAR BACKGROUND
IF (@lpdis.itemState AND %ODS_SELECTED) = 0 THEN 'if not selected
FillRect(@lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_WINDOW)) 'clear background
CALL SetBkColor(@lpdis.hDC, GetSysColor(%COLOR_WINDOW)) 'text background
CALL SetTextColor(@lpdis.hDC, GetSysColor(%COLOR_WINDOWTEXT)) 'text color
ELSE
FillRect(@lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_HIGHLIGHT)) 'clear background
CALL SetBkColor(@lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHT)) 'text background
CALL SetTextColor(@lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHTTEXT)) 'text color
END IF
'DRAW BITMAP
itd = SendMessage(GetDlgItem(hWnd, %IDC_LISTBOX_30), %LB_GETITEMDATA, @lpdis.itemID, 0)
IF itd THEN
CALL DrawState(@lpdis.hDC, 0&, 0&, itd, 0&, _
%BMPMARGIN, @lpdis.rcItem.ntop + %BMPMARGIN, 0, 0, &H4)
'Note: if you want to draw icons instead - change last value to &H3
END IF
FUNCTION = %TRUE : EXIT FUNCTION
END SELECT
END IF
CASE %WM_DESTROY
' is sent when program ends - a good place to delete any created objects and
' store settings in file for next run, etc. Must send PostQuitMessage to end
' properly in SDK-style dialogs. The PostQuitMessage function posts a WM_QUIT
' message to the program's (thread's) message queue, and then WM_QUIT causes
' the GetMessage function to return zero in WINMAIN's message loop.
'----------------------------------------------------------------------------
PostQuitMessage 0
FUNCTION = 0 : EXIT FUNCTION
END SELECT
FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam)
END FUNCTION