Согласно вашему описанию, я думаю, вы можете говорить об этой ситуации.
BeginPath(dis.hDC);
// RoundRect(dis.hDC, dis.rcItem.left, dis.rcItem.top, dis.rcItem.right, dis.rcItem.bottom, 6, 6);
EndPath(dis.hDC);
![1](https://i.stack.imgur.com/ik7rF.png)
Позвольте мне сначала проанализировать причину, по которой я получил эту форму.
Когда вы перерисовываете кнопку, если длина и ширина перерисованной кнопки меньше, чем у самой кнопки, будет происходить только часть перерисовки.
case WM_CREATE:
{
//Button width:230 Button height:230
button = CreateRoundRectButton(hWnd, 500, 200, 230, 230, 30, 30, BTN_ID);
return 0;
}
break;
case WM_DRAWITEM:
{
DRAWITEMSTRUCT dis;
dis.CtlType = ODT_BUTTON;
dis.CtlID = BTN_ID;
dis.hDC = GetDC(button);
dis.rcItem.left = 0;
dis.rcItem.top = 0;
dis.rcItem.right = 200; //Width of redrawing
dis.rcItem.bottom = 200; //Height of redrawing
DrawRoundedButtonRectangle(dis, TRUE);
}
Чтобы увидеть эффект более четко, я увеличу ширину и высоту.
Если я опускаю код, который пишет схему, он выполняет только следующий код для реализации градиента.
// fill the DC with a vertical gradient
GradientFill(dis.hDC, vertices, _countof(vertices), r, _countof(r), GRADIENT_FILL_RECT_V);
Если я изменю координаты XY перерисовки.
![2](https://i.stack.imgur.com/HBg1a.png)
На самом деле, когда вы отключаете RoundRect
, единственное, что работает, это GradientFill
.
Обновлен:
Площадь перерисовки основана на rcItem
. Когда вы рисуете путь, учитывается только внутренняя область, а контур - нет, поэтому WidenPath
затем идет по контуру, и это дает истинную перенаправленную область rect
.