代码之家  ›  专栏  ›  技术社区  ›  Aardvark

如何确定Windows单选按钮的按钮部分的大小

  •  8
  • Aardvark  · 技术社区  · 16 年前

    DrawFrameControl(dc, &rectRadio, DFC_BUTTON, isChecked() ? DFCS_BUTTONRADIO | DFCS_CHECKED : DFCS_BUTTONRADIO);
    

    我从来没能找到一个确定的方法来找出什么是正确的。我一直在用一个12x12的矩形,但我喜欢Windows告诉我单选按钮的大小。

    DrawFrameControl似乎缩放了单选按钮以适合rect I pass,所以我必须接近收音机的“正确”尺寸,从屏幕上的其他(非所有者绘制)收音机中看出来。

    有人知道怎么做吗?

    2 回复  |  直到 16 年前
        1
  •  4
  •   Brannon    16 年前

    此页面显示了控件的一些大小调整指南。注意,大小以DLU(对话框单位)和像素表示,具体取决于是否将控件放置在对话框上:

    http://msdn.microsoft.com/en-us/library/aa511279.aspx#controlsizing

    我以为 GetSystemMetrics API可能会返回一些常用控件的标准大小,但我没有找到任何内容。可能有一个通用的特定于控件的API来确定大小。

        2
  •  2
  •   David L Morris    16 年前

    我已经有一段时间没有做这方面的工作了,所以我所描述的是我所做的,不一定是对这个问题的直接回答。

            case WM_MEASUREITEM:
                lpmis = (LPMEASUREITEMSTRUCT) lParam;
    
                lpmis->itemHeight = 13;
                lpmis->itemWidth = 13;
    
                break;
    
    
            case WM_DRAWITEM:
                lpdis = (LPDRAWITEMSTRUCT) lParam;
                hdcMem = CreateCompatibleDC(lpdis->hDC);  
    
    
    
                if (lpdis->itemState & ODS_CHECKED)  // if selected
                    {
                    SelectObject(hdcMem, hbmChecked);
                    }
                else
                    {
                    if (lpdis->itemState & ODS_GRAYED)
                        {
                        SelectObject(hdcMem, hbmDefault);
                        }
                    else
                        {
                        SelectObject(hdcMem, hbmUnChecked);
                        }
                    }
                StretchBlt(
                    lpdis->hDC,         // destination DC
                    lpdis->rcItem.left, // x upper left
                    lpdis->rcItem.top,  // y upper left
    
                    // The next two lines specify the width and
                    // height.
                    lpdis->rcItem.right - lpdis->rcItem.left,
                    lpdis->rcItem.bottom - lpdis->rcItem.top,
                    hdcMem,    // source device context
                    0, 0,      // x and y upper left
                    13,        // source bitmap width
                    13,        // source bitmap height
                    SRCCOPY);  // raster operation
    
                DeleteDC(hdcMem);
                return TRUE;
    

    这似乎对Win2000和XP都很有效,尽管我不知道Vista会做什么。

    也许值得做一个实验,看看省略WM_MEASUREITEM会做什么,尽管我通常会发现,我通常有很好的理由去做一些看起来多余的事情。