Thanks for the clarification!
I imagine Pelle said something similar.
The reason for custom functions for almost everything I program stems from when I started programming in C in 1987 with the Amiga 500. I went from Hisoft Basic to SAS-C (I think it was called). I didn't like the hassle of C that wasn't in Hisoft Basic. I started a bit simple by baking the complexities into small files named ac_xxxxxxx_1. "ac" is short for "ASSETC" which means "Asset for C". I also found that the names of various functions didn't really indicate what they were for. Therefore, I changed the names of the ones I used. Like the function we talk about in this thread.
After a few months of working with this I was able to program almost like with Basic. It was much faster to program with my little library and everything was right right away, it rarely went wrong because everything was already right in the library. In the end I had about 100 features.
In 1993 I switched to PC. I then bought Symanteck C/C++. I converted my library to Windows. It took a very long time because Windows was significantly more complicated than the Amiga OS to program. In 1994 I was done and could start programming for real again. Since then it's been 30 years and I switched Symantec to LCC Win32 around 2000. I continued with it until I started Pelles-C around 2015. All the time I've added new features to my library and now it's up to over 800. I know I didn't do this completely by the textbook but it works and I throw together a decently large program in a day or so if it doesn't include special calculations etc. The names of my functions say what they are for, so it's easy to find the right one, etc.
But now I've got a problem. I use very basic C code in my functions. If I try to compile a 64bit program, about 300 of my functions (when I include the whole package) do not work, they are simply not compatible with 64bit. So I have to try to fix it as necessary.
I'm so used to my library now that the times I try to program without it I have to look for code that I can use etc. It also takes significantly longer because I'm not used to it. I pretty much know my library "ASSETC" by heart. I'm too old now to start something new.
A little code, the functions say what they are for. This is my template that I always use when I start a new project:
-----------------------------------------------------
//################################################################
//# NAMN = PcbDesignTool.c
//#//////////////
//# DATUM = 20241210
//# VERSION = Se i ac_WindowCreate_1 nedan
//#//////////////
//# SKAPARE = xxxxxxxx
//#//////////////
//# BESKRIVNING =
//#/////////////=
//#/////////////=
//#/////////////=
//################################################################
//## ##############################################################
//# INITIERINGSFÄLTET
//# Initieringsfältet är ytan före funktionen
//# ac_WindowMainCreate_1. Här lägger man det som
//# skall inkluderas av pre-processorn, prototyper
//# och diverse deklarationer. Programflödet strömmar
//# igenom detta fält endast när applikationen
//# startas upp.
//################################################################
//################################################################
//# INCLUDE
//# När funktioner används includeras endast det som behövs för
//# den eller de funktioner som koden innehåller.
//# Tyvärr så plockar kompilatorn med lite information från varje
//# funktion som _ASSETC_ innehåller. Detta stör inte det färdiga
//# programmet på något sätt men programmet blir större.
//#
//# För att minimera programmets storlek inkluderar man endast
//# de funktioner som behövs för ändamålet. Det kan göras när
//# man är klar med programmet.
//################################################################
//################################################################
//# INCLUDE C:\_ARBETSPLATS_\02_PROGRAM_PRODUKTION\_ASSETC_
#include "../_ASSETC_/_ac.h"
#include <wininet.h>
// * Länkar *
//#################################################
#pragma lib "Shell32.lib"
#pragma lib "Wininet.lib"
#pragma lib "kernel32.lib"
#pragma lib "user32.lib"
#pragma lib "gdi32.lib"
#pragma lib "comctl32.lib"
#pragma lib "comdlg32.lib"
#pragma lib "advapi32.lib"
#pragma lib "delayimp.lib"
//#pragma lib "netutils.lib"
// * Prototypes *
//#################################################
void Funk_09_SkapaKomponenter (HWND hwnd);
void Funk_09_Grafik (HWND hwnd);
int Funk_99_DEBUGG (HWND hwnd,int int_test1, int int_test2);
//##################################################
// * Deklarationer *
//................
//##################################################
HWND hwnd_G_Knapp_stang;
HFONT hfont_G_GrafFont;
//##################################################
// * Globala variabler *
//##################################################
//int int_G_stopp=0;
//##################################################
// * Globala konstanter *
//### ALLA ##########################################
#define KNAPP_STANG 1006
//##################################################
///// ac_WindowMainCreate_1 /////////////////////////////////////////////////////////////
int ac_WindowMainCreate_1(HINSTANCE hInst, HINSTANCE hOldInst,LPSTR lpszArg, int nWinStyle)
{
// Denna funktion måste alltid ingå i ett Windows-
// program för Cover.
// Funktionen startar programmet, anger var
// huvudlopen finns, fångar in Windowsmeddelanden
// och skickar dom vidare till huvudlopen mm.
//
// * Lokala deklarationer mm *
//Medelandestrukturen
MSG msg;
//Fönsterhandtaget
HWND hwnd;
//
//Skapa ett fönster
hwnd=ac_WindowCreate_1(hInst,"Mall",300,100,400,350,"MIN_MAX_CLO"); //
ac_WindowSetCenterPos_1 (hwnd);
// * Meddelandeslingan *
while (GetMessage(&msg, NULL, 0, 0))
{
// Meddelandeslingan har inte byggts
// in i en Cover - funktion utan
// lämnas öppen.
// Orsaken är att användare ibland
// vill och kanske måste lägga egen
// kod här för att få önskad effekt
// i sina program.
//Underlättar användning
//av tangentbord
TranslateMessage(&msg);
//Skicka meddelandet till
//ac_WindowMainProcLoop_1
DispatchMessage(&msg);
}
//Returvärde för
//ac_WindowMainCreate_1
return msg.wParam;
}
/////////////////////////////////////////////////////////////////////////////////////////
///// ac_WindowMainProcLoopLresult_1 ///////////////////////////////////////////////////////////
LRESULT ac_WindowMainProcLoopLresult_1(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// Programmets huvudlop är en central del av
// programmets funktion. Windowsmeddelanden skickas
// igenom denna lop.
// * Huvudväxeln message *
switch (message)
{ // Styr flödet till den
// plats som passar ihop
// med meddelandet.
// Platsen anges efter
// case.
case WM_CREATE:
// Här skapas komponenter
// och annat.
// Detta meddelande körs
// endast en gång vid
// uppstart och ingen mer
// gång.
//** Lägg till ikonen **
ac_WindowSetResIcon_1(hwnd ,"MALL");
//Skapa graf-fonter
hfont_G_GrafFont = ac_GraphicCreateTextFont_1(14,5,0,FW_NORMAL,0,0,"Verdana");//Courier Verdana 15 5
//Skapa komponenterna o **
Funk_09_SkapaKomponenter(hwnd);
break;
//
case WM_SIZE:
// Flödet växlar in här
// när fönstret ändrat
// storlek.
//................
break;
//
case WM_MOVE:
// Flödet växlar in här
// när fönstret ändrat
// storlek.
//................
//Uppdaterar fösnterytan när den flyttats
ac_WindowUpdate_1 (hwnd ,"ERASED");
break;
//
case WM_PAINT:
// Flödet växlar in här
// när Windows anser att
// fönstret skall målas
// om. Grafikfunktioner
// bör alltid ligga här.
//................
Funk_09_Grafik (hwnd);
//Returnerar WM_PAINT meddelanden som inte används
return DefWindowProc(hwnd, message, wParam, lParam);
//
//################################################################
//# FÖR ATT HINDRA FLICKER och ger en ljusare färg
case WM_ERASEBKGND:
return 0;
case WM_COMMAND:
// Flödet växlar in här
// när en identifikator
// från komponenter som
// knappar,menyer, kort-
// kommandon och andra
// kontroller aktiverats.
switch(wParam)
{// Styr flödet till den
// plats som passar ihop
// med idetifikatorn.
// Identifikatorn anges
// efter case.
case KNAPP_STANG:
PostQuitMessage(0);
break;
}
break;
//
case WM_DESTROY:
// Om man utifrån program-
// koden stänger programmet
// skickar Windows detta
// meddelande till proce-
// duren och programmet
// stängs.
//................
// Avslutar applikationen
// när wParam=0
PostQuitMessage(0);
break;
//
default:
// Meddelanden som
// inte tas om hand
// i någon plats
// (case) kan tas
// om hand här.
//Returnerar message meddelanden som inte använts
return DefWindowProc(hwnd, message, wParam, lParam);
}
//
//Returvärdet för
//ac_WindowMainProcLoop_1
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
///// Funktionsfältet ///////////////////////////////////////////////////////////////////
// Fältet här under är till för egna funktioner som
// byggs upp här. Eftersom detta fält aldrig
// genomströmas av programflödet måste en prototyp
// till funktionen placeras i initieringsfältet som
// talar om att funktionen existerar och hur den ser
// ut. Den egna funktionen kan sedan anropas från
// plats där programfödet flyter fram, exempelvis
// inifrån någon case grupp.
// Efter att funktionen gjort sitt återgår program-
// flödet till strax efter där funktionen anropades.
//Här läggs funktioner in som skall utföras
//********************************************************************************************************
void Funk_09_SkapaKomponenter(HWND hwnd)
{
/*ANVÄNDNING:
*
* Skapar komponeneterna för Utgift
*
*GLOBALA:
*
*
*
*
*
*LOKALA :
*/
hwnd_G_Knapp_stang = ac_ButtonSimpleCreate_1(hwnd, 10,310,120,20,"STÄNG","C","SHADOW",KNAPP_STANG);
}
//********************************************************************************************************
//********************************************************************************************************
void Funk_09_Grafik (HWND hwnd)
{
ac_GraphicSetTextOut_1(hwnd,20,35,"vvvvvvvvv",0,hfont_G_GrafFont,0);
}
//********************************************************************************************************
//****************************************************************************************************
int Funk_99_DEBUGG (HWND hwnd, int int_test1, int int_test2)
{
//CLOCKS_PER_SEC
//clock();
/*
clock_t start, end;
double cpu_time_used;
start = clock();
//Do the work.
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
*/
//ac_GraphicSetTextOut_1(NULL,10,500," ",0,hfont_G_GrafFont,0);
//ac_GraphicSetTextOutNummerical_1(NULL,10,500,clock()/CLOCKS_PER_SEC,0,0,0,ac_GRAY_3);
//ac_GraphicSetTextOut_1(NULL,10,430,char_HamtaPostMode,0,hfont_G_GrafFont,0);
//ac_GraphicSetTextOutNummerical_1(NULL,10,450,i,0,0,0,ac_GRAY_3);
//ac_GraphicSetTextOutNummerical_1(NULL,10,480,int_AktuellPostMode2,0,0,0,ac_GRAY_3);
//ac_GraphicSetTextOutNummerical_1(NULL,10,500,int_AktuellPostMode3,0,0,0,ac_GRAY_3);
//ac_GraphicSetTextOutNummerical_1(NULL,10,520,int_SlingaAntPostMode3,0,0,0,ac_GRAY_3);
return 0;
}
//****************************************************************************************************
EDIT:
Entered the code in the code tag and changed in 1997 to the correct one, i.e. 1987.