Hi,
TO TRY THE CODE: place a picturebox on a form and name it DOWN

I want to use picture box as a command button in order to avoid the focus rectangle when the regular command button is down.
To do that I draw edge at runtime around my picture box (see code below)

The button part works well (picture box looks like the button)

The only part I have trouble with is centering the picture in the picture box. I've got the code from Arron Young and it works on a picture box but when I combine it with my code to draw the edges around the picture box it doesn't center.

Anyway here's the code (the last sub - CenterPicture() is the one I want to use with the rest of my code.... so far unsuccessfully.

VB Code:
  1. Private Declare Function DrawEdge Lib "user32" (ByVal hDC As Long, qrc As RECT, ByVal Edge As Long, ByVal grfFlags As Long) As Long
  2. Private Type RECT
  3.     Left As Long
  4.     Top As Long
  5.     Right As Long
  6.     Bottom As Long
  7. End Type
  8. Private Const BDR_RAISEDOUTER = &H1
  9. Private Const BDR_SUNKENOUTER = &H2
  10. Private Const BDR_RAISEDINNER = &H4
  11. Private Const BDR_SUNKENINNER = &H8
  12. Private Const EDGE_RAISED = (BDR_RAISEDOUTER Or BDR_RAISEDINNER)
  13. Private Const EDGE_SUNKEN = (BDR_SUNKENOUTER Or BDR_SUNKENINNER)
  14. Private Const EDGE_ETCHED = (BDR_SUNKENOUTER Or BDR_RAISEDINNER)
  15. Private Const EDGE_BUMP = (BDR_RAISEDOUTER Or BDR_SUNKENINNER)
  16. Private Const BF_LEFT = &H1
  17. Private Const BF_TOP = &H2
  18. Private Const BF_RIGHT = &H4
  19. Private Const BF_BOTTOM = &H8
  20. Private Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
  21.  
  22. Dim ButtonBorder As Long     ' picture variable to store Edge type
  23.  
  24. ' Draw picture with edges at startup
  25. Private Sub Form_Load()
  26.   DOWN.AutoRedraw = False
  27.   ButtonBorder = EDGE_RAISED       ' draw "button edge" around picture
  28. End Sub
  29.  
  30. ' This will make our picturebox look like a PRESSED button
  31. Private Sub DnPressed()
  32.   ButtonBorder = EDGE_SUNKEN
  33.   DOWN.Refresh
  34. End Sub
  35. ' This will make our picturebox look like a RELEASSED button
  36. Private Sub DnReleased()
  37.   ButtonBorder = EDGE_RAISED
  38.   DOWN.Refresh
  39. End Sub
  40.  
  41. ' Simulate Command_MouseDown() & command_MouseUp()
  42. Private Sub DOWN_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  43.   Call DnPressed
  44. End Sub
  45. Private Sub DOWN_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  46.   Call DnReleased
  47. End Sub
  48. Private Sub DOWN_DblClick()
  49.   Call DnPressed
  50. End Sub
  51.  
  52. ' Repaint drawn edges around our picture
  53. Private Sub DOWN_Paint()
  54.   Dim r As RECT
  55.   DOWN.Cls
  56.   r.Bottom = DOWN.ScaleHeight
  57.   r.Right = DOWN.ScaleWidth
  58.   DrawEdge DOWN.hDC, r, ButtonBorder, BF_RECT
  59. End Sub
  60.  
  61. '**********************************************************************************
  62. '**********************************************************************************
  63. '**********************************************************************************
  64. ' Arron Young's code to center picture inside a picturebox THAT NEED'S TO BE INTEGRATED WITH THE ABOVE CODE
  65. Private Sub CenterPicture()
  66.   With DOWN
  67.     DOWN.Line (0, 0)-(.ScaleWidth, .ScaleHeight), .BackColor, BF
  68.     .PaintPicture .Picture, (.ScaleWidth - .ScaleX(.Picture.Width, vbHimetric, .ScaleMode)) / 2, _
  69.                             (.ScaleHeight - .ScaleY(.Picture.Height, vbHimetric, .ScaleMode)) / 2
  70.   End With
  71. End Sub
  72. '**********************************************************************************
  73. '**********************************************************************************
  74. '**********************************************************************************