There are several schools of thought here. Say C.h depends on B.h and A.h. D.h depends on A.h.
One school of thought - no header file should include any other header file. This is just rubbish for maintenance but I know lots of developers (who normally don't want to maintain 'old' code) who will argue that it is easier to understand.
Another school of thought is that you should include all dependent header files first. This is the normal cause of broken builds.
For both those systems, the following would work
source C.c
#include "A.h"
#include "B.h"
#include "C.h"
source D.c
#include "A.h"
#include "D.h"
If we now change dependencies such that A.h depends on B.h, the changes are
source C.c
#include "B.h"
#include "A.h"
#include "C.h"
source D.c
#include "B.h"
#include "A.h"
#include "D.h"
All the source files have to be changed. If you forget about a file E.c which depends on "D.h", you have a broken build. These may be recommended methods but they are difficult to maintain. You will find that those who recommend these methods don't normally hang around after the project is finished. Someone else has to maintain their mess.
Another school of thought, which happens to be my preferred one, is to include all the files required by a header in a header.
source C.c
#include "C.h"
source D.c
#include "D.h"
source C.h
#include "A.h"
#include "B.h"
source D.h
#include "A.h"
If the dependencies change, we ony have to modify A.h
source A.h
#include "B.h"
Nothing else needs to change. If E.c depends on D.h, it won't break the build. Putting C.h as the first include file ensures that C.h is no dependent on anything else that it hasn't already included. In pghsteelers example, Sketcher.h would be included inside PenDialog.h: not after it. Recommended methods are like recipes. They are just a guideline: not a hard and fast rule. They don't work for everyone in every situation.
In very large projects, it is a lot easier to include header files in any order. It is easy to maintain specific orders on small projects but such practices are near impossible to enforce/police on large projects with tens of developers. When you have to do code walkthroughs/reviews of 50K+ lines, and a project manager breathing down your neck, having include files in a specific order won't be at the top of your list.
Think about it: does it make any difference whether you have
#include <fstream>
#include <iostream>
or
#include <iostream>
#include <fstream>
Why? because the relevant files have already been included in iostream and fstream.
#pragma once is a Microsoft special: all pragmas are vendor specific. It will work as long as you are in a specific MS environment. Once you get outside that environment, you'll get problems. Even going from one MS compiler to another, pragmas can get added or withdrawn. I find that it is safer to use #ifndef ... #define ... #endif than to rely on #pragma once. #pragma once did not exist on MSC 5.0 (circa 1988: not VS5.0) so if I tried compiling code on that compiler, it would probably moan a lot and might even fall over.