Browse Source

added better scaling for close and collapse icons

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@680 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden 12 years ago
parent
commit
ee539ee708

+ 25 - 0
CP_Main.rc

@@ -965,6 +965,31 @@ IDB_LEFT_ARROW_16_16    PNG                     "res\\left_arrow_16_16.png"
 IDB_LEFT_ARROW_20_20    PNG                     "res\\left_arrow_20_20.png"
 IDB_LEFT_ARROW_24_24    PNG                     "res\\left_arrow_24_24.png"
 IDB_LEFT_ARROW_32_32    PNG                     "res\\left_arrow_32_32.png"
+IDB_CLOSE_8_8           PNG                     "res\\close_8_8.png"
+
+IDB_CLOSE_10_10         PNG                     "res\\close_10_10.png"
+IDB_CLOSE_12_13         PNG                     "res\\close_12_12.png"
+IDB_CLOSE_16_16         PNG                     "res\\close_16_16.png"
+
+IDB_CHEVRON_RIGHT_8_8   PNG                     "res\\chevron_right_8_8.png"
+IDB_CHEVRON_RIGHT_10_10 PNG                     "res\\chevron_right_10_10.png"
+IDB_CHEVRON_RIGHT_12_12 PNG                     "res\\chevron_right_12_12.png"
+IDB_CHEVRON_RIGHT_16_16 PNG                     "res\\chevron_right_16_16.png"
+
+IDB_CHEVRON_LEFT_8_8   PNG                     "res\\chevron_left_8_8.png"
+IDB_CHEVRON_LEFT_10_10 PNG                     "res\\chevron_left_10_10.png"
+IDB_CHEVRON_LEFT_12_12 PNG                     "res\\chevron_left_12_12.png"
+IDB_CHEVRON_LEFT_16_16 PNG                     "res\\chevron_left_16_16.png"
+
+IDB_CHEVRON_TOP_8_8   PNG                     "res\\chevron_top_8_8.png"
+IDB_CHEVRON_TOP_10_10 PNG                     "res\\chevron_top_10_10.png"
+IDB_CHEVRON_TOP_12_12 PNG                     "res\\chevron_top_12_12.png"
+IDB_CHEVRON_TOP_16_16 PNG                     "res\\chevron_top_16_16.png"
+
+IDB_CHEVRON_BOTTOM_8_8   PNG                     "res\\chevron_bottom_8_8.png"
+IDB_CHEVRON_BOTTOM_10_10 PNG                     "res\\chevron_bottom_10_10.png"
+IDB_CHEVRON_BOTTOM_12_12 PNG                     "res\\chevron_bottom_12_12.png"
+IDB_CHEVRON_BOTTOM_16_16 PNG                     "res\\chevron_bottom_16_16.png"
 
 /////////////////////////////////////////////////////////////////////////////
 //

+ 24 - 0
CP_Main.vcxproj

@@ -1891,7 +1891,31 @@
     <None Include="res\bmp00001.bmp" />
     <None Include="res\bmp00002.bmp" />
     <None Include="res\bmp00003.bmp" />
+    <None Include="res\chevron_right_16_16.png" />
+    <None Include="res\chevron_right_10_10.png" />
+    <None Include="res\chevron_right_12_12.png" />
+    <None Include="res\chevron_right_8_8.png" />
+	
+	<None Include="res\chevron_left_16_16.png" />
+    <None Include="res\chevron_left_10_10.png" />
+    <None Include="res\chevron_left_12_12.png" />
+    <None Include="res\chevron_left_8_8.png" />
+	
+	<None Include="res\chevron_top_16_16.png" />
+    <None Include="res\chevron_top_10_10.png" />
+    <None Include="res\chevron_top_12_12.png" />
+    <None Include="res\chevron_top_8_8.png" />
+	
+	<None Include="res\chevron_bottom_16_16.png" />
+    <None Include="res\chevron_bottom_10_10.png" />
+    <None Include="res\chevron_bottom_12_12.png" />
+    <None Include="res\chevron_bottom_8_8.png" />
+	
     <None Include="res\closed_f.bmp" />
+    <None Include="res\close_10_10.png" />
+    <None Include="res\close_12_12.png" />
+    <None Include="res\close_16_16.png" />
+    <None Include="res\close_8_8.png" />
     <None Include="res\cog_16_16.png" />
     <None Include="res\cog_20_20.png" />
     <None Include="res\cog_22_22.png" />

+ 111 - 17
CP_Main.vcxproj.filters

@@ -331,8 +331,12 @@
     <ClCompile Include="DPI.cpp">
       <Filter>source</Filter>
     </ClCompile>
-    <ClCompile Include="MyDropTarget.cpp" />
-    <ClCompile Include="GdiImageDrawer.cpp" />
+    <ClCompile Include="GdiImageDrawer.cpp">
+      <Filter>source</Filter>
+    </ClCompile>
+    <ClCompile Include="MyDropTarget.cpp">
+      <Filter>source</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="sqlite\CppSQLite3.h">
@@ -710,8 +714,12 @@
     <ClInclude Include="DPI.h">
       <Filter>header</Filter>
     </ClInclude>
-    <ClInclude Include="MyDropTarget.h" />
-    <ClInclude Include="GdiImageDrawer.h" />
+    <ClInclude Include="GdiImageDrawer.h">
+      <Filter>header</Filter>
+    </ClInclude>
+    <ClInclude Include="MyDropTarget.h">
+      <Filter>header</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="CP_Main.rc">
@@ -820,22 +828,108 @@
     <None Include="res\left-blue.png">
       <Filter>res</Filter>
     </None>
