10-11-2023, 12:55 PM
A friend asked me to help him out how making a notebook paper screen that would work for various screen sizes and font size. He was trying to use an image&, but couldn't get the LOCATE/PRINT to fit in the paper lines. I suggested this way to him, using _FONTWIDTH/_FONTHEIGHT to scale drawing text LINEs instead. Thought I'd share it here because it may be something others may want. I commented this code more than usual to help my friend learn. This SUB draws a yellow legal pad paper, but you can make other papers styles fairly easy.
- Dav
- Dav
Code: (Select All)
'yellowpaper.bas
'by Dav, OCT/2023
SCREEN _NEWIMAGE(800, 600, 32)
'Here's where you can load another font you want to use....
'fnt& = _LOADFONT("lucon.ttf", 24, "monospace")
'_FONT fnt&
'Call the SUB, with your title$ message
YellowPaper "John's QB64-PE Code Notebook"
'You need to call below so PRINTing text doesn't destroy background.
_PRINTMODE _KEEPBACKGROUND
'=== show some sample information....
COLOR _RGB(64, 64, 64)
FOR y = 5 TO 16
LOCATE y, 2: PRINT DATE$;
LOCATE , 16: PRINT "Random Data ="; RND; RN;
NEXT: PRINT
'Use location 2 to print in left column, 16 for printing in the text lines.
PRINT
LOCATE , 16: PRINT "This is another line."
PRINT
LOCATE , 2: PRINT "Tuesday:"
LOCATE , 16: PRINT "Dear diary, today I wrote this...."
SLEEP
SUB YellowPaper (title$)
'This SUB draws yellow notebook paper, scaled to fit current font settings.
'It also prints and centers title$ in the top title area.
fw = _FONTWIDTH: fh = _FONTHEIGHT 'get current font width/height settings
'(the fw & fh we will use to calculate LINE drawing so they line up right with PRINT)
CLS , _RGB(255, 245, 154) 'clear screen to yellow color
'draw the two vertical brown lines, to make column/text area
LINE (fw * 12, 0)-(fw * 12, _HEIGHT), _RGB(205, 185, 98)
LINE (fw * 12.5, 0)-(fw * 12.5, _HEIGHT), _RGB(205, 185, 98)
'draw the text lines to bottom of screen
FOR y = fh - 1 TO _HEIGHT STEP fh
LINE (0, y)-(_WIDTH, y), _RGB(152, 160, 74)
NEXT
'draw top brown tile area (remove this if not wanted)
LINE (0, 0)-(_WIDTH, fh * 3), _RGB(102, 19, 15), BF '<< enough for 3 lines
COLOR _RGB(255, 255, 0)
'Next we print title$, centering the text in the top area
'For this we need to calcuale how many letters fit on one line, INT(_WIDTH/fw) / 2.
'I divided that by 2 to find the center spot on the line.
'So, subtract half of the title$ length from that spot to make it centered nice.
LOCATE 2, INT((_WIDTH / fw) / 2) - INT(LEN(title$) / 2)
'Now we PRINT the text, but we need to print a certain way so the background isn't
'messed up. We will use _PRINTMODE _KEEPBACKGROUND to do that.
'First, let's save the current printmode so we can restore that when SUB is done.
pmode = _PRINTMODE
_PRINTMODE _KEEPBACKGROUND
PRINT title$; 'finally, PRINT the title$
'All done, so let's restore previous printmode setting
IF pmode = 1 THEN _PRINTMODE _KEEPBACKGROUND
IF pmode = 2 THEN _PRINTMODE _ONLYBACKGROUND
IF pmode = 3 THEN _PRINTMODE _FILLBACKGROUND
END SUB

