Various fixes in DC's, ownerdrawn menu items, etc...

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10370 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2001-05-29 03:46:50 +00:00
parent 5c737c4c37
commit ad7f3189f3
4 changed files with 209 additions and 20 deletions

View File

@@ -821,8 +821,8 @@ void wxDC::DoDrawRectangle(
); );
vPoint[0].x = vX + 1; vPoint[0].x = vX + 1;
vPoint[0].y = vY + 1; vPoint[0].y = vY + 1;
vPoint[1].x = vX + vWidth - 2; vPoint[1].x = vX + vWidth - 1;
vPoint[1].y = vY + vHeight - 2; vPoint[1].y = vY + vHeight - 1;
::GpiMove(m_hPS, &vPoint[0]); ::GpiMove(m_hPS, &vPoint[0]);
::GpiBox( m_hPS ::GpiBox( m_hPS
,lControl ,lControl

View File

@@ -111,6 +111,8 @@ bool wxOwnerDrawn::OnDrawItem(
COLORREF vRef; COLORREF vRef;
RECTL vRect = {rRect.x + 4, rRect.y + 1, rRect.x + (rRect.width - 2), rRect.y + rRect.height}; RECTL vRect = {rRect.x + 4, rRect.y + 1, rRect.x + (rRect.width - 2), rRect.y + rRect.height};
memset(&vCbnd, 0, sizeof(CHARBUNDLE));
// //
// Use default font if no font set // Use default font if no font set
// //
@@ -176,9 +178,21 @@ bool wxOwnerDrawn::OnDrawItem(
,GetBValue(vRef) ,GetBValue(vRef)
); );
} }
rDC.SetTextBackground(vColBack); rDC.SetTextBackground(vColBack);
rDC.SetTextForeground(vColText); rDC.SetTextForeground(vColText);
rDC.SetBackgroundMode(wxTRANSPARENT); rDC.SetBackgroundMode(wxTRANSPARENT);
vCbnd.lColor = vColText.GetPixel();
vCbnd.lBackColor = vColBack.GetPixel();
::GpiSetAttrs( hPS
,PRIM_CHAR
,CBB_BACK_COLOR | CBB_COLOR
,0
,&vCbnd
);
::GpiSetBackMix( hPS
,BM_LEAVEALONE
);
// //
// Paint the background // Paint the background
@@ -248,19 +262,23 @@ bool wxOwnerDrawn::OnDrawItem(
// //
// Draw the main item text sans the accel text // Draw the main item text sans the accel text
rDC.DrawText( sFullString //
,nX POINTL vPntStart = {nX, rRect.y + 4};
,rRect.y + 4 ::GpiCharStringAt( rDC.GetHPS()
); ,&vPntStart
,sFullString.length()
,(PCH)sFullString.c_str()
);
if (bFoundMneumonic) if (bFoundMneumonic)
{ {
// //
// Underline the mneumonic -- still won't work, but at least it "looks" right // Underline the mneumonic -- still won't work, but at least it "looks" right
// //
wxPen vPen; wxPen vPen;
POINTL vPntStart = {nX + nWidth - 1, rRect.y + 2}; // Make it look pretty!
POINTL vPntEnd = {nX + nWidth + nCharWidth - 3, rRect.y + 2}; //CharWidth is bit wide POINTL vPntEnd = {nX + nWidth + nCharWidth - 3, rRect.y + 2}; //CharWidth is bit wide
vPntStart.x = nX + nWidth - 1;
vPntStart.y = rRect.y + 2; // Make it look pretty!
vPen = wxPen(vColText, 1, wxSOLID); // Assuming we are always black vPen = wxPen(vColText, 1, wxSOLID); // Assuming we are always black
rDC.SetPen(vPen); rDC.SetPen(vPen);
::GpiMove(hPS, &vPntStart); ::GpiMove(hPS, &vPntStart);
@@ -282,10 +300,13 @@ bool wxOwnerDrawn::OnDrawItem(
// //
// Back off the starting position from the right edge // Back off the starting position from the right edge
// //
rDC.DrawText( sAccel vPntStart.x = rRect.width - (nWidth + 7);
,rRect.width - (nWidth + 7) // this seems to mimic the default OS/2 positioning vPntStart.y = rRect.y + 4;
,rRect.y + 4 ::GpiCharStringAt( rDC.GetHPS()
); ,&vPntStart
,sAccel.length()
,(PCH)sAccel.c_str()
);
} }
// //
@@ -323,8 +344,14 @@ bool wxOwnerDrawn::OnDrawItem(
if (vBmp.Ok()) if (vBmp.Ok())
{ {
wxMemoryDC vDCMem(&rDC);
wxMemoryDC vDCMem(&rDC);
wxMemoryDC* pOldDC = (wxMemoryDC*)vBmp.GetSelectedInto();
if(pOldDC != NULL)
{
vBmp.SetSelectedInto(NULL);
}
vDCMem.SelectObject(vBmp); vDCMem.SelectObject(vBmp);
// //
@@ -378,6 +405,7 @@ bool wxOwnerDrawn::OnDrawItem(
,0L ,0L
); );
} }
vBmp.SetSelectedInto(NULL);
} }
} }
return TRUE; return TRUE;

