取消控件外围的框

ZOU_SEAFARER 2008-12-26 07:25:56
		
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 {

}

上面是我写的一个控件,当控件被选择的时候,外围被画上指定颜色的边框,当控件取消选择的时候(比如焦点离开)怎么把外面的框去掉呢,请高手帮忙!
如果单纯的吧控件的背景从新加载一边的话,不适合我的控件,我的想法就是最好修改外围的框为初始没有框的那个样子!


...全文
130 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZOU_SEAFARER 2008-12-27
  • 打赏
  • 举报
回复
问题解决了!
我是这样的,

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 画框,假的时候框就被取消了,请知道的大哥给解析解析吧
oyljerry 2008-12-26
  • 打赏
  • 举报
回复
在OnPaint中等,判断是不是失去焦点等,然后来画不画边框等...
cnzdgs 2008-12-26
  • 打赏
  • 举报
回复
响应WM_PAINT消息绘制控件,绘制时根据控件的状态来确定要不要绘制边框,改变控件状态时调用Invalidate刷新控件。
Tinary3v0 2008-12-26
  • 打赏
  • 举报
回复
一般是这样的:
1.在OnPaint或绘制控件的部分 直接使用你上面的代码去绘制 但是前面要加上条件 比如:UINT ISFOCUS;
在绘制的时候判断:
if( ISFOCUS == 1 )
{
//绘制选中状态
}else if( ISFOCUS == 2 )
{
//绘制其他可能状态
}else{
//绘制正常状态
}

2.在其他位置改变ISFOCUS的值 当获得焦点的时候ISFOCUS=1,失去焦点的时候ISFOCUS =0;
3.设定了ISFOCUS以后需要更新控件才能显示效果 所以在ISFOCUS改变的地方使用Invalidate 为了避免闪烁
ISFOCUS发生变化的时候也可以使用内存绘图 这样就可以避免使用Invalidate了。
ilovedrv 2008-12-26
  • 打赏
  • 举报
回复
用异或笔绘制

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