CPen* pOldPen;
int lineSize_x, lineSize_y;
             if( m_SelectMode == TRUE ){
lineSize_x = rcBounds.Size().cx  ;
lineSize_y = rcBounds.Size().cy ;
CPen fSelectPen( PS_SOLID, LINE_WIDTH, LINE_COLOR);
pOldPen = pdc->SelectObject( &fSelectPen );
pdc->MoveTo( rcBounds.left + 1, rcBounds.top + 1 );
pdc->LineTo( rcBounds.left + lineSize_x - 1, rcBounds.top + 1 );
pdc->MoveTo( rcBounds.right - lineSize_x, rcBounds.top + 1 );
pdc->LineTo( rcBounds.right - LINE_WIDTH + 1, rcBounds.top + 1 );
pdc->LineTo( rcBounds.right - LINE_WIDTH + 1, rcBounds.top + lineSize_y - 1 );
pdc->MoveTo( rcBounds.right - LINE_WIDTH + 1, rcBounds.bottom - lineSize_y );
pdc->LineTo( rcBounds.right - LINE_WIDTH + 1, rcBounds.bottom - LINE_WIDTH + 1 );
pdc->LineTo( rcBounds.right - lineSize_x, rcBounds.bottom - LINE_WIDTH + 1 );
pdc->MoveTo( rcBounds.left + lineSize_x - 1, rcBounds.bottom - LINE_WIDTH + 1 );
pdc->LineTo( rcBounds.left + 1, rcBounds.bottom - LINE_WIDTH + 1 );
pdc->LineTo( rcBounds.left + 1, rcBounds.bottom - lineSize_y );
pdc->MoveTo( rcBounds.left + 1, rcBounds.top + lineSize_y - 1 );
pdc->LineTo( rcBounds.left + 1, rcBounds.top + 1 );
pdc->SelectObject( pOldPen );
   
}
else { }上面是我写的一个控件,当控件被选择的时候,外围被画上指定颜色的边框,当控件取消选择的时候(比如焦点离开)怎么把外面的框去掉呢,请高手帮忙!
如果单纯的吧控件的背景从新加载一边的话,不适合我的控件,我的想法就是最好修改外围的框为初始没有框的那个样子!

解决方案 »

  1.   

    一般是这样的:
    1.在OnPaint或绘制控件的部分 直接使用你上面的代码去绘制 但是前面要加上条件 比如:UINT ISFOCUS;
    在绘制的时候判断:
       if( ISFOCUS == 1 )
       {
           //绘制选中状态
       }else if( ISFOCUS == 2 )
       {
           //绘制其他可能状态
       }else{
           //绘制正常状态
       }
    2.在其他位置改变ISFOCUS的值 当获得焦点的时候ISFOCUS=1,失去焦点的时候ISFOCUS =0;
    3.设定了ISFOCUS以后需要更新控件才能显示效果 所以在ISFOCUS改变的地方使用Invalidate 为了避免闪烁
     ISFOCUS发生变化的时候也可以使用内存绘图 这样就可以避免使用Invalidate了。
      

  2.   

    响应WM_PAINT消息绘制控件,绘制时根据控件的状态来确定要不要绘制边框,改变控件状态时调用Invalidate刷新控件。
      

  3.   

    在OnPaint中等,判断是不是失去焦点等,然后来画不画边框等...
      

  4.   

    问题解决了!
    我是这样的,
                     int lineSize_x, lineSize_y;
                  if( m_SelectMode == TRUE ){
    lineSize_x = rcBounds.Size().cx ;
    lineSize_y = rcBounds.Size().cy ;
    CPen fSelectPen( PS_SOLID, LINE_WIDTH, LINE_COLOR01);
    pOldPen = pdc->SelectObject( &fSelectPen );
    pdc->MoveTo( rcBounds.left + 1, rcBounds.top + 1 );
    pdc->LineTo( rcBounds.left + lineSize_x - 1, rcBounds.top + 1 );
    pdc->MoveTo( rcBounds.right - lineSize_x, rcBounds.top + 1 );
    pdc->LineTo( rcBounds.right - LINE_WIDTH + 1, rcBounds.top + 1 );
    pdc->LineTo( rcBounds.right - LINE_WIDTH + 1, rcBounds.top + lineSize_y - 1 );
    pdc->MoveTo( rcBounds.right - LINE_WIDTH + 1, rcBounds.bottom - lineSize_y );
    pdc->LineTo( rcBounds.right - LINE_WIDTH + 1, rcBounds.bottom - LINE_WIDTH + 1 );
    pdc->LineTo( rcBounds.right - lineSize_x, rcBounds.bottom - LINE_WIDTH + 1 );
    pdc->MoveTo( rcBounds.left + lineSize_x - 1, rcBounds.bottom - LINE_WIDTH + 1 );
    pdc->LineTo( rcBounds.left + 1, rcBounds.bottom - LINE_WIDTH + 1 );
    pdc->LineTo( rcBounds.left + 1, rcBounds.bottom - lineSize_y );
    pdc->MoveTo( rcBounds.left + 1, rcBounds.top + lineSize_y - 1 );
    pdc->LineTo( rcBounds.left + 1, rcBounds.top + 1 );
    pdc->SelectObject( pOldPen );
       
    }不知道为何,m_SelectMode == TRUE 画框,假的时候框就被取消了,请知道的大哥给解析解析吧