Change border color of Rectangle function in c++

3.8k views Asked by At

How i can change border color of Rectangle function in C++/MASM32?

2

There are 2 answers

0
Gunner On

Here is a quick MASM32 example that I whipped up quick for you:

include masm32rt.inc

RGB MACRO red, green, blue
    EXITM % blue SHL 16 + green SHL 8 + red
ENDM

WIDTH_MAIN_WINDOW       equ 550
HEIGHT_MAIN_WINDOW      equ 300

.data
szWndClsMain            BYTE    "RECT_MAIN", 0
szAppName               BYTE    "Rectangle Border Color Example", 0

.code
start:

    call    StartUp

    push    0
    call    ExitProcess

StartUp proc uses ebx
LOCAL   msg:MSG
LOCAL   hInst, hMain:DWORD
    push    NULL
    call    GetModuleHandle
    mov     hInst, eax    

    call    RegisterClasses

    ; ##### Coords to center window
    invoke  GetSystemMetrics, SM_CXSCREEN
    sub     eax, WIDTH_MAIN_WINDOW
    shr     eax, 1
    xchg    eax, ebx 

    invoke  GetSystemMetrics, SM_CYSCREEN
    sub     eax, HEIGHT_MAIN_WINDOW
    shr     eax, 1

    ; ##### Create main window
    invoke  CreateWindowEx,WS_EX_APPWINDOW or WS_EX_CONTROLPARENT, \
                            offset szWndClsMain, \
                            offset szAppName, \
                            WS_OVERLAPPED or WS_SYSMENU or WS_MINIMIZEBOX or WS_CLIPCHILDREN or WS_VISIBLE, \
                            ebx, eax, \
                            WIDTH_MAIN_WINDOW, HEIGHT_MAIN_WINDOW, \
                            HWND_DESKTOP, NULL, \
                            hInst, NULL
    mov     hMain, eax  

    .WHILE TRUE
        invoke GetMessage, ADDR msg,NULL,0,0
        .BREAK .IF (!eax)
        invoke IsDialogMessage, addr hMain, ADDR msg
        .IF eax ==FALSE
            invoke TranslateMessage, ADDR msg
            invoke DispatchMessage, ADDR msg
        .ENDIF
    .ENDW
    ret  
StartUp endp

RegisterClasses proc
LOCAL wc:WNDCLASSEX

    ; ##### Create main window
    invoke  RtlZeroMemory, addr wc, sizeof WNDCLASSEX
    mov     wc.cbSize, SIZEOF WNDCLASSEX       
    mov     wc.style, CS_HREDRAW or CS_VREDRAW 
    mov     wc.lpfnWndProc, OFFSET ProcWndMain    
    mov     wc.hInstance, esi                       
    mov     wc.hbrBackground, COLOR_3DFACE + 1 
    mov     wc.lpszClassName, OFFSET szWndClsMain
    invoke  RegisterClassEx, addr wc   

    ret
RegisterClasses endp

ProcWndMain proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL   ps:PAINTSTRUCT, pOldPen, pNewPen:DWORD

    mov     eax,uMsg
    .if eax==WM_CREATE

    .elseif eax == WM_PAINT
        invoke  BeginPaint, hWin, addr ps

        invoke  CreatePen,PS_SOLID, 3, RGB(255, 0, 0)     ; Red
        mov     pNewPen, eax

        invoke  SelectObject, ps.hdc, eax
        mov     pOldPen, eax

        invoke  Rectangle, ps.hdc, 10, 10, 200, 200

        invoke  SelectObject, ps.hdc, pOldPen
        invoke  DeleteObject, pNewPen

        invoke  CreatePen,PS_SOLID, 3, RGB(0,0,255)      ; blue
        mov     pNewPen, eax

        invoke  SelectObject, ps.hdc, eax
        mov     pOldPen, eax

        invoke  Rectangle, ps.hdc, 250, 10, 445, 200

        invoke  SelectObject, ps.hdc, pOldPen
        invoke  DeleteObject, pNewPen        


        invoke EndPaint, hWin, addr ps

    .elseif eax==WM_CLOSE 
        invoke DestroyWindow,hWin
    .elseif eax==WM_DESTROY
        invoke PostQuitMessage,NULL
    .else
        invoke DefWindowProc,hWin,uMsg,wParam,lParam
        ret
    .endif
    xor    eax,eax
    ret
ProcWndMain endp        
end start

enter image description here

0
Himanshu On

you can try something like this, I am just just giving example you can change it according to your requirement.

BOOL CRectangleDlg::OnEraseBkgnd(CDC* pDC)
{
    CBrush brushBlue(RGB(0, 0, 255));// inner color blue.
   CBrush* pOldBrush = pDC->SelectObject(&brushBlue);

   // create and select a thick, black pen
   CPen penBlack;
   penBlack.CreatePen(PS_SOLID, 3, RGB(255, 0, 0));// red color with width 3
   CPen* pOldPen = pDC->SelectObject(&penBlack);

   // get our client rectangle
   CRect rect;
   GetClientRect(rect);// pass rect coordinates here

   // shrink our rect 20 pixels in each direction
   rect.DeflateRect(20, 20);

   // draw a thick black rectangle filled with blue

   pDC->Rectangle(rect);

   // put back the old objects
   pDC->SelectObject(pOldBrush);
   pDC->SelectObject(pOldPen);

    return true;//CDialog::OnEraseBkgnd(pDC);
}