【VC】 滚动对话框,控件刷新问题。。。

shen_wei 2018-05-25 09:33:03
加精


如果所示,分别建立自绘按钮和标准控件,当子对话框不需要滚动时,显示都是正常。

滚动时,则自绘按钮出现了背景错误。。刷新对应按钮控件也是无法刷新!!



附上工程的一个Demo例子。。。烦请各位帮忙测试下!!!


链接:https://share.weiyun.com/5AD77HE 密码:m39759
...全文
3301 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2018-06-01
  • 打赏
  • 举报
回复
问题在于 窗口 DC ,只有在 窗口 内 有效 。
hurryboylqs 2018-05-31
  • 打赏
  • 举报
回复
这种问题用dui比较好解决,传统窗口控件不好解决的。
schlafenhamster 2018-05-29
  • 打赏
  • 举报
回复
如 SetTimer(0,50,0); void CScrollDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default KillTimer(0); SendMessage(WM_VSCROLL,MAKELONG(SB_LINEDOWN,0),0); afxDump << m_nScrollPos << "\n"; CDialog::OnTimer(nIDEvent); }
schlafenhamster 2018-05-29
  • 打赏
  • 举报
回复
临时解决 可以 初始化 时 把 按钮 3 滚动到 客户区 里 。
schlafenhamster 2018-05-29
  • 打赏
  • 举报
回复
所以 还是 那句话 ” 取 按钮 父窗口的 背景 ,自己 重绘 按钮 背景 !”
shen_wei 2018-05-29
  • 打赏
  • 举报
