有个静态文本框控件 ID在CFormView窗口中,我用
GetDlgItem(ID)->GetWindowRect(cr[i][j]);这句得到该ID的CRect,
我用鼠标点中它,就给这ID的四边画上直线,相当于给它的边框着色。
而当我拖动CFormView窗口的垂直滚动条(由于窗口较长)时,控件自然隐藏,当把控件拖出来的时候,此时,窗口会调用OnPaint这个函数来刷新屏幕,但同时,之前用于着色的边框线条也被抹去了,现在我想留下那些线条,但不知怎样弄。我重载过OnPaint函数,但当拖动滚动条时,那着色框也会跟着走,而不是随着控件的隐藏而隐藏,也不会随着控件的出现而出现。请问各位有什么建议吗?
void 
CMyProjectView::OnPaint()
{
CPaintDC dc(this);
for(int i=0;i<30;i++)
{
for(int j=0;j<8;j++)
{
if(DisplayData::allbn[i][j]==1)
refreshBTFrame(i,j);
}
}
}
这是我重载的OnPaint函数,根据鼠标是否在框内点击过而画边框 

解决方案 »

  1.   

    子类化文本框,在DrawItem里画边框
      

  2.   

    把你的refreshBTFrame的代码贴出来。
      

  3.   

    这是得到一系列的位置的代码
    CBrush brush;

    CPen pen;
    pen.CreatePen(PS_SOLID,4,RGB(249,231,35));
    CDC *pdc=this->GetDC();
    pdc->SelectObject(pen);
    CRect rectClient,treerect;
    CRgn rgn1,rgn2[30][8],treergn,rgn3[30][8],rgn4[30][8],rgn5[30][8]; GetClientRect(rectClient);
    rgn1.CreateRectRgnIndirect(rectClient); GetDlgItem(IDC_TREE_IP)->GetClientRect(treerect);
    treergn.CreateRectRgnIndirect(treerect);
    rgn1.CombineRgn(&rgn1,&treergn,RGN_XOR);
    for(int i=0;i<30;i++)
    {
    for(int j=0;j<8;j++)
    {
    ID=10000+(i+1)*10+(j+1);
    GetDlgItem(ID)->GetWindowRect(cr[i][j]);
    sid=10000+ID;
    GetDlgItem(sid)->GetWindowRect(scr[i][j]); cr[i][j].left-=6;cr[i][j].top-=77;cr[i][j].right-=6;cr[i][j].bottom-=77;
    rgn2[i][j].CreateRectRgnIndirect(cr[i][j]);
    scr[i][j].left-=6;scr[i][j].top-=77;scr[i][j].right-=6;scr[i][j].bottom-=77;
    rgn3[i][j].CreateRectRgnIndirect(scr[i][j]);
    rgn2[i][j].CombineRgn(&rgn2[i][j],&rgn3[i][j],RGN_OR);
    rgn1.CombineRgn(&rgn1,&rgn2[i][j],RGN_DIFF); if(point.x>cr[i][j].left+6&&point.x<cr[i][j].right+6&&point.y>cr[i][j].top+77&&point.y<cr[i][j].bottom+77)
    {
    if(CMyProjectApp::statue[i]==1&&GetDlgItem(ID)->IsWindowVisible())
    {
    DisplayData::allbn[i][j]=1;
    ii=i;
    jj=j;
    } }
    }
    }
    brush.CreateSolidBrush(RGB(119,159,213));
    pdc->FillRgn(&rgn1,&brush);
    brush.DeleteObject();
    refreshBTFrame(ii,jj);
    CFormView::OnLButtonDown(nFlags, point);
    //////////////////////////////////////////////////////////////画边框的代码//////////////////////
    void 
    CMyProjectView::refreshBTFrame(int m_num, int b_num)
    {
    CPen pen;
    pen.CreatePen(PS_SOLID,4,RGB(249,231,35));
    CDC *pdc=this->GetDC();
    pdc->SelectObject(pen);
    pdc->MoveTo( cr[m_num][b_num].left-2, cr[m_num][b_num].top-4);
    pdc->LineTo(scr[m_num][b_num].left-2, cr[m_num][b_num].top-4);
    pdc->MoveTo(scr[m_num][b_num].right+2,cr[m_num][b_num].top-4);
    pdc->LineTo( cr[m_num][b_num].right+2,cr[m_num][b_num].top-4);
    pdc->LineTo( cr[m_num][b_num].right+2,cr[m_num][b_num].bottom+4);
    pdc->LineTo(scr[m_num][b_num].right+2,cr[m_num][b_num].bottom+4);
    pdc->MoveTo(scr[m_num][b_num].left-2, cr[m_num][b_num].bottom+4);
    pdc->LineTo( cr[m_num][b_num].left-2, cr[m_num][b_num].bottom+4);
    pdc->LineTo( cr[m_num][b_num].left-2, cr[m_num][b_num].top-4);
    ReleaseDC(pdc);
    }
      

  4.   

    RECT rect;
    ::GetWindowRect(::GetDlgItem(m_hWnd,IDC_EDIT),&rect);
    ::Rectangle(::GetDlgItem(m_hWnd,IDC_EDIT)),rect.left,rect.top,rect.right,rect.bottom);
    这样就可以给文本框控件加边框边框。
      

  5.   

    GetWindowRect获取的矩形是屏幕坐标的,要在窗口中使用需要转换为客户坐标:ScreenToClient