我正在使用DrawFrameControl绘制旧学校(未经训练 - 主题无线电是另外一个问题)单选按钮:
DrawFrameControl(dc, &rectRadio, DFC_BUTTON, isChecked() ? DFCS_BUTTONRADIO | DFCS_CHECKED : DFCS_BUTTONRADIO);
我从来没有能够找到一个确定的方法来弄清楚RECT要传递什么。我一直在使用一个12x12的矩形但我喜欢Windows告诉我单选按钮的大小。
DrawFrameControl似乎缩放单选按钮以适合我传递的矩形,所以我必须接近从屏幕上其他(非所有者绘制的)无线电看到的无线电的“右”尺寸。
任何人都知道如何做到这一点?
答案 0 :(得分:4)
此页面显示控件的一些大小调整指南。请注意,大小以DLU(对话框单位)和像素给出,具体取决于您是否将控件放在对话框上:
http://msdn.microsoft.com/en-us/library/aa511279.aspx#controlsizing
我认为GetSystemMetrics
API可能会返回某些常用控件的标准大小,但我没有找到任何内容。可能存在用于确定大小调整的通用控件特定API。
答案 1 :(得分:2)
自从我为此工作已经有一段时间了,所以我所描述的就是我所做的,而不一定是对这个问题的直接回答。
我碰巧使用13 x 13而不是12 x 12的位图。复选框的位图部分似乎在WM_DRAWITEM中传递。但是,我也设置了WM_MEASUREITEM并给它提供了相同的值,所以我的回答很可能是在正确的哲学意义上“乞求问题”。
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都有效,不过我对nbo有什么想法可以做。
可能值得一个实验来看看遗漏了WM_MEASUREITEM的内容,尽管我通常会发现旧的代码,我通常有充分的理由去做一些看似多余的事情。