Hi Charles,
this is a nice little demo which I ported to Oxygenbasic using notify statements. I must use:
dword TCN_SELCHANGE= -551
dword TCN_SELCHANGING= -552
to compile it correctly in Win64. This solution seems to work at any rate. But I am not sure if I am a bit obtuse and overlook all the time the same thing?
Roland
'https://msdn.microsoft.com/de-de/library/windows/desktop/hh298367(v=vs.85).aspx
$ filename "win_tabnotify.exe"
'uses rtl32
'uses rtl64
uses WinUtil
'uses console
#autodim off
indexbase 0
% WC_TABCONTROL="SysTabControl32"
% WC_STATIC="Static"
% ICC_TAB_CLASSES = 8
% TCIF_TEXT=1
% TCIF_IMAGE=2
% TCM_INSERTITEM=4871
% TCM_GETCURSEL=4875
dword TCN_SELCHANGE= -551
dword TCN_SELCHANGING= -552
% SWP_SHOWWINDOW=64
% HWND_TOP=0
type TCITEM
int mask,dwState,dwStateMask
char* pszText
int cchTextMax,iImage
sys lParam
end type
typedef TCITEM TC_ITEM
% DAYS_IN_WEEK 7
string day[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}
' Initialize common controls.
INITCOMMONCONTROLSEXt icex
icex.dwSize = sizeof(INITCOMMONCONTROLSEX)
icex.dwICC = ICC_TAB_CLASSES
InitCommonControlsEx(&icex)
sys hInstance=inst
MainWindow 480,360,WS_OVERLAPPEDWINDOW
function WndProc(sys hwnd, uMsg, wParam, lParam) as sys callback
static sys hwndTab, hwndStatic
select uMsg
case WM_CREATE
' Get the dimensions of the parent window's client area, and
' create a tab control child window of that size.
RECT rcClient
TCITEM tie
GetClientRect(hwnd, &rcClient)
hwndTab = CreateWindowEx(0,WC_TABCONTROL, "",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0, rcClient.right, rcClient.bottom,
hwnd, null, hInstance, null)
if (hwndTab = null) then
mbox "Create Tab Control failed"
return null
end if
' Add tabs for each day of the week.
tie.mask = TCIF_TEXT | TCIF_IMAGE
tie.iImage = -1
int i
for i = 0 to <DAYS_IN_WEEK
' Load the day string
tie.pszText=day[i]
if SendMessage(hwndTab,TCM_INSERTITEM,i, @tie) = -1 then
mbox "InsertItem Tab failed"
DestroyWindow(hwndTab)
return null
end if
next i
' Creates a child window (a static control) to occupy the tab control's display area.
' hwndTab - handle of the tab control.
hwndStatic = CreateWindowEx(0,WC_STATIC, "",
WS_CHILD | WS_VISIBLE | WS_BORDER,
100, 100, 100, 100, ' Position and dimensions; example only.
hwndTab, null, hInstance, ' g_hInst is the global instance handle
null)
SendMessage(hwndStatic, WM_SETTEXT, 0, strptr day[0]) 'Sunday
case WM_SIZE
' Handles the WM_SIZE message for the main window by resizing the tab control.
' hwndTab - handle of the tab control.
' lParam - the lParam parameter of the WM_SIZE message.
' RECT rc
' Resize the tab control to fit the client are of main window.
' SetWindowPos(hwndTab, HWND_TOP, 0, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), SWP_SHOWWINDOW)
int x=loword(lParam) : int y=hiword(lParam)
SetWindowPos(hwndTab, HWND_TOP, 0,0, x,y, SWP_SHOWWINDOW)
case WM_NOTIFY
' Handles notifications from the tab control, as follows:
' TCN_SELCHANGING - always returns FALSE to allow the user to select a different tab.
' TCN_SELCHANGE - loads a string resource and displays it in a
' static control on the selected tab.
' hwndTab - handle of the tab control.
' lParam - the lParam parameter of the WM_NOTIFY message.
NMHDR pnmhdr at lParam
select pnmhdr.code
case TCN_SELCHANGING
' Return FALSE to allow the selection to change.
return FALSE
case TCN_SELCHANGE
'' int iPage = TabCtrl_GetCurSel(hwndTab)
int iPage = SendMessage(hwndTab, TCM_GETCURSEL, 0,0)
SendMessage(hwndStatic, WM_SETTEXT, 0, strptr day[iPage])
end select
return TRUE
case WM_CLOSE
DestroyWindow(hwnd)
case WM_DESTROY
PostQuitMessage(0)
case else
return DefWindowProc(hwnd, uMsg, wParam, lParam)
end select
return 0
end function