Hey there,
So I am working on a custom owner-drawn button in the Win32 runtime. I have a RenderTo() function that I created which renders the button the way I want it to appear.
The RenderTo function has this signature:
void RenderTo(LPSURFACE ps, mv _far* mV, RECT FAR* rc, HFONT hFont, COLORREF dwBackColor,
COLORREF dwTextColor, TCHAR *sFilename, DWORD dwAlignFlags, TCHAR* wText);
It works correctly in the Edittime.cpp when called like so:
void WINAPI DLLExport EditorDisplay(mv _far *mV, fpObjInfo oiPtr, fpLevObj loPtr, LPEDATA edPtr, RECT FAR *rc)
{
#ifndef RUN_ONLY
LPSURFACE ps = WinGetSurface((int)mV->mvIdEditWin);
HFONT hFnt = CreateFontIndirect(&edPtr->textFont);
COLORREF dwBackColor = edPtr->backColor;
COLORREF dwTextColor = edPtr->textColor;
TCHAR* sFilename = edPtr->sFilename;
RenderTo(ps, mV, rc, hFnt, dwBackColor, dwTextColor, sFilename, edPtr->dwAlignFlags, edPtr->sText);
// Delete font
if (hFnt != NULL)
DeleteObject(hFnt);
#endif // !defined(RUN_ONLY)
}
Display More
So I am trying to call the same drawing function from the Runtime.cpp file but can't figure out why it isn't working correctly and can't really find much in the way of documentation for this.
Here's one attempt, using the owner drawn Win32 message (in WindowProc):
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
if (NULL != pDIS) {
// Get a pointer to the RUNDATA structure (see GetRdptr function above for more info)
rdPtr = GetRdPtr(pDIS->hwndItem, rhPtr);
LPRH rhPtr = rdPtr->rHo.hoAdRunHeader;
LPSURFACE ps = WinGetSurface((int)rhPtr->rhIdEditWin);
TCHAR* sFilename = rdPtr->sFilename;
WCHAR wText[99];
int len = SendMessage(rdPtr->hWnd, WM_GETTEXT, ARRAYSIZE(wText), (LPARAM)wText);
rdPtr->rHo.hoRect.left = 0;
RECT rc;
rc.left = rdPtr->rHo.hoX;
rc.top = rdPtr->rHo.hoY;
rc.right = rc.left + rdPtr->rHo.hoImgWidth;
rc.bottom = rc.top + rdPtr->rHo.hoImgHeight;
RenderTo(ps, rhPtr->rh4.rh4Mv, &rc, rdPtr->hFont, rdPtr->backColor, rdPtr->textColor, rdPtr->sFilename, rdPtr->dwAlignFlags, wText);
WinAddZone(rhPtr->rhIdEditWin, &rc);
}
}
Display More
The code is being called but all I get is a blank white rectangle where the control should be (but this does not seem to come from any of my drawing code).
I also tried to call RenderTo() from DisplayRunObject:
short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr)
{
// Begin render process...
LPRH rhPtr = rdPtr->rHo.hoAdRunHeader;
LPSURFACE ps = WinGetSurface((int)rhPtr->rhIdEditWin);
TCHAR* sFilename = rdPtr->sFilename;
WCHAR wText[99];
int len = SendMessage(rdPtr->hWnd, WM_GETTEXT, ARRAYSIZE(wText), (LPARAM)wText);
rdPtr->rHo.hoRect.left = 0;
RECT rc;
rc.left = rdPtr->rHo.hoX;
rc.top = rdPtr->rHo.hoY;
rc.right = rc.left + rdPtr->rHo.hoImgWidth;
rc.bottom = rc.top + rdPtr->rHo.hoImgHeight;
RenderTo(ps, rhPtr->rh4.rh4Mv, &rc, rdPtr->hFont, rdPtr->backColor, rdPtr->textColor, rdPtr->sFilename, rdPtr->dwAlignFlags, wText);
WinAddZone(rhPtr->rhIdEditWin, &rc);
return 0;
}
Display More
(I return REFLAG_DISPLAY from HandleRunObject() so this is getting called). But again, nothing actually shows up.
Any ideas how I can get this to work?