
There’sa whole slew of issues when you begin approaching higher layers like GUI’s an none of the established frameworks handle this terribly well. You can provide basic “factory” functions and/or layer on top a more specialised framework.

On top of this abstracting gets you away from platform dependencies and quirks and there’s a lot of value in this as you develop a better knowledge of what is happening at a low level with respect to OS, compilers, and SDK’s. It is quite a bit of work to do it properly if you’re starting from scratch but it is a very very thin layer. A portability from step one approach allows you to produce native code for any current or future platform.
