hi jose, all.
1) I have a question (perhaps it's a dummy question) about the including of these two functions "WINMAIN" and "WndProc" to start application. (manual help says: winmain: "is a user-defined function called by Windows to begin execution of an application.") it's necessary to do this one in "main.bas" example or I can include WINMAIN and WNDPROC for my DLL example too? I haven't managed it and tried it some hours without success.
2) I am using sdk window for my examples. Have started to build one sdk window with buttons and two different ways of popup dialogs (not perfect yet) but I am wondering if it's not possible to make the main application shorter and push all stuff into "mydll.bas" file ?
if you push "xmen" button you will get new popup window and new functions (e.g. "clone" window). other things will come as soon I have more time for this project.
my "batmandll_main.bas"
#COMPILE EXE
#DIM ALL
#INCLUDE "win32api.inc"
DECLARE FUNCTION ShowPopupDialog LIB "BatmanDLL.DLL" ALIAS "ShowPopupDialog" (BYVAL hParent AS DWORD) AS LONG
DECLARE FUNCTION XMEN LIB "BatmanDLL.DLL" ALIAS "XMEN" (BYVAL hParent AS DWORD) AS LONG
DECLARE FUNCTION popupnew LIB "BatmanDLL.DLL" ALIAS "popupnew" (BYVAL hParent AS DWORD) AS LONG
%IDXMEN = 1005
'------------------------------------------------------------------------------------------------------------------------------------------
FUNCTION WINMAIN (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, BYVAL lpszCmdLine AS ASCIIZ PTR, BYVAL nCmdShow AS LONG) AS LONG
'------------------------------------------------------------------------------------------------------------------------------------------
LOCAL hWndMain AS DWORD
LOCAL hCtl AS DWORD
LOCAL hFont AS DWORD
LOCAL wcex AS WNDCLASSEX
LOCAL szClassName AS ASCIIZ * 80
LOCAL rc AS RECT
LOCAL szCaption AS ASCIIZ * 255
LOCAL nLeft AS LONG
LOCAL nTop AS LONG
LOCAL nWidth AS LONG
LOCAL nHeight AS LONG
hFont = GetStockObject(%ANSI_VAR_FONT)
szClassName = "MyClassName"
wcex.cbSize = SIZEOF(wcex)
wcex.style = %CS_HREDRAW OR %CS_VREDRAW
wcex.lpfnWndProc = CODEPTR(WndProc)
wcex.cbClsExtra = 0
wcex.cbWndExtra = 0
wcex.hInstance = hInstance
wcex.hCursor = LoadCursor (%NULL, BYVAL %IDC_ARROW)
wcex.hbrBackground = %COLOR_3DFACE + 1
wcex.lpszMenuName = %NULL
wcex.lpszClassName = VARPTR(szClassName)
wcex.hIcon = LoadIcon (%NULL, BYVAL %IDI_APPLICATION)
wcex.hIconSm = LoadIcon (%NULL, BYVAL %IDI_APPLICATION)
RegisterClassEx wcex
szCaption = "Batmans new SDK Window"
SystemParametersInfo %SPI_GETWORKAREA, 0, BYVAL VARPTR(rc), 0
nWidth = (((rc.nRight - rc.nLeft)) + 2) * 0.75
nHeight = (((rc.nBottom - rc.nTop)) + 2) * 0.70
nLeft = ((rc.nRight - rc.nLeft) \ 2) - nWidth \ 2
nTop = ((rc.nBottom - rc.nTop) \ 2) - (nHeight \ 2)
hWndMain = CreateWindowEx(%WS_EX_CONTROLPARENT, _
szClassName, _
szCaption, _
%WS_OVERLAPPEDWINDOW OR _
%WS_CLIPCHILDREN, _
nLeft, _
nTop, _
nWidth, _
nHeight, _
%NULL, _
0, _
hInstance, _
BYVAL %NULL)
hCtl = CreateWindowEx(0, "BUTTON", "&OpenMe", %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %BS_FLAT, _
0, 0, 0, 0, hWndMain, %IDOK, hInstance, BYVAL %NULL)
IF hFont THEN SendMessage hCtl, %WM_SETFONT, hFont, 0
hCtl = CreateWindowEx(0, "BUTTON", "&Close", %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %BS_FLAT, _
0, 0, 0, 0, hWndMain, %IDCANCEL, hInstance, BYVAL %NULL)
IF hFont THEN SendMessage hCtl, %WM_SETFONT, hFont, 0
hCtl = CreateWindowEx(0, "BUTTON", "&XMEN", %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %BS_FLAT, _
10, 470, 80, 24, hWndMain, %IDXMEN, hInstance, BYVAL %NULL)
IF hFont THEN SendMessage hCtl, %WM_SETFONT, hFont, 0
ShowWindow hWndMain, nCmdShow
UpdateWindow hWndMain
LOCAL uMsg AS tagMsg
WHILE GetMessage(uMsg, %NULL, 0, 0)
IF ISFALSE IsDialogMessage(hWndMain, uMsg) THEN
TranslateMessage uMsg
DispatchMessage uMsg
END IF
WEND
FUNCTION = uMsg.wParam
END FUNCTION
' ========================================================================================
' Main Window procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
LOCAL hDC AS DWORD
LOCAL pPaint AS PAINTSTRUCT
LOCAL tRect AS RECT
LOCAL rc AS RECT
SELECT CASE wMsg
CASE %WM_CREATE
CASE %WM_SIZE
IF wParam <> %SIZE_MINIMIZED THEN
GetClientRect hWnd, rc
MoveWindow GetDlgItem(hWnd, %IDOK), (rc.nRight - rc.nLeft) - 185, (rc.nBottom - rc.nTop) - 35, 75, 23, %TRUE
MoveWindow GetDlgItem(hWnd, %IDCANCEL), (rc.nRight - rc.nLeft) - 95, (rc.nBottom - rc.nTop) - 35, 75, 23, %TRUE
END IF
CASE %WM_COMMAND
SELECT CASE LO(WORD, wParam)
CASE %IDOK
IF HI(WORD, wParam) = %BN_CLICKED THEN
ShowPopupDialog(hwnd)
MSGBOX "hello catwoman, come with me :)", %MB_OK, "my popup Test for new DLL" + DATE$
END IF
CASE %IDXMEN
IF HI(WORD, wParam) = %BN_CLICKED THEN
XMEN(hwnd)
MSGBOX "hello Magneto, don't come with me :)", %MB_OK, "my popup Test for new DLL" + DATE$
END IF
CASE %IDCANCEL
IF HI(WORD, wParam) = %BN_CLICKED THEN
SendMessage hWnd, %WM_CLOSE, 0, 0
EXIT FUNCTION
END IF
END SELECT
CASE %WM_CREATE
CASE %WM_PAINT
hDC = BeginPaint(hWnd, pPaint)
GetClientRect hWnd, tRect
SetBkMode hDC, %TRANSPARENT
SetTextColor hDC, %YELLOW
DrawText hDC, "Hello Batman, where are you?", -1, tRect, %DT_SINGLELINE OR %DT_CENTER OR %DT_VCENTER
EndPaint hWnd, pPaint
FUNCTION = 1
EXIT FUNCTION
CASE %WM_ERASEBKGND
hDC = wParam
DrawGradient hDC
FUNCTION = 1
EXIT FUNCTION
CASE %WM_CTLCOLORBTN, %WM_CTLCOLOREDIT, %WM_CTLCOLORLISTBOX, %WM_CTLCOLORSTATIC
CASE %WM_SYSCOMMAND
IF (wParam AND &HFFF0) = %SC_CLOSE THEN
SendMessage hWnd, %WM_CLOSE, 0, 0
EXIT FUNCTION
END IF
CASE %WM_CLOSE
CASE %WM_DESTROY
PostQuitMessage 0
EXIT FUNCTION
END SELECT
FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam)
END FUNCTION
' ========================================================================================
'==============================================================================
SUB DrawGradient (BYVAL hDC AS DWORD)
'------------------------------------------------------------------------------
' Custom draw procedure for gradiend fill
'--------------------------------------------------------------------------
LOCAL rectFill AS RECT
LOCAL rectClient AS RECT
LOCAL fStep AS SINGLE
LOCAL hBrush AS DWORD
LOCAL lOnBand AS LONG
GetClientRect WindowFromDC(hDC), rectClient
fStep = rectClient.nbottom / 200
FOR lOnBand = 0 TO 199
SetRect rectFill, 0, lOnBand * fStep, rectClient.nright + 1, (lOnBand + 1) * fStep
hBrush = CreateSolidBrush(RGB(0, 0, 255 - lOnBand))
Fillrect hDC, rectFill, hBrush
DeleteObject hBrush
NEXT
END SUB
more to come, I am sure. / saved exe, dll and "batmandll_main.bas" in zip file.
best regards, frank