dragon中光标绘制

dragon中的光标绘制,个人更喜欢使用control开式的,也就是自己给画上去

class OwnerDrawCaret : public ICaret
{
public:
    OwnerDrawCaret();
    ~OwnerDrawCaret();

    virtual BOOL  Create(IObject* pObj, HWND hWndParent, HBITMAP hbmp, int nWidth, int nHeight);
    virtual void  Destroy();
    virtual void  Show();
    virtual void  Hide();
    virtual void  SetPos(int x, int y);
    virtual void  OnControlPaint(IRenderTarget* p){};

//     virtual void  PreCommitWindowBuffer(HDC hMemDC){};
//     virtual void  PostCommitWindowBuffer(HDC hMemDC);

    virtual CARET_TYPE  GetType() { return CARET_TYPE_OWNERDRAW; }
    void  DoPaint();

protected:
    void  CreateTimer();
    void  DestroyTimer();

    void  SetPosBase(int x, int y);

private:
    HWND   m_hWnd;
    IObject*  m_pObject;
    POINT  m_ptLast;
    SIZE   m_sizeCaret;

    CRect  m_rcDraw;
    UINT_PTR  m_nTimerId;
    bool   m_bVisible;
};


数据成员不多,从唯一确定性上思考就是光标位置,光标大小,所属控件,是否可见,当然这里为了方便添加了m_hwnd,并且光标要闪动,那么就需要个定时器,定时器就需要有个定时器ID,对就m_nTimerid,好了,这个类还有个重要的地方就是如何绘制的

void  OwnerDrawCaret::DoPaint()
{
    if (!m_hWnd)
        return;

    if (m_rcDraw.IsRectEmpty())
        return;

    HDC hDC = GetDC(m_hWnd);
    HPEN hPen = CreatePen(PS_SOLID, 1, 0);
    HPEN hOldPen = (HPEN)::SelectObject(hDC, hPen);

    int nOld = ::SetROP2(hDC, R2_NOTXORPEN);
    ::MoveToEx(hDC, m_rcDraw.left, m_rcDraw.top, NULL);
    ::LineTo(hDC, m_rcDraw.left, m_rcDraw.bottom);
    ::SetROP2(hDC, nOld);

    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    ::ReleaseDC(m_hWnd, hDC);

    m_bVisible = !m_bVisible;
}

代码不难,在窗口的dc上进行了反色操作,但并没有画到内存图上边去




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值