Winapi 为什么我的一些控件在资源文件的对话框模板中的位置稍有偏离,特别是在Y方向?

Winapi 为什么我的一些控件在资源文件的对话框模板中的位置稍有偏离,特别是在Y方向?,winapi,Winapi,我正在构建自己的颜色选择对话框,我已经完成了对话框模板中所有控件的布局。然而,我注意到一件奇怪的事情: 请注意,H和s编辑控件以及R和G编辑控件之间的垂直空间比任何其他两个编辑控件之间的垂直空间都多 我的资源文件中的H、S和V编辑是 EDITTEXT rcH, 238, 78, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE EDITTEXT rcS, 238, 92,

我正在构建自己的颜色选择对话框,我已经完成了对话框模板中所有控件的布局。然而,我注意到一件奇怪的事情:

请注意,H和s编辑控件以及R和G编辑控件之间的垂直空间比任何其他两个编辑控件之间的垂直空间都多

我的资源文件中的H、S和V编辑是

    EDITTEXT        rcH, 238, 78, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    EDITTEXT        rcS, 238, 92, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    EDITTEXT        rcV, 238, 106, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
所以我想他们会紧紧拥抱。为什么不呢?对话框单位转换是否存在舍入问题?我尝试了不同的字体大小,但没有注意到有变化

事实上,为什么所有编辑字段的边都会稍微重叠?我假设相邻的两个编辑控件不会重叠;如果我将字体从Segoe 9更改为Segoe 8,由于重叠,文本字段在它们之间切换时实际上会闪烁

这是在Windows7x64上,这是我的最低要求。这个对话框很可能会使用
DialogBoxParam()
函数运行,但我怀疑我使用的函数会是问题所在。。。?现在我只是在使用
DialogBox()

谢谢

#define rcColorDialog 102

#define rcFontSamplePlacement 1003

#define rcColorSVChooser 1100
#define rcColorHSlider 1101
#define rcPreview 1102
#define rcOpacitySlider 1103
#define rcH 1104
#define rcS 1105
#define rcV 1106
#define rcRDouble 1107
#define rcRInt 1108
#define rcGDouble 1109
#define rcGInt 1110
#define rcBDouble 1111
#define rcBInt 1112
#define rcADouble 1113
#define rcAInt 1114
#define rcHex 1115
#define rcHLabel 1116
#define rcSLabel 1117
#define rcVLabel 1118
#define rcRLabel 1119
#define rcGLabel 1120
#define rcBLabel 1121
#define rcALabel 1122
#define rcHexLabel 1123

rcColorDialog DIALOGEX 13, 54, 344, 209
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_3DLOOK
CAPTION "Color"
FONT 9, "Segoe UI"
BEGIN
    // this size should be big enough to get at least 256x256 on font sizes >= 8 pt
    CTEXT       "AaBbYyZz", rcColorSVChooser, 7, 7, 195, 195, SS_NOPREFIX | SS_BLACKRECT

    // width is the suggested slider height since this is vertical
    CTEXT       "AaBbYyZz", rcColorHSlider, 206, 7, 15, 195, SS_NOPREFIX | SS_BLACKRECT

    LTEXT       "Preview:", -1, 230, 7, 107, 9, SS_NOPREFIX
    CTEXT       "AaBbYyZz", rcPreview, 230, 16, 107, 20, SS_NOPREFIX | SS_BLACKRECT

    LTEXT       "Opacity:", -1, 230, 45, 107, 9, SS_NOPREFIX
    CTEXT       "AaBbYyZz", rcOpacitySlider, 230, 54, 107, 15, SS_NOPREFIX | SS_BLACKRECT

    LTEXT       "&H:", rcHLabel, 230, 81, 8, 8
    EDITTEXT        rcH, 238, 78, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    LTEXT       "&S:", rcSLabel, 230, 95, 8, 8
    EDITTEXT        rcS, 238, 92, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    LTEXT       "&V:", rcVLabel, 230, 109, 8, 8
    EDITTEXT        rcV, 238, 106, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE

    LTEXT       "&R:", rcRLabel, 277, 81, 8, 8
    EDITTEXT        rcRDouble, 285, 78, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    EDITTEXT        rcRInt, 315, 78, 20, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    LTEXT       "&G:", rcGLabel, 277, 95, 8, 8
    EDITTEXT        rcGDouble, 285, 92, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    EDITTEXT        rcGInt, 315, 92, 20, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    LTEXT       "&B:", rcBLabel, 277, 109, 8, 8
    EDITTEXT        rcBDouble, 285, 106, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    EDITTEXT        rcBInt, 315, 106, 20, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    LTEXT       "&A:", rcALabel, 277, 123, 8, 8
    EDITTEXT        rcADouble, 285, 120, 30, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE
    EDITTEXT        rcAInt, 315, 120, 20, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE

    LTEXT       "He&x:", rcHexLabel, 269, 146, 16, 8
    EDITTEXT        rcHex, 285, 143, 50, 14, ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP, WS_EX_CLIENTEDGE

    DEFPUSHBUTTON   "OK", IDOK, 243, 188, 45, 14, WS_GROUP
    PUSHBUTTON      "Cancel", IDCANCEL, 292, 188, 45, 14, WS_GROUP
END

对话框管理器将对话框单位转换为像素位置的方式会导致舍入错误。这是对话框的一个常见问题-唯一的解决方案是在创建控件后手动调整控件之间位置的代码。没错,这正是我担心的,尽管尝试不同的字体大小似乎并没有给我一个神奇的方法,让事情顺利进行(我希望这恰好证实了这一点,所以我想我骗了自己,把目光从正确的答案上移开了)。谢谢。您是否尝试过将HSV编辑控件组向上移动1个DLU,直到S和V控件之间有额外的垂直空间?这将验证效果确实是由于舍入。不,我没有想到!确实发生了(在72,86100处)。我会记住这个建议,以备将来出现与对话框模板相关的问题;谢谢!为此,我将手动定位控件(我已经需要通过减去font
TEXTMETRIC.tmInternalLeading
来修复标签,以使其基线与编辑控件的基线相匹配)。对话框管理器将对话框单位转换为像素位置的方式会导致舍入错误。这是对话框的一个常见问题-唯一的解决方案是在创建控件后手动调整控件之间位置的代码。没错,这正是我担心的,尽管尝试不同的字体大小似乎不起作用给我一个神奇的东西,让事情运转起来(我希望这能证实这一点,所以我想我骗了自己,把目光从正确的答案上移开了)。谢谢。您是否尝试过将HSV编辑控件组向上移动1个DLU,直到S和V控件之间有额外的垂直空间?这将验证效果确实是由于舍入。不,我没有想到!确实发生了(在72,86100处)。我会记住这个建议,以备将来出现与对话框模板相关的问题;谢谢!为此,我将手动定位控件(我已经需要通过减去font
TEXTMETRIC.tmInternalLeading
来修复标签,以使其基线与编辑控件的基线相匹配)。