【发布时间】:2021-11-05 13:13:33
【问题描述】:
据我所知,SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)CustomDraw(lParam)) 其中CustomDraw 是我的自定义绘制过程,设置NM_CUSTOMDRAW 的返回值,然后返回true:
SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)CustomDraw(lParam));
return TRUE;
它怎么可能设置返回值并且这个值是指向CustomDraw()的指针,然后它返回true所以它返回2个值?
DialogBox() 究竟在哪里返回值?是进一步处理这些值,还是直接跳过它们?
如果它设置CustomDraw(LPARAM lParam))被多次调用的返回值怎么可能?我的意思是,SetWindowLong(hWnd, DWL_MSGRESULT(LONG)CustomDraw(lParam)); 是如何让它调用这么多次的,它需要如何获得适当的消息?
return SetWindowLong(...) 和返回自定义绘图的指针有什么区别?
case NM_CUSTOMDRAW:
{
LONG_PTR p = 0;
p = SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)CustomDraw(lParam));
return TRUE; // why return (LONG)CustomDraw(lParam)) wont work if setwindowlong "set return value " of message so of NM_CUSTOMDRAW
}
LRESULT __stdcall CustomDraw (LPARAM lParam)
{
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT : //Before the paint cycle begins
return CDRF_NOTIFYITEMDRAW;
case CDDS_ITEMPREPAINT: //Before an item is drawn
{
return CDRF_NOTIFYSUBITEMDRAW;
}
break;
case CDDS_SUBITEM | CDDS_ITEMPREPAINT: //Before a subitem is drawn
{
switch(lplvcd->iSubItem)
{
case 0:
{
lplvcd->clrText = RGB(255,255,255);
lplvcd->clrTextBk = RGB(240,55,23);
return CDRF_NEWFONT;
}
break;
case 1:
{
lplvcd->clrText = RGB(255,255,0);
lplvcd->clrTextBk = RGB(0,0,0);
return CDRF_NEWFONT;
}
break;
case 2:
{
lplvcd->clrText = RGB(20,26,158);
lplvcd->clrTextBk = RGB(200,200,10);
return CDRF_NEWFONT;
}
break;
case 3:
{
lplvcd->clrText = RGB(12,15,46);
lplvcd->clrTextBk = RGB(200,200,200);
return CDRF_NEWFONT;
}
break;
case 4:
{
lplvcd->clrText = RGB(120,0,128);
lplvcd->clrTextBk = RGB(20,200,200);
return CDRF_NEWFONT;
}
break;
case 5:
{
lplvcd->clrText = RGB(255,255,255);
lplvcd->clrTextBk = RGB(0,0,150);
return CDRF_NEWFONT;
}
break;
}
}
}
return CDRF_DODEFAULT;
}
【问题讨论】:
-
始终使用
SetWindowLongPtr和DWLP_MSGRESULT -
@IInspectable 这篇文章不回答每个问题
-
它不是作为答案发布的,所以,是的,预计它不是一个完整的答案。