May 03, 2024, 12:04:41 AM

News:

IonicWind Snippit Manager 2.xx Released!  Install it on a memory stick and take it with you!  With or without IWBasic!


Color square on window drag bar

Started by splakidas, June 22, 2009, 01:31:03 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

splakidas

Is it posible to draw a colored square on the drag bar ?

Like this:  The yellow square


Ficko

Hi splakidas!

Custom captions are not easy to do.

Basically you have two approaches:

1. Using Win APIs (regions etc.) http://ourworld.compuserve.com/homepages/ernies_world/cc.htm

2. Using C++ MDI classes http://www.codeproject.com/KB/GDI/customcaption.aspx

splakidas


sapero

This is a mini example how it can be done:

$include "windowssdk.inc"
CONST IDC_DRAWCAPTION = 10000

DIALOG d1
CREATEDIALOG d1,0,0,300,202,0x80CB0080|@SIZE,0,"Caption with square",&d1_handler
domodal d1

SUB d1_handler
SELECT @MESSAGE
CASE @IDINITDIALOG
CENTERWINDOW d1
/* Initialize any controls here */
CASE @IDCLOSEWINDOW
CLOSEDIALOG d1,@IDOK

case  WM_NCPAINT
case& WM_NCACTIVATE
' execute first the default handler, then draw custom
PostMessage(d1.hwnd, WM_COMMAND, IDC_DRAWCAPTION, 0)

case @IDMENUPICK
if (@MENUNUM = IDC_DRAWCAPTION)
HDC dc = GetWindowDC(d1.hwnd)
WINRECT rc
DWORD style   = GetWindowLong(d1.hwnd, GWL_STYLE)
int CXBORDER
int CYBORDER
int CYCAPTION = GetSystemMetrics(SM_CYCAPTION)
int CXICON    = 0

if (!(style & WS_DLGFRAME))
CXICON = GetSystemMetrics(SM_CXICON)
endif
if (style & WS_SIZEBOX)
CXBORDER = GetSystemMetrics(SM_CXSIZEFRAME)
CYBORDER = GetSystemMetrics(SM_CYSIZEFRAME)
else
CXBORDER = GetSystemMetrics(SM_CXFIXEDFRAME)
CYBORDER = GetSystemMetrics(SM_CYFIXEDFRAME)
endif

rc.left = CXBORDER + CXICON
rc.top  = CYBORDER

string caption = GetCaption(d1)
if (caption[0] <> 0)
' create caption font
NONCLIENTMETRICS ncm
ncm.cbSize = len(ncm)
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, FALSE)
HFONT font = SelectObject(dc, CreateFontIndirect(&ncm.lfCaptionFont))
SIZE s
' compute caption text width
GetTextExtentPoint32(dc, caption, len(caption), &s)
DeleteObject(SelectObject(dc, font))
' update square position
rc.left += (s.cx + 4)
endif
int squareHeight = 8
' center the square
rc.top = rc.top + (CYCAPTION - squareHeight)/2
' square size
rc.right = rc.left + 32 ' width
rc.bottom = rc.top + squareHeight
' draw it
HBRUSH brush = CreateSolidBrush(RGB(255,0,0))
FillRect(dc, &rc, brush)
DeleteObject(brush)
ReleaseDC(d1.hwnd, dc)
endif
ENDSELECT
RETURN
ENDSUB

GWS

Here's a bit of code from many years ago by Allden ..  :)


'/* Allden's guide to tearing apart windows */
'/* RECT STRUCT */
Type tangle
Def left:int
Def top:int
Def right:int
Def bottom:int
EndType
Def rcfill:tangle
'/* POINTS STRUCT */
Type tagPOINT
Def x:int
Def y:int
Endtype
Def pt:tagPOINT
Declare "user32",GetWindowDC(hwnd:int),int
Declare "user32",ReleaseDC(hwnd:int,hdc:int),int
Declare "user32",FillRect(hdc:int, lpRect:rect, hBrush:int),int
Declare "user32",SetRect(pRect:rect, X1:int, Y1:int, X2:int, Y2:int),int
Declare "user32",GetCursorPos(pt:tagPOINT),int
Declare "user32",SetCursorPos(x:int,y:int),int
DECLARE "user32",mouse_event(dwFlags:int,dx:int,dy:int, cButtons:int,Info:int)
Declare "gdi32",CreateSolidBrush(crColor:int),int
Declare "gdi32",DeleteObject(hObject:int),int
Def hwnd:window:'   //Window handle
Def hdc:int:'       //HDC
Def hbrush:int:'    //HBRUSH
Def Tempx,Tempy:int:'  //Used with GetCursorPos/SetCursorPos/etc..
Def L,T,W,H:int:'      //Window coords rect also SetCursorPos/etc...
Window hwnd,0,0,400,300,@SYSMENU|@NOAUTODRAW,0,"",WndProc
Waituntil hwnd=0
End
Sub WndProc
Select @Class
Case @IDCreate:CenterWindow hwnd
Case @IDPaint
gosub CreateTitle:'     //Sub to do the drawing etc..
Case @IDCloseWindow
CloseWindow hwnd
Endselect
Return
Sub CreateTitle
hdc=GetWindowDC(hwnd):' //This returns the handel for the entire window,
'                       //instead of just the client area.
gosub DrawGradient:'    //The sub to create the fill
ReleaseDC(hwnd,hdc):'   //Frees the Direct Context
DeleteObject(hbrush):'  //Removes the long from memory
'/* When you draw on the window title you erase the buttons */
'/* This is just a work around , it presses the close window button , */
'/* then returns to where it was*/
GetCursorPos(pt)
tempx=pt.x:tempy=pt.y:'  //Holds the pt.x & pt.y varibles for later
pt.y=T+5:pt.x=W+L-15
SetCurSorPos(pt.x,pt.y):'//move to the [x]
wait 1
mouse_event(2,0,0,0,0):' //presses the [x]
wait 1
SetCursorPos(0,0):'      //0,0 for safe release
mouse_event(4,0,0,0,0):' //Releases mouse , (other wise it sticks)
pt.x=tempx:pt.y=tempy:'  //Original coords
SetCursorPos(pt.x,pt.y):'//Set coords
'/* End Main Sub */
Return
Sub DrawGradient
GetSize hwnd,L,T,W,H:'  //GetWindow size
Def band:int
Def pstep:float
pstep=W/256.00:'   //Get each rect width
For band=0 to 255:'//Number of bands (standard)
'                  //On a slow machine this could be alterd to half
'                  //& the band length is the multiplied by 2 
SetRect(rcfill,int(band*pstep),0,int((Band+1)*pstep),30):'// Where to draw
hbrush=CreateSolidBrush(rgb(0,0,(255 - Band))):'   //Blue to black
'hbrush=CreateSolidBrush(rgb(0,(255 - Band),0)):'  //Green to black
'hbrush=CreateSolidBrush(rgb((255 - Band),0,0)):'  //Red to black
FillRect(hdc,rcfill,hbrush):'                      //Do the Deed!
Next band
SetRect(rcfill,0,30,W,H):'                         //Take off the xp borders (yuck!)
hbrush=CreateSolidBrush(rgb(0,0,0)):'              //Black Brush
FillRect(hdc,rcfill,hbrush):'                      //Black BG!
Return



It might give you some idea of how to proceed .. although it's in CBasic, it can presumably be ported OK.

best wishes, :)

Graham

Tomorrow may be too late ..