-    <None Include="res\cog_16_16.png" />
-    <None Include="res\cog_22_22.png" />
     <None Include="res\shortcut.png">
       <Filter>res</Filter>
     </None>
-    <None Include="res\opened_folder_16_16.png" />
-    <None Include="res\opened_folder_20_20.png" />
-    <None Include="res\opened_folder_24_24.png" />
-    <None Include="res\opened_folder_32_32.png" />
-    <None Include="res\cog_20_20.png" />
-    <None Include="res\cog_24_24.png" />
-    <None Include="res\cog_32_32.png" />
-    <None Include="res\left_arrow_16_16.png" />
-    <None Include="res\left_arrow_20_20.png" />
-    <None Include="res\left_arrow_24_24.png" />
-    <None Include="res\left_arrow_32_32.png" />
+    <None Include="res\chevron_bottom_8_8.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_bottom_10_10.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_bottom_12_12.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_bottom_16_16.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_left_8_8.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_left_10_10.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_left_12_12.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_left_16_16.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_right_8_8.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_right_10_10.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_right_12_12.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_right_16_16.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_top_8_8.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_top_10_10.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_top_12_12.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\chevron_top_16_16.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\close_8_8.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\close_10_10.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\close_12_12.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\close_16_16.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\cog_16_16.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\cog_20_20.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\cog_22_22.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\cog_24_24.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\cog_32_32.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\left_arrow_16_16.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\left_arrow_20_20.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\left_arrow_24_24.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\left_arrow_32_32.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\opened_folder_16_16.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\opened_folder_20_20.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\opened_folder_24_24.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\opened_folder_32_32.png">
+      <Filter>res</Filter>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <Filter Include="sqlite">

+ 91 - 184
DittoWindow.cpp

@@ -46,6 +46,12 @@ void CDittoWindow::DoCreate(CWnd *pWnd)
 	m_HorFont.CreateFont(theApp.m_metrics.PointsToPixels(10), 0, 0, 0, 400, FALSE, FALSE, 0, ANSI_CHARSET,
 						OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
 						DEFAULT_PITCH|FF_SWISS, _T("Arial"));
+	
+	m_closeButton.LoadStdImageDPI(IDB_CLOSE_8_8, IDB_CLOSE_10_10, IDB_CLOSE_12_13, IDB_CLOSE_16_16, _T("PNG"));
+	m_chevronRightButton.LoadStdImageDPI(IDB_CHEVRON_RIGHT_8_8, IDB_CHEVRON_RIGHT_10_10, IDB_CHEVRON_RIGHT_12_12, IDB_CHEVRON_RIGHT_16_16, _T("PNG"));
+	m_chevronLeftButton.LoadStdImageDPI(IDB_CHEVRON_LEFT_8_8, IDB_CHEVRON_LEFT_10_10, IDB_CHEVRON_LEFT_12_12, IDB_CHEVRON_LEFT_16_16, _T("PNG"));
+	m_chevronTopButton.LoadStdImageDPI(IDB_CHEVRON_TOP_8_8, IDB_CHEVRON_TOP_10_10, IDB_CHEVRON_TOP_12_12, IDB_CHEVRON_TOP_16_16, _T("PNG"));
+	m_chevronBottomButton.LoadStdImageDPI(IDB_CHEVRON_BOTTOM_8_8, IDB_CHEVRON_BOTTOM_10_10, IDB_CHEVRON_BOTTOM_12_12, IDB_CHEVRON_BOTTOM_16_16, _T("PNG"));
 }
 
 void CDittoWindow::DoNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
@@ -148,63 +154,71 @@ void CDittoWindow::DoNcPaint(CWnd *pWnd)
 
 	rcBorder.InflateRect(1, 1, 1, 1);
 
