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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现