You are really doing things you shouldn't be doing.
If you want a 720p front buffer on a 768p monitor, then you're not in fullscreen in the first place. In that case yes, cover the area you want with a window is a reasonable option, but then most certainly disable DXGI fullscreen. And again, the swap-chain is not and should not be in fullscreen then.
One simple option in that case is to simply set the view-port to a 720p area on a normal 768p fullscreen back-buffer, to avoid the problem.
You seem to be doing some pretty weird things that makes matters much more complicated than they need to be.
I'm not doing anything super complicated, just what I consider the bare minimum rules for a well behaved application:
1. It should handle windowed applications with a sizable border, a non- sizable border or no border while respecting windows conventions (non-sizable border should not have maximize box, etc.). In windowed mode any buffer size should be supported.
2. It should handle fullscreen mode. In fullscreen mode only one of the display modes of the adapter can be used.
3. It should handle transition form windowed to fullscreen in a consistent manner, i.e. restoring window border and position. If it can't it will do its best to maintain a stable application but give a beep.
4. All parameters must be changeable at run time as long as they don't contradict other rules.
5. Stretching is never an option. The back-buffer must always have the same size as the front buffer. Centered smaller viewport than the resolution is forbidden.
These are all a bit challenging with DXGI but not impossible. There are just a ton of special cases. Like how the back buffer in windowed mode can't have odd dimensions. Making in even in a simplistic manner is easy. Yet a more complicated method is used because there is no guarantee what theme the user has. He may even have something like Windows blinds installed. I found this to be a good general code to handle odd sizes:
case WM_SIZING: {
RECT w, c;
GetWindowRect(hWnd, &w);
GetClientRect(hWnd, &c);
RECT* r = (RECT*)lParam;
int bx = abs((w.right - w.left) - (c.right - c.left));
int by = abs((w.bottom - w.top) - (c.bottom - c.top));
if ((r->right - r ->left - bx) % 2)
r->right--;
if ((r->bottom - r->top - by)% 2)
r->bottom--;
return TRUE;
}
Anyway, this only has to be done once. Unfortunately, the solutions form DirectX 9 do not work with DXGI, so new solutions must be found. I did solve 95% of them. Sometimes when in windowed mode on a random resolution DXGI switches to fullscreen mode that makes no sense. I might fix that too, but it is not a priority task.
I am far more concerned with the rest. I wrote my SpriteBatch class which finally works. Doesn't do that much batching though, but at least I can do 2D stuff like GUI. The good part is that I will port it to DirectX 9 too and no longer use the one that is supplied thus making my GUI code more portable and able to run on all 3 versions.
Now to write the Font whatever class...