隨鈊乄鎍慾 发表于 2014-10-15 17:26:10

在小甲鱼老师源代码中这个应怎样理解?

如题:第010讲:不要试图猜测文本的尺寸 | 课后测试题及答案 中:请问用红色字部分应该怎么理解?

[*]#define N 10
[*]……
[*]LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
[*]{
[*]      HDC hdc;
[*]      PAINTSTRUCT ps;
[*]      TCHAR szBuffer;
[*]      int i, j;
[*]      size_t iTarget;
[*]      TEXTMETRIC tm;
[*]      RECT rect;
[*]      static int cxChar, cyChar;
[*]
[*]      switch (message)
[*]      {
[*]      case WM_CREATE:
[*]                hdc = GetDC(hwnd);
[*]                GetTextMetrics(hdc, &tm);
[*]                cxChar = tm.tmAveCharWidth;
[*]                cyChar = tm.tmHeight + tm.tmExternalLeading;
[*]                ReleaseDC(hwnd, hdc);
[*]                return 0;
[*]
[*]      case WM_PAINT:
[*]                hdc = BeginPaint(hwnd, &ps);
[*]                for (i = 1; i <= N; i++)
[*]                {
[*]                        StringCchPrintf(szBuffer, 128, TEXT(""));
[*]                        for (j = 0; j < 2 * i - 1; j++)
[*]                        {
[*]                              StringCchCat(szBuffer, 128, TEXT("x"));
[*]                        }
[*]                        StringCchLength(szBuffer, 128, &iTarget);
[*]                        GetClientRect(hwnd, &rect);
[*]                        SetTextAlign(hdc, GetTextAlign(hdc) | TA_CENTER);
[*]                        TextOut(hdc, (rect.right - rect.left) / 2, (rect.bottom - rect.top) / 2 - (N/2 - i +1) * cyChar, szBuffer, iTarget);//红色字体这段不知道该如何理解,麻烦知道的请讲解一下。
[*]                }
[*]                EndPaint(hwnd, &ps);
[*]                return 0;
[*]
[*]      case WM_DESTROY:
[*]                PostQuitMessage(0);
[*]                return 0;
[*]      }
[*]
[*]      return DefWindowProc(hwnd, message, wParam, lParam);
[*]}

小甲鱼 发表于 2014-10-15 17:26:11

因为单独“(rect.bottom - rect.top) / 2”并不能让字符显示在垂直居中的位置,后边的代码是为了做到垂直居中而做的妥协:再减去半个字符的高度...

流行语 发表于 2014-10-16 01:07:24

我没有看过小甲鱼的windows,不过这块应该是求文本输出时的y坐标了吧。

隨鈊乄鎍慾 发表于 2014-10-16 15:58:41

流行语 发表于 2014-10-16 01:07
我没有看过小甲鱼的windows,不过这块应该是求文本输出时的y坐标了吧。

的确是Y坐标,但你回答得太抽像了。

隨鈊乄鎍慾 发表于 2014-10-16 18:38:24

小甲鱼 发表于 2014-10-16 17:21
因为单独“(rect.bottom - rect.top) / 2”并不能让字符显示在垂直居中的位置,后边的代码是为了做到垂直居 ...

说得是呢!我调试了几次程序。已经理解了,只是在Windows中调试程序不能像控制台程序一样一步一步的来。理解起来就要困难一些。不过总算还是理解了!再次感谢鱼哥的解答!

流行语 发表于 2014-10-16 18:53:13

小甲鱼大神出现了。

大个的糖果 发表于 2014-10-30 14:51:46

souco 发表于 2015-2-2 04:32:52

好像好厉害的样子~

我笑点很低的 发表于 2015-2-5 11:35:14

!@R键! 发表于 2015-2-8 11:46:18

。。。。

智商是硬伤 发表于 2015-9-8 15:36:20

{:7_146:}

y290176346 发表于 2015-9-23 21:33:04

我是来领鱼币的
页: [1]
查看完整版本: 在小甲鱼老师源代码中这个应怎样理解?