VC中MFC视图中建立的其它控件,单击时这些控件的界面会显示到文本框的位置上 40C

#define IDC_START_DT 10016
#define IDC_END_DT 10017
#define IDC_OPERATOR_COMB 10018
#define IDC_CARTYPE_COMB 10019
#define IDC_MIANFIE_EDT 10020
#define IDC_CHANNEL_COMB 10021

//控件定义
CDateTimeCtrl m_StartDt;
CDateTimeCtrl m_EndDt;
CComboBox m_OperatorComb;
CComboBox m_CarTypeComb;
CEdit m_MianFeiEdt;
CComboBox m_ChannelComb;
CMyListCtrl m_ListCtr;

在view上动态建立控件
int CReportView::OnCreate(LPCREATESTRUCT lpCreateStruct) 

{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here


//生成开始时间
if(!m_StartDt.Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP | DTS_LONGDATEFORMAT,CRect(0,0,0,0), this, IDC_START_DT))
{
    return FALSE;
}

//生成结束时间
if(!m_EndDt.Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP | DTS_LONGDATEFORMAT,CRect(0,0,0,0), this, IDC_END_DT))
{
    return FALSE;
}

//生成操作员下拉框
if(!m_OperatorComb.Create(CBS_DROPDOWNLIST | WS_VISIBLE |
    WS_TABSTOP | WS_VSCROLL, CRect(0,0,0, 0), this, IDC_OPERATOR_COMB))
{
    return FALSE;
}

//生成车类型下拉框
if(!m_CarTypeComb.Create(CBS_DROPDOWNLIST | WS_VISIBLE |
    WS_TABSTOP | WS_VSCROLL, CRect(0,0,0, 0), this, IDC_CARTYPE_COMB))
{
    return FALSE;
}

//生成通道号下拉框
if(!m_ChannelComb.Create(CBS_DROPDOWNLIST | WS_VISIBLE |
    WS_TABSTOP | WS_VSCROLL, CRect(0,0,0, 0), this, IDC_CHANNEL_COMB))
{
    return FALSE;
}


//生成免费编辑框
if(!m_MianFeiEdt.Create(ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
    CRect(0,0,0, 0), this, IDC_MIANFIE_EDT))
{
    return FALSE;
}

return 0;

}

//改变控件位置
void CReportView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if(IsWindow(m_StartDt))//开始时间
{   
    CRect   rc(65, 1, 235, 24);   
    m_StartDt.MoveWindow(rc); 
}

if(IsWindow(m_EndDt))//结束时间   
{   
    CRect   rc(290, 1, 460, 24);   
    m_EndDt.MoveWindow(rc); 
}

if(IsWindow(m_OperatorComb))   
{   
    CRect   rc(505, 2, 565, 250);   
    m_OperatorComb.MoveWindow(rc); 
    m_OperatorComb.SetItemHeight(-1, 16);
}

if(IsWindow(m_CarTypeComb))   
{   
    CRect   rc(610, 2,670, 250);   
    m_CarTypeComb.MoveWindow(rc); 
    m_CarTypeComb.SetItemHeight(-1, 16);
}

if(IsWindow(m_ChannelComb))//道口   
{   
    CRect   rc(700, 2,805, 250);   
    m_ChannelComb.MoveWindow(rc); 
    m_ChannelComb.SetItemHeight(-1, 16);
}

if(IsWindow(m_MianFeiEdt))//免费大于   
{   
    CRect   rc(860, 1, 1110, 24);   
    m_MianFeiEdt.MoveWindow(rc); 
}


if(IsWindow(m_ListCtr))   
{   
    CRect   rc(1,26,cx,cy-25);   
    m_ListCtr.MoveWindow(rc); 
}

}

