2011-05-15 12 views
1

我正在创建一个小型的win32应用程序。目前我有6个文本标签的资源文件编码,就像这样:win32控件:resource.rc和CreateWindow中的不同坐标?

IDD_MAIN DIALOGEX 0, 0, 465, 279 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "SpiderPigOverseer" 
FONT 8, "MS Shell Dlg", 400, 0, 0x1 
BEGIN 
    CONTROL   "sample text",IDC_STATIC1,"Static",SS_SIMPLE | WS_GROUP,344,70,33,8 
    [...] 
END 

但我想访问这些在for循环中,所以我想我会动态地创建他们与此代码(?):

IRValues[i] = CreateWindow("static", "sample text", SS_SIMPLE | WS_VISIBLE | WS_CHILD, 344, 70+10*i, 33, 8, hDlg, NULL, NULL, NULL); 

但是,这会使文字更大。 x和y的位置比用资源文件创建的要少得多,宽度和高度也不相同。为什么是这样?

编辑:我试过使用下面的代码来转换,但无法让它完全匹配。

HDC hdc = GetDC(hWnd); 
TEXTMETRIC tm; 
GetTextMetrics(hdc, &tm); 
cxAveChar = tm.tmAveCharWidth; 
cyAveChar = tm.tmHeight + tm.tmExternalLeading; 
ReleaseDC(hWnd, hdc); 
+2

你不需要创建它们,使用'GetDlgItem'。 – 2011-05-15 16:11:08

+0

@purecuteness说什么:你不需要自己创建窗口,只要你可以在for循环中使用它们。你可以给它们所有的ID并使用GetDlgItem,或者甚至用GW_CHILD/GW_HWNDNEXT的GetWindow()来循环它们。 – BrendanMcK 2011-05-16 00:35:46

回答

6

坐标,其中不等于像素表示为对话框单位 .RC文件。它用于根据系统字体大小自动调整控制大小。 您可以对话框单位转换为像素如下:

pixelX = MulDiv(templateunitX, LOWORD(GetDialogBaseUnits()), 4); 
pixelY = MulDiv(templateunitY, HIWORD(GetDialogBaseUnits()), 8); 

或者干脆用MapDialogRect()

+0

如何制作默认字体大小的文字?我在资源文件中创建了一些不需要动态创建的标签。我应该通过试验和错误来改变动态的xy-coors吗? – Moberg 2011-05-15 15:50:56

+1

我不明白你想要什么=)如果你想访问你在.rc中创建的标签,你应该使用'GetDlgItem(hDlg,IDC_STATIC1)'。如果你想创建标签,你应该使用'CreateWindow',如果你还想让它们使用默认字体,你应该'SendMessage(hLabel,WM_SETFONT,GetStockObject(DEFAULT_GUI_FONT),0)' – 2011-05-15 15:57:17