【问题标题】:Change border color of Rectangle function in c++在c ++中更改矩形函数的边框颜色
【发布时间】:2015-06-13 17:49:00
【问题描述】:

如何在 C++/MASM32 中更改 Rectangle function 的边框颜色?

【问题讨论】:

  • 您链接到第一行状态的文档:矩形是用当前笔勾勒出来的。所以select 是当前的pen

标签: c++ winapi mfc masm32


【解决方案1】:

您可以尝试这样的事情,我只是举个例子,您可以根据自己的要求进行更改。

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);
}

【讨论】:

    【解决方案2】:

    这是我快速为您准备的一个快速 MASM32 示例:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      相关资源
      最近更新 更多