//初始化控件
void CReportView::OnInitialUpdate()
{
CView::OnInitialUpdate();
m_StartDt.SetFormat(L"yyy-MM-dd HH:mm:ss");
m_EndDt.SetFormat(L"yyy-MM-dd HH:mm:ss");
COleDateTime tmEnd = COleDateTime::GetCurrentTime();
COleDateTime tmStart = tmEnd - COleDateTimeSpan(1,0,0,0);
m_StartDt.SetTime(tmStart);
m_EndDt.SetTime(tmEnd);

    m_OperatorComb.AddString(L"所有");
    m_OperatorComb.AddString(L"1");
    m_OperatorComb.AddString(L"2");
    m_OperatorComb.AddString(L"3");
    m_OperatorComb.SetCurSel(0);

    m_CarTypeComb.AddString(L"所有");
    m_CarTypeComb.AddString(L"临时车");
    m_CarTypeComb.AddString(L"固定车");
    m_CarTypeComb.SetCurSel(0);

    m_ChannelComb.AddString(L"所有");
    m_ChannelComb.AddString(L"名诚大楼出口1");
    m_ChannelComb.AddString(L"名诚大楼出口2");


    m_MianFeiEdt.SetWindowText(L"");

void CReportView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here

//以下为画工具条背景图片
CBitmap hbitmap;
hbitmap.LoadBitmap(IDB_16TOOLBARBK);

CDC Medc;
Medc.CreateCompatibleDC(pDC);

Medc.SelectObject(hbitmap);
BITMAP bmp;  
hbitmap.GetBitmap(&bmp);

CRect DrawRect;
GetWindowRect(DrawRect);
ScreenToClient(DrawRect);
DrawRect.bottom = 26;
pDC->StretchBlt(DrawRect.left,DrawRect.top,DrawRect.Width(),DrawRect.Height(),&Medc,
    0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

CFont   font;   
VERIFY(font.CreatePointFont(100,   L"宋体",   pDC));   
CFont*   def_font   =   pDC->SelectObject(&font); 
pDC->SetBkMode(TRANSPARENT);
if(m_ReportType ==SHOW_REPORT_OPERATOR_FEE)//操作员收费查询报表
{
    pDC->TextOut(10,7,L"开始时间"); 
    pDC->TextOut(235,7,L"结束时间");
    pDC->TextOut(460,7,L"操作员");
    pDC->TextOut(565,7,L"车类型");
    pDC->TextOut(670,7,L"道口");
    pDC->TextOut(805,7,L"免费大于");
}
else
{
    pDC->TextOut(10,7,L"排序字段"); 
    pDC->TextOut(255,7,L"排序方式"); 
}

pDC->SelectObject(def_font);   
font.DeleteObject(); 

}

BOOL CReportView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default

CBrush backBrush(RGB(200,220,255));
// 保存旧刷子
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect);     // 擦除所需的区域
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;

}

以上为刷新代码,onpaint没重载

程序运行后,在视图上点击时间控件或从下拉框中选择某项后,当鼠标移动到最后面的文本框上时,不知为何会在文本框的位置会显示时间控件或下拉框上的界面内容?图片说明但当鼠标点击了文本框时,仍可在文本框中输入内容。

3个回答

贴出的代码看不出问题。这个问题应该从刷新方面查找原因,比如Onpaint、OnEraseBkgnd等

你子控件是CListView为父窗口创建的,你的父窗口位置发生变化,即各个ITEM的位置/大小发生了改变的时候,你的这些个子控件ComboBox也需要跟着调整(MoveWindow/SetWindowPos())

guanyuqi
guanyuqi 谢谢您的谢心回答,能否说的再详细点啊?这些子控件在 void CReportView::OnSize(UINT nType, int cx, int cy) 里不已经自动调整了吗?类CReportView是从CView中继承来的。您说的“你的子控件是CListView为父窗口创建的”这句话如何理解啊?
大约 2 年之前 回复

意思就是你的CListCtrl中每个ITEM的位置变化了,你的这些下拉列表CComboBox/Edit也要跟着变化~

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