+	int smallBorder = theApp.m_metrics.ScaleX(4);
+	int largeBorder = theApp.m_metrics.ScaleX(7);
+	int widthHeight = theApp.m_metrics.ScaleX(8);
+
 	BOOL bVertical = FALSE;
 	if(m_lRightBorder == CAPTION_BORDER)
 	{
-		m_crCloseBT.SetRect(rcBorder.right - m_lRightBorder + 2, 7,	rcBorder.right - m_lRightBorder + 14, 18);
-		m_crChevronBT.SetRect(rcBorder.right - m_lRightBorder + 2, rcBorder.bottom - 18, rcBorder.right - m_lRightBorder + 14, rcBorder.bottom - 7);
+		m_crCloseBT.SetRect(rcBorder.right - widthHeight - smallBorder, largeBorder, rcBorder.right - smallBorder, largeBorder + widthHeight);
 
-		m_crMaximizeBT = m_crCloseBT;
-		m_crMaximizeBT.top += m_crCloseBT.Height() + 5;
-		m_crMaximizeBT.bottom += m_crCloseBT.Height() + 5;
-		m_crMinimizeBT = m_crMaximizeBT;
-		m_crMinimizeBT.top += m_crCloseBT.Height() + 5;
-		m_crMinimizeBT.bottom += m_crCloseBT.Height() + 5;
+		m_crChevronBT.SetRect(rcBorder.right - widthHeight - smallBorder, rcBorder.bottom - widthHeight - largeBorder, rcBorder.right - smallBorder, rcBorder.bottom - largeBorder);
+
+		m_crMaximizeBT.left = m_crCloseBT.left;
+		m_crMaximizeBT.top = m_crCloseBT.bottom + largeBorder;
+		m_crMaximizeBT.right = m_crCloseBT.right;
+		m_crMaximizeBT.bottom = m_crMaximizeBT.top + widthHeight;
+
+		m_crMinimizeBT.left = m_crMaximizeBT.left;
+		m_crMinimizeBT.top += m_crMaximizeBT.bottom + largeBorder;
+		m_crMinimizeBT.right = m_crMaximizeBT.right;
+		m_crMinimizeBT.bottom += m_crMinimizeBT.top + widthHeight;
 
 		rcBorder.left = rcBorder.right - m_lRightBorder;
 		bVertical = TRUE;
 	}
 	else if(m_lLeftBorder == CAPTION_BORDER)
 	{
-		m_crCloseBT.SetRect(2, 7, 14, 18);
-		m_crChevronBT.SetRect(2, rcBorder.bottom - 18, 14, rcBorder.bottom - 7);
+		m_crCloseBT.SetRect(smallBorder, largeBorder, widthHeight+smallBorder, widthHeight+largeBorder);
+		m_crChevronBT.SetRect(smallBorder, rcBorder.bottom - largeBorder - widthHeight, widthHeight+smallBorder, rcBorder.bottom - largeBorder);
 
 		m_crMaximizeBT = m_crCloseBT;
-		m_crMaximizeBT.top += m_crCloseBT.Height() + 5;
-		m_crMaximizeBT.bottom += m_crCloseBT.Height() + 5;
+		m_crMaximizeBT.top += m_crCloseBT.Height() + largeBorder;
+		m_crMaximizeBT.bottom += m_crCloseBT.Height() + largeBorder;
 		m_crMinimizeBT = m_crMaximizeBT;
-		m_crMinimizeBT.top += m_crCloseBT.Height() + 5;
-		m_crMinimizeBT.bottom += m_crCloseBT.Height() + 5;
+		m_crMinimizeBT.top += m_crCloseBT.Height() + largeBorder;
+		m_crMinimizeBT.bottom += m_crCloseBT.Height() + largeBorder;
 
 		rcBorder.right = rcBorder.left + m_lLeftBorder;
 		bVertical = TRUE;
 	}
 	else if(m_lTopBorder == CAPTION_BORDER)
 	{
-		m_crCloseBT.SetRect(rcBorder.right - 18, 3, rcBorder.right - 6, 14);
-		m_crChevronBT.SetRect(4, 2, 15, 14);
+		m_crCloseBT.SetRect(rcBorder.right - widthHeight - largeBorder, smallBorder, rcBorder.right - largeBorder, widthHeight + smallBorder);
+		m_crChevronBT.SetRect(largeBorder, smallBorder, largeBorder+widthHeight, smallBorder+widthHeight);
 
 		m_crMaximizeBT = m_crCloseBT;
-		m_crMaximizeBT.left -= m_crCloseBT.Width() + 5;
-		m_crMaximizeBT.right -= m_crCloseBT.Width() + 5;
+		m_crMaximizeBT.left -= m_crCloseBT.Width() + largeBorder;
+		m_crMaximizeBT.right -= m_crCloseBT.Width() + largeBorder;
 		m_crMinimizeBT = m_crMaximizeBT;
-		m_crMinimizeBT.left -= m_crCloseBT.Width() + 5;
-		m_crMinimizeBT.right -= m_crCloseBT.Width() + 5;
+		m_crMinimizeBT.left -= m_crCloseBT.Width() + largeBorder;
+		m_crMinimizeBT.right -= m_crCloseBT.Width() + largeBorder;
 
 		rcBorder.bottom = rcBorder.top + m_lTopBorder;
 		bVertical = FALSE;
 	}
 	else if(m_lBottomBorder == CAPTION_BORDER)
 	{
-		m_crCloseBT.SetRect(rcBorder.right - 18, rcBorder.bottom - 13, rcBorder.right - 6, rcBorder.bottom - 2);
-		m_crChevronBT.SetRect(4, rcBorder.bottom - 14, 15,	rcBorder.bottom - 2);
+		m_crCloseBT.SetRect(rcBorder.right - largeBorder-widthHeight, rcBorder.bottom - smallBorder-widthHeight, rcBorder.right - largeBorder, rcBorder.bottom - smallBorder);
+		m_crChevronBT.SetRect(largeBorder, rcBorder.bottom - smallBorder-widthHeight, largeBorder+widthHeight,	rcBorder.bottom - smallBorder);
 
 		m_crMaximizeBT = m_crCloseBT;
-		m_crMaximizeBT.left -= m_crCloseBT.Width() + 5;
-		m_crMaximizeBT.right -= m_crCloseBT.Width() + 5;
+		m_crMaximizeBT.left -= m_crCloseBT.Width() + largeBorder;
+		m_crMaximizeBT.right -= m_crCloseBT.Width() + largeBorder;
 		m_crMinimizeBT = m_crMaximizeBT;
-		m_crMinimizeBT.left -= m_crCloseBT.Width() + 5;
-		m_crMinimizeBT.right -= m_crCloseBT.Width() + 5;
+		m_crMinimizeBT.left -= m_crCloseBT.Width() + largeBorder;
+		m_crMinimizeBT.right -= m_crCloseBT.Width() + largeBorder;
 
 		rcBorder.top = rcBorder.bottom - m_lBottomBorder;
 		bVertical = FALSE;
@@ -294,13 +308,13 @@ void CDittoWindow::DoNcPaint(CWnd *pWnd)
 
 	if(m_lRightBorder == CAPTION_BORDER)
 	{
-		int nTop = 0;
-		if(m_bDrawClose)
-			nTop += theApp.m_metrics.ScaleY(20);
-		if(m_bDrawMaximize)
-			nTop += theApp.m_metrics.ScaleY(20);
-		if(m_bDrawMaximize)
-			nTop += theApp.m_metrics.ScaleY(20);
+		int nTop = largeBorder;
+		if (m_bDrawClose)
+			nTop += widthHeight + largeBorder;
+		if (m_bDrawMaximize)
+			nTop += widthHeight + largeBorder;
+		if (m_bDrawMaximize)
+			nTop += widthHeight + largeBorder;
 		cr.SetRect(rcBorder.right - 1, nTop, rcBorder.right - theApp.m_metrics.ScaleX(13), rcBorder.bottom - theApp.m_metrics.ScaleY(20));
 		dc.DrawText(csText, cr, DT_SINGLELINE);
 	}
@@ -311,13 +325,13 @@ void CDittoWindow::DoNcPaint(CWnd *pWnd)
 	}
 	else if(m_lLeftBorder == CAPTION_BORDER)
 	{
-		int nTop = 0;
+		int nTop = largeBorder;
 		if(m_bDrawClose)
-			nTop += theApp.m_metrics.ScaleY(20);
+			nTop += widthHeight + largeBorder;
 		if(m_bDrawMaximize)
-			nTop += theApp.m_metrics.ScaleY(20);
+			nTop += widthHeight + largeBorder;
 		if(m_bDrawMaximize)
-			nTop += theApp.m_metrics.ScaleY(20);
+			nTop += widthHeight + largeBorder;
 
 		cr.SetRect(theApp.m_metrics.ScaleX(15) , nTop, 2, rcBorder.bottom - theApp.m_metrics.ScaleY(20));
 		dc.DrawText(csText, cr, DT_SINGLELINE);
@@ -328,8 +342,8 @@ void CDittoWindow::DoNcPaint(CWnd *pWnd)
 		dc.DrawText(csText, cr, DT_SINGLELINE);
 	}
 