View File

@@ -964,8 +964,8 @@ void wxDrawBorder(
if (dwStyle & wxSIMPLE_BORDER || if (dwStyle & wxSIMPLE_BORDER ||
dwStyle & wxSTATIC_BORDER) dwStyle & wxSTATIC_BORDER)
{ {
vPoint[1].x = rRect.xRight; vPoint[1].x = rRect.xRight - 1;
vPoint[1].y = rRect.yTop; vPoint[1].y = rRect.yTop - 1;
::GpiBox( hPS ::GpiBox( hPS
,DRO_OUTLINE ,DRO_OUTLINE
,&vPoint[1] ,&vPoint[1]
@@ -977,7 +977,7 @@ void wxDrawBorder(
{ {
LINEBUNDLE vLineBundle; LINEBUNDLE vLineBundle;
vLineBundle.lColor = 0x00FFFFFF; // White vLineBundle.lColor = 0x00FFFFFF; // WHITE
vLineBundle.usMixMode = FM_OVERPAINT; vLineBundle.usMixMode = FM_OVERPAINT;
vLineBundle.fxWidth = 2; vLineBundle.fxWidth = 2;
vLineBundle.lGeomWidth = 2; vLineBundle.lGeomWidth = 2;
@@ -990,14 +990,26 @@ void wxDrawBorder(
,0L ,0L
,&vLineBundle ,&vLineBundle
); );
vPoint[1].x = rRect.xRight; vPoint[1].x = rRect.xRight - 1;
vPoint[1].y = rRect.yTop; vPoint[1].y = rRect.yTop - 1;
::GpiBox( hPS ::GpiBox( hPS
,DRO_OUTLINE ,DRO_OUTLINE
,&vPoint[1] ,&vPoint[1]
,0L ,0L
,0L ,0L
); );
vPoint[0].x = rRect.xLeft + 1;
vPoint[0].y = rRect.yBottom + 1;
::GpiMove(hPS, &vPoint[0]);
vPoint[1].x = rRect.xRight - 2;
vPoint[1].y = rRect.yTop - 2;
::GpiBox( hPS
,DRO_OUTLINE
,&vPoint[1]
,0L
,0L
);
vLineBundle.lColor = 0x00000000; // BLACK vLineBundle.lColor = 0x00000000; // BLACK
vLineBundle.usMixMode = FM_OVERPAINT; vLineBundle.usMixMode = FM_OVERPAINT;
vLineBundle.fxWidth = 2; vLineBundle.fxWidth = 2;
@@ -1015,17 +1027,165 @@ void wxDrawBorder(
vPoint[0].y = rRect.yBottom + 2; vPoint[0].y = rRect.yBottom + 2;
::GpiMove(hPS, &vPoint[0]); ::GpiMove(hPS, &vPoint[0]);
vPoint[1].x = rRect.xLeft + 2; vPoint[1].x = rRect.xLeft + 2;
vPoint[1].y = rRect.yTop - 2; vPoint[1].y = rRect.yTop - 3;
::GpiLine(hPS, &vPoint[1]); ::GpiLine(hPS, &vPoint[1]);
vPoint[1].x = rRect.xRight - 2; vPoint[1].x = rRect.xRight - 3;
vPoint[1].y = rRect.yTop - 2; vPoint[1].y = rRect.yTop - 3;
::GpiLine(hPS, &vPoint[1]);
vPoint[0].x = rRect.xLeft + 3;
vPoint[0].y = rRect.yBottom + 3;
::GpiMove(hPS, &vPoint[0]);
vPoint[1].x = rRect.xLeft + 3;
vPoint[1].y = rRect.yTop - 4;
::GpiLine(hPS, &vPoint[1]);
vPoint[1].x = rRect.xRight - 4;
vPoint[1].y = rRect.yTop - 4;
::GpiLine(hPS, &vPoint[1]); ::GpiLine(hPS, &vPoint[1]);
} }
if (dwStyle & wxDOUBLE_BORDER) if (dwStyle & wxDOUBLE_BORDER)
{ {
LINEBUNDLE vLineBundle;
vLineBundle.lColor = 0x00FFFFFF; // WHITE
vLineBundle.usMixMode = FM_OVERPAINT;
vLineBundle.fxWidth = 2;
vLineBundle.lGeomWidth = 2;
vLineBundle.usType = LINETYPE_SOLID;
vLineBundle.usEnd = 0;
vLineBundle.usJoin = 0;
::GpiSetAttrs( hPS
,PRIM_LINE
,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE
,0L
,&vLineBundle
);
vPoint[1].x = rRect.xRight - 1;
vPoint[1].y = rRect.yTop - 1;
::GpiBox( hPS
,DRO_OUTLINE
,&vPoint[1]
,0L
,0L
);
vLineBundle.lColor = 0x00000000; // WHITE
vLineBundle.usMixMode = FM_OVERPAINT;
vLineBundle.fxWidth = 2;
vLineBundle.lGeomWidth = 2;
vLineBundle.usType = LINETYPE_SOLID;
vLineBundle.usEnd = 0;
vLineBundle.usJoin = 0;
::GpiSetAttrs( hPS
,PRIM_LINE
,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE
,0L
,&vLineBundle
);
vPoint[0].x = rRect.xLeft + 2;
vPoint[0].y = rRect.yBottom + 2;
::GpiMove(hPS, &vPoint[0]);
vPoint[1].x = rRect.xRight - 2;
vPoint[1].y = rRect.yTop - 2;
::GpiBox( hPS
,DRO_OUTLINE
,&vPoint[1]
,0L
,0L
);
vLineBundle.lColor = 0x00FFFFFF; // BLACK
vLineBundle.usMixMode = FM_OVERPAINT;
vLineBundle.fxWidth = 2;
vLineBundle.lGeomWidth = 2;
vLineBundle.usType = LINETYPE_SOLID;
vLineBundle.usEnd = 0;
vLineBundle.usJoin = 0;
::GpiSetAttrs( hPS
,PRIM_LINE
,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE
,0L
,&vLineBundle
);
vPoint[0].x = rRect.xLeft + 3;
vPoint[0].y = rRect.yBottom + 3;
::GpiMove(hPS, &vPoint[0]);
vPoint[1].x = rRect.xRight - 3;
vPoint[1].y = rRect.yTop - 3;
::GpiBox( hPS
,DRO_OUTLINE
,&vPoint[1]
,0L
,0L
);
} }
if (dwStyle & wxRAISED_BORDER) if (dwStyle & wxRAISED_BORDER)
{ {
LINEBUNDLE vLineBundle;
vLineBundle.lColor = 0x00000000; // BLACK
vLineBundle.usMixMode = FM_OVERPAINT;
vLineBundle.fxWidth = 2;
vLineBundle.lGeomWidth = 2;
vLineBundle.usType = LINETYPE_SOLID;
vLineBundle.usEnd = 0;
vLineBundle.usJoin = 0;
::GpiSetAttrs( hPS
,PRIM_LINE
,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE
,0L
,&vLineBundle
);
vPoint[1].x = rRect.xRight - 1;
vPoint[1].y = rRect.yTop - 1;
::GpiBox( hPS
,DRO_OUTLINE
,&vPoint[1]
,0L
,0L
);
vPoint[0].x = rRect.xLeft + 1;
vPoint[0].y = rRect.yBottom + 1;
::GpiMove(hPS, &vPoint[0]);
vPoint[1].x = rRect.xRight - 2;
vPoint[1].y = rRect.yTop - 2;
::GpiBox( hPS
,DRO_OUTLINE
,&vPoint[1]
,0L
,0L
);
vLineBundle.lColor = 0x00FFFFFF; // WHITE
vLineBundle.usMixMode = FM_OVERPAINT;
vLineBundle.fxWidth = 2;
vLineBundle.lGeomWidth = 2;
vLineBundle.usType = LINETYPE_SOLID;
vLineBundle.usEnd = 0;
vLineBundle.usJoin = 0;
::GpiSetAttrs( hPS
,PRIM_LINE
,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE
,0L
,&vLineBundle
);
vPoint[0].x = rRect.xLeft + 2;
vPoint[0].y = rRect.yBottom + 2;
::GpiMove(hPS, &vPoint[0]);
vPoint[1].x = rRect.xLeft + 2;
vPoint[1].y = rRect.yTop - 3;
::GpiLine(hPS, &vPoint[1]);
vPoint[1].x = rRect.xRight - 3;
vPoint[1].y = rRect.yTop - 3;
::GpiLine(hPS, &vPoint[1]);
vPoint[0].x = rRect.xLeft + 3;
vPoint[0].y = rRect.yBottom + 3;
::GpiMove(hPS, &vPoint[0]);
vPoint[1].x = rRect.xLeft + 3;
vPoint[1].y = rRect.yTop - 4;
::GpiLine(hPS, &vPoint[1]);
vPoint[1].x = rRect.xRight - 4;
vPoint[1].y = rRect.yTop - 4;
::GpiLine(hPS, &vPoint[1]);
} }
} // end of wxDrawBorder } // end of wxDrawBorder

View File

@@ -3338,6 +3338,7 @@ bool wxWindow::HandlePaint()
,0L ,0L
,&vLineBundle ,&vLineBundle
); );
::WinQueryWindowRect(GetHwnd(), &vRect);
wxDrawBorder( hPS wxDrawBorder( hPS
,vRect ,vRect
,m_dwExStyle ,m_dwExStyle