回复
引用 33 楼 schlafenhamster 的回复:
下面的代码 可以 测试 背景图:
void AbstractPaint::OnPaint(CDC &dc)
{
UINT id=GetDlgCtrlID(m_pWnd->m_hWnd);
if (!m_bInited)
{// only ownce !
m_pWnd->GetClientRect(&m_canvasRect);
/* 初始化缓存 */
m_canvasDC.CreateCompatibleDC(&dc);
m_canvasBitmap.CreateCompatibleBitmap(&dc, m_canvasRect.Width(), m_canvasRect.Height());
m_canvasDC.SelectObject(&m_canvasBitmap);
m_canvasDC.BitBlt(0, 0, m_canvasRect.Width(),m_canvasRect.Height(),
&dc,m_canvasRect.left,m_canvasRect.top, SRCCOPY);
if(id==1002)
{
#if 1
OpenClipboard(0);
EmptyClipboard();
SetClipboardData(CF_BITMAP,m_canvasBitmap);
CloseClipboard();
#endif
afxDump << id << "\n";
}
。。。。。。

打开 微软画图, 黏贴一下 可以看到 。
发现 只有 按钮3 全部进入 客户区 , 背景就是对的 !




调试结果和部分代码。。因为没有ScrollWindoow时,Test3 的按钮坐标是隐藏,相对应整体界面,正好是主界面背景,

如果正确绘制,则需要子对话框背景图,再次重新绘制。 ,本人尝试过在需要重绘时,传入子对话框背景图,取Test3 对应位置的背景图,则绘制成功。

CRect ClientRC,WindowRC;
CDC MemDC;
CBitmap Bmp;
Bmp.LoadBitmap(IDB_BITMAP_CHILD); //子对话框背景图

MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(Bmp);

m_pWnd->GetClientRect(ClientRC); //子控制相对位置
GetWindowRect(m_pWnd->m_hWnd,WindowRC);
m_pWnd->GetParent()->ScreenToClient(WindowRC);

m_canvasDC.CreateCompatibleDC(&MemDC); //子对话框大小的背景图
m_canvasBitmap.CreateCompatibleBitmap(&MemDC, ClientRC.Width(), ClientRC.Height());
m_canvasDC.SelectObject(&m_canvasBitmap);
m_canvasDC.BitBlt(0, 0, ClientRC.Width(), ClientRC.Height(), &MemDC, WindowRC.left, WindowRC.top, SRCCOPY);
Bmp.DeleteObject();






shen_wei 2018-05-29
  • 打赏
  • 举报
回复
引用 31 楼 schlafenhamster 的回复:
18楼帖子 说的就是 “通过ScrollWindows时,自绘控件才会开始自绘“
程序 一运行 ,点 "scrolldown" (不要拖滑块!)就没有 问题 ! 请查明 原因!


确定这样的功能能OK?? 既然有滑块功能用户当然可以任意使用各种方式(拖动,点击,鼠标滚动)

探讨只是获取更多的知识和方法。。多谢您老一直的解答,方法不是死的,最后的结果和功能确实死的!!






引用 32 楼 VisualEleven 的回复:
还没有解决吗?


只是对本帖的谈论。。那种方法解决也是很笨,如果按钮太多也是很费时的,费资源的!!

网上看到的滚动界面都是 单色背景(单颜色画刷),根本没有背景图。假设滚动界面高度1000,ScrollWindow 时,背景图的高度也得1000,所以问题还是多多的。


schlafenhamster 2018-05-29
  • 打赏
  • 举报
回复
下面的代码 可以 测试 背景图: void AbstractPaint::OnPaint(CDC &dc) { UINT id=GetDlgCtrlID(m_pWnd->m_hWnd); if (!m_bInited) {// only ownce ! m_pWnd->GetClientRect(&m_canvasRect); /* 初始化缓存 */ m_canvasDC.CreateCompatibleDC(&dc); m_canvasBitmap.CreateCompatibleBitmap(&dc, m_canvasRect.Width(), m_canvasRect.Height()); m_canvasDC.SelectObject(&m_canvasBitmap); m_canvasDC.BitBlt(0, 0, m_canvasRect.Width(),m_canvasRect.Height(), &dc,m_canvasRect.left,m_canvasRect.top, SRCCOPY); if(id==1002) { #if 1 OpenClipboard(0); EmptyClipboard(); SetClipboardData(CF_BITMAP,m_canvasBitmap); CloseClipboard(); #endif afxDump << id << "\n"; } 。。。。。。 打开 微软画图, 黏贴一下 可以看到 。 发现 只有 按钮3 全部进入 客户区 , 背景就是对的 !
Eleven 2018-05-29
  • 打赏
  • 举报
回复
还没有解决吗?
schlafenhamster 2018-05-29
  • 打赏
  • 举报
回复
说了 一大堆 还是 没有 解决 问题 ! 参考 18楼 的 帖子 !
schlafenhamster 2018-05-29
  • 打赏
  • 举报
回复
18楼帖子 说的就是 “通过ScrollWindows时,自绘控件才会开始自绘“ 程序 一运行 ,点 "scrolldown" (不要拖滑块!)就没有 问题 ! 请查明 原因!
shen_wei 2018-05-29
  • 打赏
  • 举报
回复
引用 28 楼 schlafenhamster 的回复:
为什么
void Button::OnInitDc(CDC &canvasDC, Graphics *pgraph)
{
是空的 ?
}

它应该是按钮擦除时 要用到的按钮背景!




ChildDlg 对话框 WS_CLIPCHILDREN 属性为 False 按钮 WS_EX_TRANSPARENT 属性为 False

这样对话框的背景色就是子对话框背景了。。

void Button::OnInitDc(CDC &canvasDC, Graphics *pgraph) 是虚函数,全程代码都没有使用。

对于自绘控件,当子界面被隐藏时,控件根本不会自绘,通过ScrollWindows时,自绘控件才会开始自绘。





schlafenhamster 2018-05-28
  • 打赏
  • 举报
回复
WS_EX_TRANSPARENT 的真正含义是 : // If a WS_EX_TRANSPARENT window needs to be painted, // and it has any non-WS_EX_TRANSPARENT windows siblings // (which belong to the same process) which also need to be painted, // then the window manager will paint the non-WS_EX_TRANSPARENT windows first. // That "lets the other windows paint first" behavior is // what gave the style its name, because if you let the other windows paint first, // and then you paint on top of it, then the parts you don't actually paint // will appear to be transparent because the other windows' pixels will show through. 嗯
shen_wei 2018-05-28
  • 打赏
  • 举报
回复


1、按钮背景透明
2、按钮背景不透明

引用 23 楼 schlafenhamster 的回复:
我 通常 不使用 WS_EX_TRANSPARENT 属性,因为它 不是 真正的 透明 !
我 通常 取 按钮 父窗口的 背景 ,自己 重绘 按钮 背景 !
你把 按钮的 WS_EX_TRANSPARENT 属性 去掉 看看 是背景是什么
schlafenhamster 2018-05-28
  • 打赏
  • 举报
回复
我 通常 不使用 WS_EX_TRANSPARENT 属性,因为它 不是 真正的 透明 ! 我 通常 取 按钮 父窗口的 背景 ,自己 重绘 按钮 背景 ! 你把 按钮的 WS_EX_TRANSPARENT 属性 去掉 看看 是背景是什么
schlafenhamster 2018-05-28
  • 打赏
  • 举报
回复
隐藏的按钮 不会 重绘 , void Button::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); int id=lpDIS->CtlID; afxDump << id << "\n"; if(id==IDC_BUTTON_TEST3) {// 1002 } 一开始 1002 不可见,DrawItem 看不到 1002
shen_wei 2018-05-28
  • 打赏
  • 举报
回复
引用 17 楼 hurryboylqs 的回复:
一个CButton类的自绘弄成这样也是太费力了,还CtlColor都响应 HBRUSH Button::CtlColor(CDC* pScreenDC, UINT nCtlColor) { AbstractPaint::OnPaint(*pScreenDC); return NULL; } 一句话你的问题在Button的自绘上,不用DrawItem的话就响应Button的OnPain里绘制就完事了,代码乱得...
代码都无法完美,都是慢慢完善的。。能解决问题和功能,也许就可以!!不是每个码农 都是微软级别,写完代码都无法挑剔。。
shen_wei 2018-05-28
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
其实就是重绘时,没有正确的按钮背景,获取Button3的坐标,其实隐藏的坐标,相当于TestDlg的界面,所有按钮背景就会出现错误!!! 这就是滚动界面绘制时的问题,重绘时,背景坐标是全界面的坐标!!!类似界面隐藏截图时,隐藏的部分都是黑色。。。
schlafenhamster 2018-05-28
  • 打赏
  • 举报
回复
为什么 void Button::OnInitDc(CDC &canvasDC, Graphics *pgraph) { 是空的 ? } 它应该是按钮擦除时 要用到的按钮背景!
schlafenhamster 2018-05-28
  • 打赏
  • 举报
回复
"2、按钮背景不透明" 不透明 按钮 有 自己的 背景, 为什么 显示的 是 主对话框的 背景 ?
加载更多回复(18)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