-	DrawCloseBtn(dc);
-	DrawChevronBtn(dc);
+	DrawCloseBtn(dc, pWnd);
+	DrawChevronBtn(dc, pWnd);
 	DrawMaximizeBtn(dc);
 	DrawMinimizeBtn(dc);
 
@@ -346,16 +360,23 @@ void CDittoWindow::DoSetRegion(CWnd *pWnd)
 	CRgn rgnRect, rgnRect2, rgnRound, rgnFinalA, rgnFinalB;
 	pWnd->GetWindowRect(rect);
 
+	CRect r;
+	pWnd->GetClientRect(&r);
+
+	int seven = theApp.m_metrics.ScaleX(7);
+	int fifteen = theApp.m_metrics.ScaleX(15);
+	int one = theApp.m_metrics.ScaleX(1);
+	
 	if((m_lRightBorder == CAPTION_BORDER) ||
 		(m_lTopBorder == CAPTION_BORDER))
 	{		
-		rgnRect.CreateRectRgn(0, 0, rect.Width() - 7, rect.Height());
-		rgnRound.CreateRoundRectRgn(0, 0, rect.Width()+1, rect.Height(), 15, 15);
+		rgnRect.CreateRectRgn(0, 0, rect.Width() - seven, rect.Height());
+		rgnRound.CreateRoundRectRgn(0, 0, rect.Width() + one, rect.Height(), fifteen, fifteen);
 
 		rgnFinalB.CreateRectRgn(0, 0, 0, 0);
 		rgnFinalB.CombineRgn(&rgnRect, &rgnRound, RGN_OR);
 
-		rgnRect2.CreateRectRgn(0, 7, rect.Width(), rect.Height());
+		rgnRect2.CreateRectRgn(0, seven, rect.Width(), rect.Height());
 		rgnFinalA.CreateRectRgn(0, 0, 0, 0);
 		rgnFinalA.CombineRgn(&rgnRect2, &rgnFinalB, RGN_OR);
 
@@ -364,13 +385,13 @@ void CDittoWindow::DoSetRegion(CWnd *pWnd)
 	}
 	else if(m_lLeftBorder == CAPTION_BORDER)
 	{
-		rgnRect.CreateRectRgn(0, 7, rect.Width(), rect.Height());
-		rgnRound.CreateRoundRectRgn(0, 0, rect.Width(), rect.Height(), 15, 15);
+		rgnRect.CreateRectRgn(0, seven, rect.Width(), rect.Height());
+		rgnRound.CreateRoundRectRgn(0, 0, rect.Width(), rect.Height(), fifteen, fifteen);
 
 		rgnFinalB.CreateRectRgn(0, 0, 0, 0);
 		rgnFinalB.CombineRgn(&rgnRect, &rgnRound, RGN_OR);
 
-		rgnRect2.CreateRectRgn(7, 0, rect.Width(), rect.Height());
+		rgnRect2.CreateRectRgn(seven, 0, rect.Width(), rect.Height());
 		rgnFinalA.CreateRectRgn(0, 0, 0, 0);
 		rgnFinalA.CombineRgn(&rgnRect2, &rgnFinalB, RGN_OR);
 
@@ -378,13 +399,13 @@ void CDittoWindow::DoSetRegion(CWnd *pWnd)
 	}
 	else if(m_lBottomBorder == CAPTION_BORDER)
 	{
-		rgnRect.CreateRectRgn(0, 0, rect.Width(), rect.Height()-7);
-		rgnRound.CreateRoundRectRgn(0, 0, rect.Width()+1, rect.Height()+1, 15, 15);
+		rgnRect.CreateRectRgn(0, 0, rect.Width(), rect.Height() - seven);
+		rgnRound.CreateRoundRectRgn(0, 0, rect.Width() + one, rect.Height() + one, fifteen, fifteen);
 
 		rgnFinalB.CreateRectRgn(0, 0, 0, 0);
 		rgnFinalB.CombineRgn(&rgnRect, &rgnRound, RGN_OR);
 
-		rgnRect2.CreateRectRgn(0, 0, rect.Width()-15, rect.Height());
+		rgnRect2.CreateRectRgn(0, 0, rect.Width() - fifteen, rect.Height());
 		rgnFinalA.CreateRectRgn(0, 0, 0, 0);
 		rgnFinalA.CombineRgn(&rgnRect2, &rgnFinalB, RGN_OR);
 
@@ -392,7 +413,7 @@ void CDittoWindow::DoSetRegion(CWnd *pWnd)
 	}
 }
 
