MFC,movewindow显示不出来按钮问题--ScreenToClient(rect)

1、CRect rtCtrl;

rtCtrl位置可能不在对话框内。

 

2、在BOOL CDlgXXX::OnInitDialog()

中运用了m_btnClose_.MoveWindow(rtCtrl);

会相应对话框的void CDlgXXX::OnSize(UINT nType, int cx, int cy)又把按钮位置改变了,所以看不到按钮显示。。。

解决办法:

BOOL CDlgXXX::OnInitDialog()
{
    CBCGPDialog::OnInitDialog();
    SetBackgroundColor(RGB(255, 255, 255));

    //m_btnReset_.m_nFlatStyle = CBCGPButton::FlatStyle::BUTTONSTYLE_NOBORDERS;
    //m_btnOK_.m_nFlatStyle = CBCGPButton::FlatStyle::BUTTONSTYLE_NOBORDERS;
    //m_btnClose_.m_nFlatStyle = CBCGPButton::FlatStyle::BUTTONSTYLE_NOBORDERS;

    InitData();

    return TRUE;
}

void CXXX::InitUI()
{
    if (NULL == m_btnReset_.m_hWnd)
    {
        return;
    }

    CRect rtClient;
    GetClientRect(rtClient);

    int BTN_WIDTH = 50;
    CRect rtCtrl;    
    rtCtrl.bottom = rtClient.bottom - 5;
    rtCtrl.top = rtCtrl.bottom - 30;    
    rtCtrl.right = rtClient.right - SPACE;
    rtCtrl.left = rtCtrl.right - BTN_WIDTH;    
    m_btnClose_.MoveWindow(rtCtrl);

    rtCtrl.right = rtCtrl.left - SPACE;
    rtCtrl.left = rtCtrl.right - BTN_WIDTH;
    m_btnOK_.MoveWindow(rtCtrl);

    rtCtrl.right = rtCtrl.left - SPACE;
    rtCtrl.left = rtCtrl.right - BTN_WIDTH;
    m_btnReset_.MoveWindow(rtCtrl);    
}

void CXXX::OnSize(UINT nType, int cx, int cy)
{
    CBCGPDialog::OnSize(nType, cx, cy);
    InitUI();
}
    这句话很重要
if (NULL == m_btnReset_.m_hWnd) { return; }

这样按钮就能显示了


这里initData里是动态加载按钮的一个例子,根据按钮的位置,修改对话框的大小
void CDlgXXX::InitData()
{
    vector<combo_data> items;
    m_zj_libmgr->get_all_packages(items);

    if (items.size() <= 0)
    {
        return;
    }
    CRect rtClient;
    GetWindowRect(rtClient);
    CRect rtPos = rtClient;
    m_old_package_ = m_package;
    UINT btnId = BTN_ID_BEGIN;
    const int ITEM_HEIGHT = 22;
    UINT nStyle = BS_AUTORADIOBUTTON | BS_PUSHLIKE | WS_GROUP | WS_VISIBLE | BS_CENTER;
    CRect rtCtrl;
    rtCtrl.top = rtPos.top + SPACE;
    rtCtrl.bottom = rtCtrl.top + ITEM_HEIGHT;
    rtCtrl.left = SPACE;
    rtCtrl.right = rtCtrl.left + ITEM_WIDTH;
    CButtonItem *pBtnItem = new CButtonItem();
    pBtnItem->Create(items[0].cName, nStyle, rtCtrl, this, btnId);
    pBtnItem->SetData(items[0].cCode);
    m_map_btns_.insert(make_pair(btnId,  pBtnItem));
    rtPos.bottom = rtCtrl.bottom;

    if (items[0].cCode == m_package.cCode)
    {
        pBtnItem->SetCheck(1);
    }

    int count = items.size();
    for (int i = 1; i < count; ++i)
    {
        ++btnId;
        if (i % LINE_COUNT == 0)
        {                
            rtCtrl.top = rtCtrl.bottom + SPACE;
            rtCtrl.bottom = rtCtrl.top + ITEM_HEIGHT;
            rtCtrl.left = SPACE;
            rtCtrl.right = rtCtrl.left + ITEM_WIDTH;

            rtPos.bottom = rtCtrl.bottom;
        }
        else
        {
            rtCtrl.left = rtCtrl.right + SPACE;
            rtCtrl.right = rtCtrl.left + ITEM_WIDTH;
        }

        pBtnItem = new CButtonItem();
        pBtnItem->Create(items[i].cName, nStyle, rtCtrl, this, btnId);
        pBtnItem->SetData(items[i].cCode);
        m_map_btns_.insert(make_pair(btnId,  pBtnItem));
        if (items[i].cCode == m_package.cCode)
        {
            pBtnItem->SetCheck(1);
        }
    }

    rtClient.bottom = rtPos.bottom + SPACE + 100;
    MoveWindow(rtClient);
}
 
原文地址:https://www.cnblogs.com/XiHua/p/12095082.html