I've done, actually, *very* little win32 (or otherwise) GUI programming, directly in C(++)... so don't mind me too much here, but I do have *an* example online just for sake of introduction / discussion:
https://github.com/T3sl4co1l/raycast_winJust opening a frame and getting a canvas object, setting up menus if applicable, etc., it's not
too painful, but there's just a lot of parameters to these objects, and you have to go through EVERYTHING manually, declare all the objects, initialize, register them, write the callback functions, and register them, process notification/message objects... it's a lot of stuff to write out. Most toolchains/libraries integrate a lot of that boilerplate for you, and many provide a default look and feel, which -- maybe you can take or leave it, but it puts your application into a certain style and feel and you can pick and choose your library in part based on that.
I've done a bit more in Java (which, gosh, that was quite some time ago, now..), which is a bit easier, and kinda maybe a bit more powerful, in that you have the layout managers and stuff handy, if you want to get something more flexible and nicer to use, active resizable etc. And much of the init and boilerplate is done for you, and the object-oriented nature of Java at least is a strong fit for object-oriented GUIs (which is most of them, AFAIK?). Of course, it's been decades since Java was "hot", and OOP is just one of many standard language features these days, so, this latter point is pretty unremarkable, buuuut, if you're talking doing it all in C, well, you need to write out all that OOP stuff yourself, and, keeping object-orientation in mind while writing in C can make that a bit easier to understand.
It's ever more complicated as time goes on, for example how desktop styling affects the title bar, frame, etc. (e.g. transparency in Aero (since Vista)), live resizing (I mean that's been around since what, "Plus!"?, but it's up to you how much you want to repaint when it is resized), desktop scaling, accessibility options, etc. You can use a minimal subset of these, even old (potentially deprecated) APIs, there's a thousand mostly-equivalent ways to do anything you want -- but knowing which ones are best supported/recommended, easiest, and, just which ones are important to provide whatever accessibility / compatibility / etc. features you want to have -- you can read a book or three just to get started on that. Or go a whole career working with it directly and still be finding new ways of using it. So, depending on what you want, usability, support, look and feel, and stuff like portability, you may want to choose a library or whatever to handle most of the grunt work.
And yeah, a lot of these tools are available right there in the IDE, using Visual Studio or what have you; it's the go-to environment for this. The main thing is looking up enough references/docs to make something useful.
Tim