-void CDittoWindow::DrawChevronBtn(CWindowDC &dc)
+void CDittoWindow::DrawChevronBtn(CWindowDC &dc, CWnd *pWnd)
 {
 	if(m_bDrawChevron == false)
 	{
@@ -400,149 +421,32 @@ void CDittoWindow::DrawChevronBtn(CWindowDC &dc)
 	}
 	bool bTopOrBottom = false;
 
-	int Points[5][8];
-	int Points2[8][5];
-	if(((m_lRightBorder == CAPTION_BORDER) && (m_bMinimized == false)) ||
-		((m_lLeftBorder == CAPTION_BORDER) && (m_bMinimized)))
+	if (m_lRightBorder == CAPTION_BORDER)
 	{
-		int nTemp[5][8] = 
-		{
-				1,1,0,0,1,1,0,0,
-				0,1,1,0,0,1,1,0,
-				0,0,1,1,0,0,1,1,
-				0,1,1,0,0,1,1,0,
-				1,1,0,0,1,1,0,0
-		};
-		memcpy(&Points, &nTemp, sizeof(nTemp));
-	}
-	else if(((m_lRightBorder == CAPTION_BORDER) && (m_bMinimized)) ||
-		((m_lLeftBorder == CAPTION_BORDER) && (m_bMinimized == false)))
-	{
-		int nTemp[5][8] = 
-		{
-				0,0,1,1,0,0,1,1,
-				0,1,1,0,0,1,1,0,
-				1,1,0,0,1,1,0,0,
-				0,1,1,0,0,1,1,0,
-				0,0,1,1,0,0,1,1
-		};
-
-		memcpy(&Points, &nTemp, sizeof(nTemp));
+		m_chevronRightButton.Draw(&dc, pWnd, m_crChevronBT.left, m_crChevronBT.top, m_bMouseOverChevron, m_bMouseDownOnChevron);
 	}
-	else if(((m_lTopBorder == CAPTION_BORDER) && (m_bMinimized == false)) ||
-		((m_lBottomBorder == CAPTION_BORDER) && (m_bMinimized)))
+	else if (m_lLeftBorder == CAPTION_BORDER)
 	{
-		bTopOrBottom = true;
-
-		int nTemp[8][5] =
-		{
-				0,0,1,0,0,
-				0,1,1,1,0,
-				1,1,0,1,1,
-				1,0,0,0,1,
-				0,0,1,0,0,
-				0,1,1,1,0,
-				1,1,0,1,1,
-				1,0,0,0,1
-		};
-		memcpy(&Points2, &nTemp, sizeof(nTemp));
-	}
-	else if(((m_lTopBorder == CAPTION_BORDER) && (m_bMinimized)) ||
-		((m_lBottomBorder == CAPTION_BORDER) && (m_bMinimized == false)))
-	{
-		bTopOrBottom = true;
-
-		int nTemp[8][5] =
-		{
-				1,0,0,0,1,
-				1,1,0,1,1,
-				0,1,1,1,0,
-				0,0,1,0,0,
-				1,0,0,0,1,
-				1,1,0,1,1,
-				0,1,1,1,0,
-				0,0,1,0,0
-		};
-		memcpy(&Points2, &nTemp, sizeof(nTemp));
-	}
-
-	COLORREF shaddow = RGB(GetRValue(m_CaptionColorLeft) * 1.16, GetGValue(m_CaptionColorLeft) * 1.12, GetBValue(m_CaptionColorLeft) * 1.12);
-
-	if(m_bMouseDownOnChevron)
-		dc.Draw3dRect(m_crChevronBT, shaddow, RGB(255, 255, 255));
-	else if(m_bMouseOverChevron)
-		dc.Draw3dRect(m_crChevronBT, RGB(255, 255, 255), shaddow);
-
-	if(bTopOrBottom == false)
-	{
-		CPoint ptShift = m_crChevronBT.TopLeft();
-		ptShift.Offset(2, 3);
-
-		for (int iRow = 0; iRow < 5; iRow++)
-		{
-			for (int iCol = 0; iCol < 8; iCol++)
-			{
-				if (Points[iRow][iCol] == 1)
-					dc.SetPixel(ptShift+CPoint(iCol, iRow), RGB(255, 255, 255));
-			}
-		}
+		m_chevronLeftButton.Draw(&dc, pWnd, m_crChevronBT.left, m_crChevronBT.top, m_bMouseOverChevron, m_bMouseDownOnChevron);
 	}
-	else
+	else if (m_lTopBorder == CAPTION_BORDER)
 	{
-		CPoint ptShift = m_crChevronBT.TopLeft();
-		ptShift.Offset(3, 2);
-
-		for (int iRow = 0; iRow < 8; iRow++)
-		{
-			for (int iCol = 0; iCol < 5; iCol++)
-			{
-				if (Points2[iRow][iCol] == 1)
-					dc.SetPixel(ptShift+CPoint(iCol, iRow), RGB(255, 255, 255));
-			}
-		}
+		m_chevronTopButton.Draw(&dc, pWnd, m_crChevronBT.left, m_crChevronBT.top, m_bMouseOverChevron, m_bMouseDownOnChevron);
 	}
+	else if (m_lBottomBorder == CAPTION_BORDER)
+	{
+		m_chevronBottomButton.Draw(&dc, pWnd, m_crChevronBT.left, m_crChevronBT.top, m_bMouseOverChevron, m_bMouseDownOnChevron);
+	}	
 }
 
