Form1 0Run This Program As An EXE File For Best Results Form1% ShoppingList FindPic Command2 Cancel Command1 Check2 Whole Word Check1 Case Sensitive FindTextBox FindTitle Label3 Find What: PyramidPic MeatList PyramidPic VegList FruitList PastryList WindowPic ChessHelpCmdBut ChessPic PyramidPic Label4 %Drag FIND Box Around By Its Title Bar Label1 Shopping List Label2 "Use Lists To Build A Shopping List ControlhWnd BringWindowToTop hWndG SetWindowPos hWndInsertAfter wFlags GetNextWindow wFlagX IsWindowVisiblex GetActiveWindow GetParent SetParentC hWndChild2 hWndNewParent GetWindowLong nIndex SetWindowLong dwNewLong WS_CLIPSIBLINGS SWP_NOSIZE SWP_NOMOVE SWP_NOZORDER SWP_NOREDRAW SWP_NOACTIVATE SWP_DRAWFRAME SWP_SHOWWINDOWi SWP_HIDEWINDOW SWP_NOCOPYBITSd SWP_NOREPOSITIONK GW_HWNDLAST GW_HWNDNEXT GW_HWNDPREV GWL_WNDPROC GWW_HINSTANCEj GWW_HWNDPARENT GWW_ID GWL_STYLE GWL_EXSTYLE Truez Falseq XStart YStart' OKToMove1) OKToMove2 OKToMove3 OKToMove4y OKToMove6 WindowStack NumOfControls hWndWindowToMoveo NeedsFixing GW_HWNDFIRST GW_OWNER GW_CHILDl SetClipSibling Parentv GetWindow SetClipSiblingBit Style WS_CLIPSIBLING Form_Clickw @ Form_Loadf Form1 Screen4 Width Height~ GetWindowsDirectoryV lpBuffer nSize WinDir ChessBmp OF_EXIST OpenFile/ lpFileName lpReOpenBuff OFSTRUCT wStyle Buffer ChessPicH Picture MousePointer ChessPic_Click ChessPic_MouseDownV Button Shift OkToMoveChessPic ChessPic_MouseMove ChessHelpCmdBut Visible FormParenti ControlParent ParentType AnyControl NestedSibling SetClipSiblingBits^ hWndParentj WindowPic Picture2_Click Picture2_MouseDownE OkToMovePicture2 Picture2_MouseMove Picture2 Command1 WindowPic_Click ChessHelpCmdBut_Click List1_Click? VegList MeatListz FruitList PastryList TopListBoxU PrecedingListBox MeatList_Click MeatList_GotFocus FruitList_Click0 FruitList_GotFocus PastryList_Click VegList_Click VegList_GotFocus @ FillLists PastryList_GotFocus ClickedToGetFocus ShoppingList ListIndex BringToTop ThisList InsertAfter ClickedToSetFocus OkToMoveWindowPic GetWindowNext PyramidBmp: PyramidPic Pyramid PyramidPic_Click Index PyramidPic_MouseDown Pic4' OkToMovePyramidPicQ @ PyramidPic_MouseMove Label3_Click\ FindLabel_Clicko FindLabel_MouseDown OkToMoveFindPic FindLabel_MouseMove FindPic FindTitle_Click FindTitle_MouseDown FindTitle_MouseMove Timer1_Timer hwndFindPic Timer1 Enabled Purpose program demonstrate Command1_Click Control CLPSIB.BAS Rev. 1.0 Keith Funk (CIS 72240, 2020)7 Nov. 3, 1991 Many thanks to Daniel Appleman (Desaware) for explainingg the Win3 WS_CLIPSIBLINGS style without which this program could not have been written. I'd also like to thank Ted Young and Jonathan Zuk for the help they have given me in learning the Win3 API.o The purpose of the program is to demonstrate how to implement overlapping controls in a VB program. NOTE that the Form and all controls have their ScaleMode sett to PIXELS. Also, AutoRedraw is False for all controls. Thee Picture Controls that contain the bitmaps PYRAMID.BMP and CHESS.BMP have AutoSize set to True. No other control properties have any particular relevance for this demo. The program is FREEWARE. Feel free to use any part of it in your own programs. Feedback and comments wouldd be appreciated. Have fun. -- Declarations for external functions. CTLHWND.DLL is a custom DLL written by Jonathan Zuk. It is included, with thanks to Jonathan, as part of CLPSIB. ctlhwnd.dll KernelZ Kernel -- Window style. -- THE SECRET TO SUCCESSa -- SetWindowPos Flags -- GetWindow() Constants -- Window field offsets for GetWindowLong() and GetWindowWord()e -- OpenFile action.. -- The mouse location when the mouse button is initially pressed. -- Flags to indicate when a picture can be moved. A move is not allowed while a DoEvents is in progress. -- Keeps track of the location of the list boxes in them window stack. -- Flag to determine if user clicked a listbox to make a selection or just to bring it to the front. BringToTop This routine brings ThisList to the top of the window stack so it appears on top of the other listboxes.. It also sets some global variables that keep track of the current order of the window stack.. -- If ThisList is already at the top then there's nothing to do. -- Put the listbox that is currently on top back in its proper location. Note that we don't need to specify x,y,cx and cy because the flagsf SWP_NOMOVE and SWP_NOSIZE tell Win3 to ignore these values. -- Find out which window precedes ThisList in the window stack.t -- Move this listbox to the front of the group ofu listboxes *BUT* behind the FindPic control. We aree demonstrating how a control (FindPic) can *always*w remain in front of all other controls even when these controls are being re-arranged. -- Tell Click Event to ignore this click because user is just bringing the list to the front.e ChessHelpCmdBut_Click The main purpose of this control is to demonstratee how setting the WS_CLIPSIBLINGS style bit allows youu to slide a picture underneath another control. NOTE that this control has been placed on the WindowPicc control. It is *not* on Form1.. Use the LEFT Mouse Button to drag the small pictures on top of CHESS.BMP and to scroll CHESS.BMP. Chess Help ChessPic_MouseDown This control is filled with the bitmap CHESS.BMPP during the Form1_Load Event. Because its AutoSize Property is set to True, it becomes much larger thann the WindowPic control on which it is placed, but youu can only see the area of CHESS.BMP that is within the boundaries of WindowPic. However, you can use yourr mouse to -move- different parts of CHESS.BMP into the visible area. NOTE how the picture -slides under- the Help Command Button. Too neat. This is where the moving of CHESS.BMP begins. It is continued in the MouseMove Event. -- Save mouse X/Y so MouseMove can determine how far the mouse has moved.o -- Set flag for MouseMove. ChessPic_MouseMove This is the routine that actually moves CHESS.BMP.. Note that the flag OkToMoveChessPic and the DoEventss are *absolutely* essential to the correct operation of this routine.. -- Only move the picture if left button is down. -- Only move the picture if no DoEvent is in progress. -- DoEvents has finished.o Command1_Click In a -real- program, this button would activate the code to find text.. You Actually Expected Something To Happen? FillLists Fills the meat, vegetable, fruit and pastry lists with goodies. -- Fill the Meat List. Rib Roast Pork Chops Chicken Ground Beef Lamb Chops Spare Ribs Pigs Feet Sausage Hot Dogs -- Fill the Vegetable List. Potatoes Onions Turnip Carrots Beans Eggplant Celery -- Fill the Fruit List Apples Oranges Pears Grapes Melons Lemons Limes Apricots Quinces Plums Peaches -- Fill the Pastry List Donuts Bread Crullers Cherry Pie Lemon Cake Cookies Macaroons Muffins Brownies Date Squares Peach Pie FindTitle_MouseDown This Picture Control acts as a dark blue title bar for the FindPicc Picture Control. Its purpose is to allow FindPic and all its childd windows to be dragged around the Form.. NOTE: That FindPic *always* appears on top of any other control.. Very desireable for a Find Dialog Box.. -- Save mouse X/Y so MouseMove can determine how far the mouse has moved.u -- Set flag for MouseMove. FindTitle_MouseMove This is the routine that actually drags FindPic around. -- Only move the picture if left button is down. -- Only move the picture if no DoEvent is in progress. -- DoEvents has finished.o Form_Load -- Display hourglass mousepointer. -- Show the window centered on the screen. * THIS IS THE KEY TO THE ENTIRE DEMO. TRY COMMENTING OUT * THE CALL TO SetClipSiblings AND WATCH THE PROGRAM FALL TO PIECES.* D* ** -- Set the CLIPSIBLING Style bit for all child windows.d SET UP THE CHESS.BMP CONTROLS.R -- Find the Win3 directory and append a backslash. Can't Find Window's Directory Fatal Error -- Strip trailing \0. -- If CHESS.BMP exists, load it into ChessPic. CHESS.BMP Sorry, This Program Requires The Win3 Bitmap CHESS.BMP. FATAL ERROR -- Put the Command Button for CHESS.BMP on top of the Chess Picture, so the picture can be scrolled underneath it. -- If PYRAMID.BMP exists, load it into the three PyramidPic controls.A PYRAMID.BMP Sorry, This Program Requires The Win3 Bitmap PYRAMID.BMP. FATAL ERROR -- Make sure the PyramidPics are higher in the window stack than WindowPic so they will appear on top of CHESS.BMP.- -- Display the Chess demo controls.W SET UP THE LIST BOX CONTROLS. -- Add items to the lists. -- Place the controls in their correct order. Meat, Veg, Fruit then Pastry. -- Display them. -- improves the way Win3 initially paints the display. -- Set Global variables to keep track of which listbox is on top and which list it normally comes after. SET UP THE FIND CONTROLS. -- Make the Find "dialog box" the top most child window of the Form, so it is *always* displayed on top of all other child windows. Then make it visible.i -- improves the way Win3 initally paints the screen. -- Set standard mousepointer.n FruitList_Click Adds the item selected from FruitList to the ShoppingList.. -- Don't do anything if user just clicked to bring the list to the front.r -- Add selected item to our shopping list. FruitList_GotFocus Displays this list on top of the other list boxes.. MeatList_Click Adds the item selected from MeatList to the ShoppingList. -- Don't do anything if user just clicked to bring the list to the front.s -- Add selected item to our shopping list. MeatList_GotFocus Displays this list on top of the other list boxes.- PastryList_Click Adds the item selected from PastryList to the ShoppingList. -- Don't do anything if user just clicked to bring the list to the front.s -- Add selected item to our shopping list. PastryList_GotFocus Displays this list on top of the other list boxes.- PyramidPic_MouseDown This is where the start of moving the small picture controls containing PYRAMID.BMP begins. -- Save mouse X/Y so MouseMove can determine how far the mouse has moved.u -- Set flag for MouseMove. PyramidPic_MouseMove This is the routine that actually moves the picture controls that contain PYRAMID.BMP.. -- Only move the picture if the left mouse button is down. -- Only move the picture if no DoEvent is in progress. -- DoEvents has finished.o SetClipSiblingBit This routine sets the WS_CLIPSIBLINGS style bit for all child windows of the Parent window *and* anyi child windows of the child windows. The routine iss recursive.. *** THIS IS THE KEY ROUTINE OF THE PROGRAM. *** Setting the WS_CLIPSIBLINGS style bit is all that is- needed to make VB work properly with overlappingg controls. Or at least, so it appears to me. -- Get the first child window. -- Set the CLIPSIBLING bit for each child window.n Loop terminates when GetWindowNext runs out ofu child windows and returns NULL. -- Get current style.y -- Set the bit.e -- Set new style., -- Process any child windows of this window. -- recursive call. -- Get the next top level child window.y VegList_Click Adds the item selected from VegList to the ShoppingList.- -- Don't do anything if user just clicked to bring the list to the front.s -- Add selected item to our shopping list. VegList_GotFocus Displays this list on top of the other list boxes.- WindowPic_Click This control is the Parent of the ChessPic control. That is, ChessPic has been placed *on* this control,, *not* on Form1. It serves as a clipping window whichh restricts the amount of ChessPic which is visible.. NOTE that ChessPic has its AutoSize Property set to True, so when CHESS.BMP is loaded into its Picturee Property, ChessPic becomes *much* larger than thiss picture control..