Question: The code page on my Windows is set to ANSI (Latin1, Windows-1252).  

I create a font with CreateFont and pass RUSSIAN\_CHARSET in fdwCharSet

This is what I experience:

* Windows controls (like a Static for example) using this font ignore the font's character set: the string passed to SetWindowTextA is displayed with Latin characters
* After selecting this font on the DC, GDI text functions (Ext)TextOutA and DrawTextA use the character set of the font. Strings passed to them are displayed with cyrillic letters.

Why? When is the charset parameter of the font taken into account and when is it ignored? Can I force windows controls to use the font's character set?

Answer: 
You will have to convert the text to Unicode and call `SetWindowTextW()` instead of `SetWindowTextA()`.

Make sure the window's class is registered with `RegisterClassW()` and not `RegisterClassA()`. This is what really determines if a window is Unicode. You can use `IsWindowUnicode()` to verify that the window is really Unicode.

Make sure you pass unhandled messages to `DefWindowProcW()` and not `DefWindowProcA()`.

Or, if the window is a dialog, just make sure it is created with `CreateDialogW()` or `DialogBoxParamW()`.
>Can I force windows controls to use the font's character set?

AFAIK no, you can't.

SetWindowTextA just converts the argument to Unicode, then calls SetWindowTextW: both windows kernel, shell, and GDI are unicode.

To convert the argument to Unicode, SetWindowTextA uses the setting from Window's regional options ("Language for non-Unicode programs").