-void CDittoWindow::DrawCloseBtn(CWindowDC &dc)
+void CDittoWindow::DrawCloseBtn(CWindowDC &dc, CWnd *pWnd)
 {
 	if(m_bDrawClose == false)
 	{
 		return;
 	}
-
-	//rows first then columns
-	int Points[5][6] =
-	{
-		1,1,0,0,1,1,
-		0,1,1,1,1,0,
-		0,0,1,1,0,0,
-		0,1,1,1,1,0,
-		1,1,0,0,1,1
-	};
-
-	CPoint ptShift = m_crCloseBT.TopLeft();
-	ptShift.Offset(3, 3);
-
-	if(m_bMouseDownOnClose)
-	{
-		dc.Draw3dRect(m_crCloseBT, RGB(255, 255, 255), RGB(255, 255, 255));
-		CRect cr(m_crCloseBT);
-		cr.DeflateRect(1, 1, 1, 1);
-		dc.Draw3dRect(cr, RGB(255, 255, 255), RGB(255, 255, 255));
-	}
-	else if(m_bMouseOverClose)
-	{
-		dc.Draw3dRect(m_crCloseBT, RGB(255, 255, 255), RGB(255, 255, 255));
-	}
-
-	for (int iRow = 0; iRow < 5; iRow++)
-	{
-		for (int iCol = 0; iCol < 6; iCol++)
-		{
-			if (Points[iRow][iCol] == 1)
-				dc.SetPixel(ptShift+CPoint(iCol, iRow), RGB(255, 255, 255));
-		}
-	}
+	
+	m_closeButton.Draw(&dc, pWnd, m_crCloseBT.left, m_crCloseBT.top, m_bMouseOverClose, m_bMouseDownOnClose);
 }
 
 void CDittoWindow::DrawMinimizeBtn(CWindowDC &dc)
@@ -642,15 +546,16 @@ void CDittoWindow::DoNcLButtonDown(CWnd *pWnd, UINT nHitTest, CPoint point)
 	{
 		pWnd->SetCapture();
 		m_bMouseDownOnClose = true;
-		CWindowDC dc(pWnd);
-		DrawCloseBtn(dc);
+		DoNcPaint(pWnd);
+		//CWindowDC dc(pWnd);
+		//DrawCloseBtn(dc);
 	}
 	else if(m_crChevronBT.PtInRect(clPoint))
 	{
 		pWnd->SetCapture();
 		m_bMouseDownOnChevron = true;
 		CWindowDC dc(pWnd);
-		DrawChevronBtn(dc);
+		DrawChevronBtn(dc, pWnd);
 	}
 	else if(m_crMinimizeBT.PtInRect(clPoint))
 	{
@@ -762,7 +667,8 @@ void CDittoWindow::DoNcMouseMove(CWnd *pWnd, UINT nHitTest, CPoint point)
 	{
 		m_bMouseOverClose = true;
 		CWindowDC dc(pWnd);
-		DrawCloseBtn(dc);
+		DrawCloseBtn(dc, pWnd);
+		//this->DoNcPaint(pWnd);
 	}
 	else if(m_bMouseOverClose)
 	{
@@ -774,7 +680,7 @@ void CDittoWindow::DoNcMouseMove(CWnd *pWnd, UINT nHitTest, CPoint point)
 	{
 		m_bMouseOverChevron = true;
 		CWindowDC dc(pWnd);
-		DrawChevronBtn(dc);
+		DrawChevronBtn(dc, pWnd);
 	}
 	else if(m_bMouseOverChevron)
 	{
@@ -846,6 +752,7 @@ void CDittoWindow::SetCaptionOn(CWnd *pWnd, int nPos, bool bOnstartup)
 		pWnd->SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
 	}
 
+	pWnd->Invalidate();
 	pWnd->RedrawWindow();
 }
 

+ 12 - 2
DittoWindow.h

@@ -1,5 +1,9 @@
 #pragma once
 
+#include "GdipButton.h"
+
+#include "GdiImageDrawer.h"
+
 #define BUTTON_CLOSE 1
 #define BUTTON_CHEVRON 2
 #define BUTTON_MINIMIZE 3
@@ -12,8 +16,8 @@ public:
 	~CDittoWindow(void);
 
 	void DoNcPaint(CWnd *pWnd);
-	void DrawChevronBtn(CWindowDC &dc);
-	void DrawCloseBtn(CWindowDC &dc);
+	void DrawChevronBtn(CWindowDC &dc, CWnd *pWnd);
+	void DrawCloseBtn(CWindowDC &dc, CWnd *pWnd);
 	void DrawMaximizeBtn(CWindowDC &dc);
 	void DrawMinimizeBtn(CWindowDC &dc);
 
@@ -62,4 +66,10 @@ public:
 	COLORREF m_CaptionColorLeft;
 	COLORREF m_CaptionColorRight;
 	COLORREF m_CaptionTextColor;
+	
+	CGdiImageDrawer m_closeButton;
+	CGdiImageDrawer m_chevronRightButton;
+	CGdiImageDrawer m_chevronLeftButton;
+	CGdiImageDrawer m_chevronTopButton;
+	CGdiImageDrawer m_chevronBottomButton;
 };

