Maybe... I'll post my draw routine so you can take a look at it
Code:
LRESULT DasmViewer_OnPaint(DASMVIEWERINFO * dvp, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
HDC hdcTemp;
HBITMAP hbmNew;
HBITMAP hbmOld;
PAINTSTRUCT ps;
HANDLE hOldFont;
RECT rect;
RECT titleBarRect;
RECT selectedRect;
UINT offsetMod = 0;
char * string;
int iRow;
int iCol;
int i;
//Get a device context for this window
if(wParam)
hdc = (HDC)wParam;
else
hdc = BeginPaint(dvp->hWnd, &ps);
//Work out where to draw
GetClientRect(dvp->hWnd, &rect);
//Set up to draw to a temporary bitmap
hdcTemp = CreateCompatibleDC(hdc);
hbmNew = CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top);
hbmOld = SelectObject(hdcTemp, hbmNew);
//Set the font
hOldFont = SelectObject(hdcTemp, dvp->hFont);
//Paint the background black
FillRect(hdcTemp, &rect, CreateSolidBrush(dvp->bgColor));
SetTextColor(hdcTemp, dvp->fgColor);
SetBkMode(hdcTemp, TRANSPARENT);
for(iCol = 0; iCol < dvp->collumns; iCol++)
{
DrawString(hdcTemp, rect, dvp->colTitles[iCol], dvp->colPstns[iCol], dvp->rowTopPad, NULL, -1);
}
dvp->tempOffset = dvp->offset;
if(dvp->tempFileInfo.hFile)
{
dvp->rowOffset[0] = dvp->offset;
//Calculate the offset for each row
for(iRow = 1; iRow <= dvp->rows; iRow++) //Also Calculates one row ahead in order to set rowCurrentBytes
dvp->rowOffset[iRow] = dvp->rowOffset[iRow - 1] + dvp->fixedOpcodeBytes;
for(iRow = 0; iRow < dvp->rows && (dvp->tempOffset < dvp->tempFileInfo.fileSizeLow || (!dvp->tempFileInfo.fileSizeLow && !iRow)); iRow++)
{
dvp->rowCurrentBytes = dvp->rowOffset[iRow + 1] - dvp->rowOffset[iRow];
for(iCol = 0; iCol < dvp->collumns; iCol++)
{
if(dvp->colPstns[iCol] > -1)
{
string = dvp->colTextFuncs[iCol](dvp);
//Update charWidthArrays and charWidthArraysTotals as neccessary
if(dvp->colLongestLength[iCol] < (dvp->colCurrentLength[iCol] = (int) strlen(string)))
{
for(i = dvp->colLongestLength[iCol]; i < dvp->colCurrentLength[iCol]; i++)
dvp->charWidthArrays[iCol][i] = dvp->charWidth;
if(dvp->colDrawGroups[iCol])
{
for(i = dvp->colLongestLength[iCol] + (dvp->colLongestLength[iCol] % dvp->colDrawGroups[iCol]) + (dvp->colDrawGroups[iCol] - 1); i <= dvp->colCurrentLength[iCol]; i += dvp->colDrawGroups[iCol])
dvp->charWidthArrays[iCol][i] +=dvp->colGroupSpace[iCol];
}
if(dvp->colLongestLength[iCol] == 0)
dvp->charWidthTotals[iCol][0] = dvp->charWidthArrays[iCol][0];
for(i = dvp->colLongestLength[iCol] + !dvp->colLongestLength[iCol]; i < dvp->colCurrentLength[iCol]; i++)
dvp->charWidthTotals[iCol][i] = dvp->charWidthArrays[iCol][i] + dvp->charWidthTotals[iCol][i - 1];
dvp->colLongestLength[iCol] = dvp->colCurrentLength[iCol];
}
//Paint the highlighting
if(iCol == dvp->colEditable)
if(dvp->selectedAreaBeginIndex > dvp->tempOffset * dvp->colCharsPerByte[iCol] && dvp->selectedAreaEndIndex <= (dvp->tempOffset * dvp->colCharsPerByte[iCol]) + dvp->colCurrentLength[iCol])
{
selectedRect.top = dvp->rowHeightTotals[iRow] + dvp->rowTopPad + 1;
selectedRect.bottom = dvp->rowHeightTotals[iRow] + dvp->rowHeight + dvp->rowTopPad;
selectedRect.left = dvp->colPstns[iCol];
selectedRect.right = dvp->colPstns[iCol] + dvp->charWidthTotals[iCol][dvp->colCurrentLength[iCol] - 1] - dvp->colGroupSpace[iCol] * !(dvp->colCurrentLength[iCol] % dvp->colDrawGroups[iCol]) + 3;
if(dvp->selectedAreaBeginIndex - 1 > dvp->rowOffset[iRow] * dvp->colCharsPerByte[iCol])
selectedRect.left += dvp->charWidthTotals[iCol][dvp->selectedAreaBeginIndex - dvp->rowOffset[iRow] * dvp->colCharsPerByte[iCol] - 2];
if(dvp->selectedAreaEndIndex < dvp->rowOffset[iRow + 1] * dvp->colCharsPerByte[iCol])
selectedRect.right -= dvp->charWidthTotals[iCol][dvp->rowOffset[iRow + 1] * dvp->colCharsPerByte[iCol] - dvp->selectedAreaEndIndex - 1];
FillRect(hdcTemp, &selectedRect, CreateSolidBrush(dvp->slBgColor));
}
//Draw the text
DrawString(hdcTemp, rect, string, dvp->colPstns[iCol], (dvp->rowHeight * (iRow + 1)) + dvp->rowTopPad + (dvp->barWidth * 2), dvp->charWidthArrays[iCol], -1);
free((void *) string);
}
}
dvp->tempOffset += dvp->rowCurrentBytes;
}
}
SetBkColor(hdcTemp, dvp->bgColor);
//Paint a bar under the title row
titleBarRect = rect;
titleBarRect.top = dvp->rowHeight + dvp->rowTopPad;
titleBarRect.bottom = dvp->rowHeight + dvp->rowTopPad + dvp->barWidth;
FillRect(hdcTemp, &titleBarRect, CreateSolidBrush(dvp->fgColor));
//Update the control's display
BitBlt(hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hdcTemp, 0, 0, SRCCOPY);
//Release paint objects
SelectObject(hdcTemp, hbmOld);
DeleteObject(hbmNew);
DeleteDC(hdcTemp);
DeleteDC(hdc);
EndPaint(dvp->hWnd, &ps);
return FALSE;
}