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);
}
复制代码

 

 
posted @   曦花  阅读(758)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示