+ 56 - 15
GdiImageDrawer.cpp

@@ -1,16 +1,13 @@
 #include "stdafx.h"
 #include "GdiImageDrawer.h"
-
-
 #include "MemDC.h"
-
+#include "CP_Main.h"
 
 CGdiImageDrawer::CGdiImageDrawer()
 {
 	m_pStdImage = NULL;
 }
 
-
 CGdiImageDrawer::~CGdiImageDrawer()
 {
 	delete m_pStdImage;
@@ -22,22 +19,66 @@ BOOL CGdiImageDrawer::LoadStdImage(UINT id, LPCTSTR pType)
 	return m_pStdImage->Load(id, pType);
 }
 
-void CGdiImageDrawer::Draw(CDC* pScreenDC, int posX, int posY)
+BOOL CGdiImageDrawer::LoadStdImageDPI(UINT id96, UINT id120, UINT id144, UINT id192, LPCTSTR pType)
 {
-	//if (m_dcStd.m_hDC == NULL)
+	BOOL ret = FALSE;
+
+	if (theApp.m_metrics.GetDPIX() >= 192)
+	{
+		ret = LoadStdImage(id192, pType);
+	}
+	else if (theApp.m_metrics.GetDPIX() >= 144)
+	{
+		ret = LoadStdImage(id144, pType);
+	}
+	else if (theApp.m_metrics.GetDPIX() >= 120)
+	{
+		ret = LoadStdImage(id120, pType);
+	}
+	else
 	{
-		//CBitmap bmp, *pOldBitmap;
+		ret = LoadStdImage(id96, pType);
+	}
+
+	return ret;
+}
+
+void CGdiImageDrawer::Draw(CDC* pScreenDC, CWnd *pWnd, int posX, int posY, bool mouseHover, bool mouseDown)
+{
+	int width = m_pStdImage->m_pBitmap->GetWidth();
+	int height = m_pStdImage->m_pBitmap->GetHeight();
+
+	CRect rectWithBorder(posX, posY, posX + width, posY + height);
 
-		Gdiplus::Graphics graphics(pScreenDC->m_hDC);
-		graphics.DrawImage(m_pStdImage->m_pBitmap, posX, posY);
+	int two = theApp.m_metrics.ScaleX(2);
+	rectWithBorder.InflateRect(two, two, two, two);
 
+	CDC dcBk;
+	CBitmap bmp;
+	CClientDC clDC(pWnd);
+		
+	//Copy the background over the entire area
+	dcBk.CreateCompatibleDC(&clDC);
+	bmp.CreateCompatibleBitmap(&clDC, 1, 1);
+	dcBk.SelectObject(&bmp);
+	dcBk.BitBlt(0, 0, 1, 1, &clDC, rectWithBorder.left-1, rectWithBorder.top, SRCCOPY);
+	bmp.DeleteObject();
+	
+	//pScreenDC->StretchBlt(rectWithBorder.left, rectWithBorder.top, rectWithBorder.Width(), rectWithBorder.Height(), &dcBk, 0, 0, 1, 1, SRCCOPY);
 
-		//m_dcStd.CreateCompatibleDC(pScreenDC);
-		//bmp.CreateCompatibleBitmap(pScreenDC, 15, 15);
-		//pOldBitmap = m_dcStd.SelectObject(&bmp);
-		//m_dcStd.BitBlt(0, 0, 15, 15, pScreenDC, 0, 0, SRCCOPY);
-		//bmp.DeleteObject();
+	//Draw the png file
+	if (mouseDown)
+	{
+		int one = theApp.m_metrics.ScaleX(1);
+		posX += one;
+		posY += one;
 	}
+	Gdiplus::Graphics graphics(pScreenDC->m_hDC);
+	graphics.DrawImage(*m_pStdImage, posX, posY, width, height);	
 
-	//pScreenDC->BitBlt(0, 0, 15, 15, &m_dcStd, 0, 0, SRCCOPY);
+	//If we are hoving over then draw the border
+	if(mouseHover && mouseDown == false)
+	{
+		pScreenDC->Draw3dRect(rectWithBorder, RGB(255, 255, 255), RGB(255, 255, 255));
+	}
 }

+ 4 - 1
GdiImageDrawer.h

@@ -9,11 +9,14 @@ public:
 	~CGdiImageDrawer();
 
 	BOOL LoadStdImage(UINT id, LPCTSTR pType);
-	void CGdiImageDrawer::Draw(CDC* pScreenDC, int posX, int posY);
+	BOOL LoadStdImageDPI(UINT id96, UINT id120, UINT id144, UINT id192, LPCTSTR pType);
+	void CGdiImageDrawer::Draw(CDC* pScreenDC, CWnd *pWnd, int posX, int posY, bool mouseHover, bool mouseDown);
 
 protected:
 	CGdiPlusBitmapResource* m_pStdImage;
 	CDC*	m_pCurBtn;		// current pointer to one of the above
 	CDC		m_dcStd;		// standard button
+
+	//CDC m_dcBk;
 };
 

+ 2 - 2
QPasteWnd.cpp

@@ -404,9 +404,9 @@ void CQPasteWnd::MoveControls()
 	m_lstHeader.MoveWindow(0, topOfListBox, cx+extraSize, cy - listBoxBottomOffset-topOfListBox + extraSize);
     m_search.MoveWindow(theApp.m_metrics.ScaleX(20), cy - theApp.m_metrics.ScaleY(21), cx - theApp.m_metrics.ScaleX(40), theApp.m_metrics.ScaleY(20));
 
-	m_searchOptionsButton.MoveWindow(cx - theApp.m_metrics.ScaleX(18), cy - theApp.m_metrics.ScaleY(19), theApp.m_metrics.ScaleX(16), theApp.m_metrics.ScaleY(16));
+	m_searchOptionsButton.MoveWindow(cx - theApp.m_metrics.ScaleX(18), cy - theApp.m_metrics.ScaleY(19), theApp.m_metrics.ScaleX(17), theApp.m_metrics.ScaleY(17));
 
-    m_ShowGroupsFolderBottom.MoveWindow(theApp.m_metrics.ScaleY(2), cy - theApp.m_metrics.ScaleY(18), theApp.m_metrics.ScaleX(16), theApp.m_metrics.ScaleY(16));
+    m_ShowGroupsFolderBottom.MoveWindow(theApp.m_metrics.ScaleY(2), cy - theApp.m_metrics.ScaleY(19), theApp.m_metrics.ScaleX(17), theApp.m_metrics.ScaleY(17));
 }
 
 void CQPasteWnd::OnSetFocus(CWnd *pOldWnd)

+ 31 - 1
Resource.h

@@ -59,6 +59,36 @@
 #define IDB_LEFT_ARROW_20_20            194
 #define IDB_LEFT_ARROW_24_24            195
 #define IDB_LEFT_ARROW_32_32            196
+#define IDB_CLOSE_12_12                 197
+#define IDB_CLOSE_8_8                   197
+
+#define IDB_CLOSE_10_10                 199
+#define IDB_CLOSE_12_13                 200
+#define IDB_PNG3                        201
+#define IDB_CLOSE_16_16                 201
+
+#define IDB_CHEVRON_RIGHT_8_8            198
+#define IDB_CHEVRON_RIGHT_10_10          202
+#define IDB_CHEVRON_RIGHT_12_12          203
+#define IDB_CHEVRON_RIGHT_16_16          204
+
+#define IDB_CHEVRON_LEFT_8_8            205
+#define IDB_CHEVRON_LEFT_10_10          206
+#define IDB_CHEVRON_LEFT_12_12          207
+#define IDB_CHEVRON_LEFT_16_16          208
+
+#define IDB_CHEVRON_TOP_8_8            209
+#define IDB_CHEVRON_TOP_10_10          210
+#define IDB_CHEVRON_TOP_12_12          211
+#define IDB_CHEVRON_TOP_16_16          212
+
+#define IDB_CHEVRON_BOTTOM_8_8            213
+#define IDB_CHEVRON_BOTTOM_10_10          214
+#define IDB_CHEVRON_BOTTOM_12_12          215
+#define IDB_CHEVRON_BOTTOM_16_16          216
+
+#define IDB_PNG5                        217
+
 #define IDC_PATH                        1000
 #define IDC_GET_PATH                    1001
 #define IDC_SELECT_SOUND                1002
@@ -393,7 +423,7 @@
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
-#define _APS_NEXT_RESOURCE_VALUE        197
+#define _APS_NEXT_RESOURCE_VALUE        218
 #define _APS_NEXT_COMMAND_VALUE         32881
 #define _APS_NEXT_CONTROL_VALUE         2101
 #define _APS_NEXT_SYMED_VALUE           101

+ 1 - 1
WndEx.cpp

@@ -84,7 +84,7 @@ BOOL CWndEx::Create(const CRect& crStart, CWnd* pParentWnd)
 	
 	// Create the QPaste window class
 	if (!AfxRegisterClass(&wc))
-		return FALSE;
+		return FALSE;		
 	
 	return CWndEx::CreateEx(0, _T("QPasteClass"), _T("Quick Paste"), WS_POPUP,
 		crStart, pParentWnd, 0);

+ 1 - 1
WndEx.h

@@ -8,6 +8,7 @@
 //
 
 #include "DittoWindow.h"
+#include "GdipButton.h"
 
 #define	SWAP_MIN_MAX			1
 #define FORCE_MIN				2
@@ -50,7 +51,6 @@ protected:
 	COleDateTime m_TimeMaximized;
 	int m_lDelayMaxSeconds;
 
-
 // Implementation
 public:
 	virtual ~CWndEx();

BIN
res/chevron_10_10.png


BIN
res/chevron_12_12.png


BIN
res/chevron_16_16.png


BIN
res/chevron_8_8.png


BIN
res/chevron_bottom_10_10.png


BIN
res/chevron_bottom_12_12.png


BIN
res/chevron_bottom_16_16.png


BIN
res/chevron_bottom_8_8.png


BIN
res/chevron_left_10_10.png


BIN
res/chevron_left_12_12.png


BIN
res/chevron_left_16_16.png


BIN
res/chevron_left_8_8.png


BIN
res/chevron_right_10_10.png


BIN
res/chevron_right_12_12.png


BIN
res/chevron_right_16_16.png


BIN
res/chevron_right_8_8.png


BIN
res/chevron_top_10_10.png


BIN
res/chevron_top_12_12.png


BIN
res/chevron_top_16_16.png


BIN
res/chevron_top_8_8.png


BIN
res/close_10_10.png


BIN
res/close_12_12.png


BIN
res/close_16_16.png


BIN
res/close_8_8.png